Add magic wand as an editor-assignable usage item

console-destruction
Sven Eberhardt 2016-08-21 15:17:51 -04:00
parent f9349721e4
commit f6b3a6efb8
7 changed files with 119 additions and 3 deletions

View File

@ -356,6 +356,7 @@ func Definition(def)
Offset = new Evaluator.Offset { EditorHelp="$PositionOffsetOffsetHelp$", Priority=21 }
} } );
AddEvaluator("Position", nil, "$ObjectPosition$", "$ObjectPositionHelp$", "object_position", [def, def.EvalPositionObject], { Object={Function="triggering_object"} }, new Evaluator.Object { EditorHelp="$ObjectPositionObjectHelp$" }, "Object");
AddEvaluator("Position", nil, "$LastUsePosition$", "$LastUsePositionHelp$", "use_position", [def, def.EvalPos_LastUse]);
AddEvaluator("Position", "$RandomPosition$", "$RandomRectAbs$", "$RandomRectAbsHelp$", "random_pos_rect_abs", [def, def.EvalPos_RandomRect, false], def.GetDefaultRect, { Type="rect", Name="$Rectangle$", Relative=false, Color=0xffff00 }, "Area");
AddEvaluator("Position", "$RandomPosition$", "$RandomRectRel$", "$RandomRectRelHelp$", "random_pos_rect_rel", [def, def.EvalPos_RandomRect, true], { Area=[-30,-30,60,60] }, { Type="rect", Name="$Rectangle$", Relative=true, Color=0x00ffff }, "Area");
AddEvaluator("Position", "$RandomPosition$", "$RandomCircleAbs$", "$RandomCircleAbsHelp$", "random_pos_circle_abs", [def, def.EvalPos_RandomCircle, false], def.GetDefaultCircle, { Type="circle", Name="$Circle$", Relative=false, CanMoveCenter=true, Color=0xff00ff }, "Area");
@ -497,7 +498,7 @@ public func EvaluateValue(string eval_type, proplist props, proplist context)
return cb[0]->Call(cb[1], props, context, cb[2]);
}
public func EvaluateAction(proplist props, object action_object, object triggering_object, int triggering_player, string progress_mode, bool allow_parallel, finish_callback)
public func EvaluateAction(proplist props, object action_object, object triggering_object, int triggering_player, string progress_mode, bool allow_parallel, finish_callback, array position)
{
// No action
if (!props) if (finish_callback) return action_object->Call(finish_callback); else return;
@ -525,7 +526,7 @@ public func EvaluateAction(proplist props, object action_object, object triggeri
// Prevent duplicate parallel execution
if (!allow_parallel && (context.hold && !context.suspended)) return false;
// Init context settings
context->InitContext(action_object, triggering_player, triggering_object, props, finish_callback);
context->InitContext(action_object, triggering_player, triggering_object, props, finish_callback, position);
// Execute action
EvaluateValue("Action", props, context);
FinishAction(context);
@ -1134,6 +1135,8 @@ private func EvalPositionObject(proplist props, proplist context)
return [0,0]; // undefined object: Position is 0/0 default
}
private func EvalPos_LastUse(proplist props, proplist context) { return context.position; }
private func EvalPos_RandomRect(proplist props, proplist context, bool relative)
{
// Constant random distribution in rectangle
@ -1253,7 +1256,7 @@ public func Initialize()
return true;
}
public func InitContext(object action_object, int triggering_player, object triggering_object, proplist props, finish_callback)
public func InitContext(object action_object, int triggering_player, object triggering_object, proplist props, finish_callback, position)
{
// Determine triggering player+objects
var triggering_clonk;
@ -1273,11 +1276,15 @@ public func InitContext(object action_object, int triggering_player, object trig
triggering_object = triggering_clonk;
else if (triggering_object->~IsClonk())
triggering_clonk = triggering_object;
// Position default
if (!position && triggering_object)
position = [triggering_object->GetX(), triggering_object->GetY()];
// Init context settings
this.action_object = action_object;
this.triggering_object = triggering_object;
this.triggering_clonk = triggering_clonk;
this.triggering_player = triggering_player;
this.position = position;
this.root_action = props;
this.suspended = false;
this.finish_callback = finish_callback;

View File

@ -342,3 +342,5 @@ Smoke=Rauch
Sphere=Kreis
StarFlash=Stern
StarSpark=Sonne
LastUsePosition=Aktivierungsposition
LastUsePositionHelp=Fuer aktivierbare Gegenstaende wie den Zauberstab: Mausposition, an der der Spieler das Objekt aktiviert hat.

View File

@ -341,3 +341,5 @@ Smoke=Smoke
Sphere=Sphere
StarFlash=Star
StarSpark=Sun
LastUsePosition=Activation position
LastUsePositionHelp=Valid for activated items such as the magic wand: Mouse position where the player activated the item.

View File

@ -0,0 +1,14 @@
[DefCore]
id=MagicWand
Version=8,0
Category=C4D_Object
Width=3
Height=16
Offset=-1,-8
Vertices=2
VertexX=0,0
VertexY=-7,7
VertexFriction=50,50
Value=100
Mass=20
Rotate=1

View File

@ -0,0 +1,79 @@
/**
Magic wand
Item to be made magical with editor actions/
@author Sven2
--*/
public func Initialize()
{
// We don't have nice graphics yet :(
SetGraphics(nil, Torch);
}
public func Hit()
{
Sound("Hits::Materials::Wood::WoodHit?");
}
public func ControlUse(object clonk, int x, int y)
{
// No clonk?
if (!clonk) return false;
// Cooldown?
if (last_use_frame != nil)
if (FrameCounter() - last_use_frame < cooldown)
{
PlayerMessage(clonk->GetController(), "$NoUseCooldown$");
Sound("UI::Error", true, nil, clonk->GetController());
return true;
}
// Action go!
UserAction->EvaluateAction(use_action, this, clonk, nil, nil, action_allow_parallel, nil, [x+GetX(), y+GetY()]);
last_use_frame = FrameCounter();
return true;
}
public func SetUseAction(new_action)
{
use_action = new_action;
return true;
}
public func SetCooldown(int new_cooldown)
{
cooldown = new_cooldown;
return true;
}
/*-- Display --*/
public func GetCarryMode(object clonk, bool idle, bool nohand)
{
if (idle || nohand)
return CARRY_Back;
return CARRY_Spear;
}
func Definition(def)
{
// Display
SetProperty("PictureTransformation", Trans_Mul(Trans_Translate(2500, -1500, 0), Trans_Rotate(-30, 0, 0, 1)), def);
// Actions
if (!def.EditorProps) def.EditorProps = {};
def.EditorProps.use_action = new UserAction.Prop { Name="$MagicAction$", Priority=100, Set="SetUseAction", Save="Action", Priority=100 };
def.EditorProps.cooldown = { Name="$Cooldown$", Type="int", EditorHelp="$CooldownHelp$", Set="SetCooldown", Save="Cooldown", Min=0 };
def.EditorProps.action_allow_parallel = UserAction.PropParallel;
}
/*-- Properties --*/
local last_use_frame;
local Name = "$Name$";
local Description = "$Description$";
local Collectible = true;
local Components = {Wood = 1, Diamond = 1};
local use_action = nil, action_allow_parallel = false;
local cooldown = 40;

View File

@ -0,0 +1,6 @@
Name=Zauberstab
Description=Enthaellt verborgene Kraefte.
NoUseCooldown=Abklingzeit noch nicht verstrichen
MagicAction=Zauberaktion
Cooldown=Abklingzeit
CooldownHelp=Minimalzeit zwischen zwei Zaubern

View File

@ -0,0 +1,6 @@
Name=Magic wand
Description=Contains hidden powers.
NoUseCooldown=Cooldown hasn't passed yet.
MagicAction=Magic action
Cooldown=Cooldown time
CooldownHelp=Minimal time in frames between two spellcast actions.