forked from Mirrors/openclonk
100 lines
3.3 KiB
C
100 lines
3.3 KiB
C
/*-- Kill logs --*/
|
|
|
|
func Initialize()
|
|
{
|
|
// Only one at a time.
|
|
if (ObjectCount(Find_ID(GetID())) > 1)
|
|
return RemoveObject();
|
|
}
|
|
|
|
public func Activate(int plr)
|
|
{
|
|
MessageWindow(GetProperty("Description"), plr);
|
|
return true;
|
|
}
|
|
|
|
func OnClonkDeath(object clonk, int killed_by)
|
|
{
|
|
var plr = clonk->GetOwner();
|
|
// Only log for existing players and clonks.
|
|
if (plr == NO_OWNER || !GetPlayerName(plr) || !clonk)
|
|
return;
|
|
ScheduleCall(this, "OnClonkDeathEx", 1, 0, clonk, plr, killed_by);
|
|
return _inherited(clonk, killed_by, ...);
|
|
}
|
|
|
|
// parameters: clonk, owner, killed_by
|
|
global func GetAdditionalPlayerRelaunchString(){return _inherited(...);} // dummy
|
|
|
|
func OnClonkDeathEx(object clonk, int plr, int killed_by)
|
|
{
|
|
if(!GetPlayerName(plr)) return;
|
|
var name="Clonk";
|
|
if(clonk) name=clonk.Prototype->GetName();
|
|
// Assert there are three StringTbl entries for each.
|
|
var which_one = Random(3) + 1;
|
|
var log="";
|
|
if (!GetPlayerName(killed_by))
|
|
log=Format(Translate(Format("KilledByGaia%d", which_one)), GetTaggedPlayerName(plr), name);
|
|
else if (plr == killed_by)
|
|
log=Format(Translate(Format("Selfkill%d", which_one)), GetTaggedPlayerName(plr), name);
|
|
else if (!Hostile(plr,killed_by))
|
|
log=Format(Translate(Format("Teamkill%d", which_one)), GetTaggedPlayerName(plr), name, GetTaggedPlayerName(killed_by));
|
|
else log=Format(Translate(Format("KilledByPlayer%d", which_one)), GetTaggedPlayerName(plr), name, GetTaggedPlayerName(killed_by));
|
|
|
|
// okay, why is GetRelaunchCount not a global function..?
|
|
// and why are the relaunches not stored in a static variable or a singleton that can be accessed somehow..
|
|
var relaunches=nil;
|
|
for(var goal in FindObjects(Find_Or(Find_Category(C4D_Goal), Find_Category(C4D_Rule))))
|
|
{
|
|
relaunches = goal->~GetRelaunchCount(plr);
|
|
if(relaunches != nil) break;
|
|
}
|
|
if(relaunches == nil) relaunches=GameCall("GetRelaunchCount", plr);
|
|
|
|
if(relaunches != nil)
|
|
{
|
|
var msg="";
|
|
if (relaunches < 0) // Player eliminated.
|
|
msg = Format("$MsgFail$", GetTaggedPlayerName(plr));
|
|
else if (relaunches == 0) // Last relaunch.
|
|
msg = Format("$MsgRelaunch0$", GetTaggedPlayerName(plr));
|
|
else if (relaunches == 1) // One relaunch remaining.
|
|
msg = Format("$MsgRelaunch1$", GetTaggedPlayerName(plr));
|
|
else // Multiple relaunches remaining.
|
|
msg = Format("$MsgRelaunchX$", GetTaggedPlayerName(plr), relaunches);
|
|
|
|
log=Format("%s %s", log, msg);
|
|
}
|
|
|
|
// this is also not a global function, but that is okay. So..
|
|
// get additional strings from goals/rules ("%s is now king!!")
|
|
for(var goal in FindObjects(Find_Or(Find_Category(C4D_Goal), Find_Category(C4D_Rule))))
|
|
{
|
|
var other=goal->~GetAdditionalPlayerRelaunchString(clonk, plr, killed_by);GameCallEx("GetAdditionalPlayerRelaunchString", clonk, plr, killed_by);
|
|
if(other)
|
|
{
|
|
log=Format("%s %s", log, other);
|
|
}
|
|
}
|
|
|
|
// get additional stuff from scenario
|
|
var other=GameCall("GetAdditionalPlayerRelaunchString", clonk, plr, killed_by);
|
|
if(other)
|
|
{
|
|
log=Format("%s %s", log, other);
|
|
}
|
|
|
|
// also allow global callback function to add to death messages
|
|
other = GetAdditionalPlayerRelaunchString(clonk, plr, killed_by);
|
|
if(other)
|
|
log = Format("%s, %s", log, other);
|
|
|
|
Log(log);
|
|
}
|
|
|
|
local Name = "$Name$";
|
|
local Description = "$Description$";
|
|
local Visibility = VIS_Editor;
|
|
local EditorPlacementLimit = 1; // Rules are to be placed only once
|