openclonk/planet/Objects.ocd/Items.ocd/Weapons.ocd/Javelin.ocd/Script.c

234 lines
5.2 KiB
C
Raw Normal View History

/*--
2010-02-15 08:17:25 +00:00
Javelin
Author: Ringwaul
A simple but dangerous throwing weapon.
--*/
#include Library_Stackable
// Multiplication factor to clonk.ThrowSpeed
local shooting_strength = 21;
2010-02-19 23:28:13 +00:00
public func MaxStackCount() { return 3; }
// Note that the javelin damage also takes the speed into account. A direct eye-to-eye hit will do roughly this damage.
public func JavelinStrength() { return 16; }
public func TumbleStrength() { return 100; }
2010-02-15 08:17:25 +00:00
local animation_set;
func Initialize()
{
animation_set = {
AimMode = AIM_Position, // The aiming animation is done by adjusting the animation position to fit the angle
AnimationAim = "SpearAimArms",
AnimationShoot = "SpearThrowArms",
AnimationShoot2 = "SpearThrow2Arms",
AnimationShoot3 = "SpearThrow3Arms",
ShootTime = 16,
ShootTime2 = 8,
WalkBack = 0,
};
}
2010-02-15 08:17:25 +00:00
public func GetAnimationSet() { return animation_set; }
2010-02-19 18:41:49 +00:00
2015-02-15 11:25:03 +00:00
local aiming;
2015-02-15 11:25:03 +00:00
public func GetCarryMode(clonk) { if(aiming >= 0) return CARRY_HandBack; }
2010-02-15 08:17:25 +00:00
public func GetCarryBone() { return "Javelin"; }
2015-02-15 11:25:03 +00:00
public func GetCarrySpecial(clonk) { if(aiming > 0) return "pos_hand2"; }
public func GetCarryTransform() { if(aiming == 1) return Trans_Rotate(180, 0, 0, 1); }
2010-02-15 08:17:25 +00:00
public func RejectUse(object clonk)
2010-02-15 08:17:25 +00:00
{
return !clonk->HasHandAction(false, false, true);
}
2010-02-19 18:41:49 +00:00
public func ControlUseStart(object clonk, int x, int y)
{
2015-02-15 11:25:03 +00:00
aiming = 1;
clonk->StartAim(this);
ControlUseHolding(clonk, x, y);
Sound("Objects::Weapons::Javelin::Draw");
2010-02-15 08:17:25 +00:00
return 1;
}
public func HoldingEnabled() { return true; }
func ControlUseHolding(object clonk, ix, iy)
2010-02-15 08:17:25 +00:00
{
var angle = Angle(0,0,ix,iy);
angle = Normalize(angle,-180);
2010-02-19 18:41:49 +00:00
clonk->SetAimPosition(angle);
return true;
}
protected func ControlUseStop(object clonk, ix, iy)
{
2015-02-15 11:25:03 +00:00
if(aiming)
clonk->StopAim();
return true;
}
// Callback from the clonk, when he actually has stopped aiming
public func FinishedAiming(object clonk, int angle)
{
clonk->StartShoot(this);
return true;
2010-02-15 08:17:25 +00:00
}
public func ControlUseCancel(object clonk, int x, int y)
{
clonk->CancelAiming(this);
return true;
}
2010-02-19 22:01:18 +00:00
public func Reset(clonk)
2010-02-15 08:17:25 +00:00
{
2015-02-15 11:25:03 +00:00
aiming = 0;
2010-02-19 18:41:49 +00:00
}
// Called in the half of the shoot animation (when ShootTime2 is over)
public func DuringShoot(object clonk, int angle)
2010-02-19 18:41:49 +00:00
{
DoThrow(clonk, angle);
2010-02-19 18:41:49 +00:00
}
2010-02-15 08:17:25 +00:00
public func DoThrow(object clonk, int angle)
2010-02-19 18:41:49 +00:00
{
2010-02-15 08:17:25 +00:00
var javelin=TakeObject();
2010-05-03 17:48:54 +00:00
var div = 60; // 40% is converted to the direction of the throwing angle.
var xdir = clonk->GetXDir(1000);
var ydir = clonk->GetYDir(1000);
var speed = clonk.ThrowSpeed * shooting_strength + (100 - div) * Sqrt(xdir**2 + ydir**2) / 100;
2010-05-03 17:48:54 +00:00
var jav_x = div * xdir / 100 + Sin(angle, speed);
var jav_y = div * ydir / 100 - Cos(angle, speed);
javelin->SetXDir(jav_x, 1000);
javelin->SetYDir(jav_y, 1000);
javelin->SetPosition(javelin->GetX(),javelin->GetY()+6);
SetController(clonk->GetController());
2010-02-15 08:17:25 +00:00
javelin->AddEffect("Flight",javelin,1,1,javelin,nil);
javelin->AddEffect("HitCheck",javelin,1,1,nil,nil,clonk);
2010-02-19 18:41:49 +00:00
Sound("Objects::Weapons::Javelin::Throw?");
2015-02-15 11:25:03 +00:00
aiming = -1;
clonk->UpdateAttach();
2010-02-15 08:17:25 +00:00
}
2010-02-19 23:28:13 +00:00
//slightly modified HitObject() from arrow
public func HitObject(object obj)
{
var relx = GetXDir() - obj->GetXDir();
var rely = GetYDir() - obj->GetYDir();
var speed = Sqrt(relx*relx+rely*rely);
var dmg = JavelinStrength() * speed * 1000 / 60;
if (WeaponCanHit(obj))
{
if (obj->GetAlive())
Sound("Hits::ProjectileHitLiving?");
else
Sound("Objects::Weapons::Javelin::HitGround");
obj->~OnProjectileHit(this);
WeaponDamage(obj, dmg, FX_Call_EngObjHit, true);
WeaponTumble(obj, this->TumbleStrength());
if (!this) return;
}
2010-11-07 01:14:47 +00:00
Stick();
}
2010-02-19 23:28:13 +00:00
2010-02-24 17:52:21 +00:00
protected func Hit()
{
if(GetEffect("Flight",this))
2010-03-16 23:18:22 +00:00
{
Stick();
Sound("Objects::Weapons::Javelin::HitGround");
2010-03-16 23:18:22 +00:00
}
else
Sound("Hits::Materials::Wood::WoodHit?");
}
protected func Stick()
{
if(GetEffect("Flight",this))
{
SetXDir(0);
SetYDir(0);
SetRDir(0);
RemoveEffect("Flight",this);
RemoveEffect("HitCheck",this);
2010-02-24 17:52:21 +00:00
var x=Sin(GetR(),+16);
var y=Cos(GetR(),-16);
var mat = GetMaterial(x,y);
if(mat != -1)
{
//if(GetMaterialVal("DigFree","Material",mat))
//{
2010-02-24 17:52:21 +00:00
// stick in landscape
SetVertex(2,VTX_Y,-18,1);
//}
2010-02-24 17:52:21 +00:00
}
return;
}
2010-02-15 08:17:25 +00:00
}
2010-02-24 17:52:21 +00:00
func Entrance()
{
// reset sticky-vertex
SetVertex(2,VTX_Y,0,1);
}
protected func FxFlightStart(object pTarget, effect)
2010-02-15 08:17:25 +00:00
{
pTarget->SetProperty("Collectible",0);
2010-02-19 18:41:49 +00:00
pTarget->SetR(Angle(0,0,pTarget->GetXDir(),pTarget->GetYDir()));
2010-02-15 08:17:25 +00:00
}
protected func FxFlightTimer(object pTarget, effect, int iEffectTime)
2010-02-15 08:17:25 +00:00
{
//Using Newton's arrow rotation. This would be much easier if we had tan^-1 :(
var oldx = effect.x;
var oldy = effect.y;
2010-02-15 08:17:25 +00:00
var newx = GetX();
var newy = GetY();
var anglediff = Normalize(Angle(oldx,oldy,newx,newy)-GetR(),-180);
pTarget->SetRDir(anglediff/2);
effect.x = newx;
effect.y = newy;
2010-02-19 18:41:49 +00:00
pTarget->SetR(Angle(0,0,pTarget->GetXDir(),pTarget->GetYDir()));
2010-02-15 08:17:25 +00:00
}
protected func FxFlightStop(object pTarget, effect)
2010-02-15 08:17:25 +00:00
{
pTarget->SetProperty("Collectible", 1);
}
public func IsWeapon() { return true; }
public func IsArmoryProduct() { return true; }
2010-02-15 08:17:25 +00:00
func Definition(def) {
SetProperty("PictureTransformation", Trans_Mul(Trans_Rotate(40,0,0,1),Trans_Rotate(-10,1,0,0)),def);
}
local Collectible = 1;
local Name = "$Name$";
Merge branch 'norefs' Conflicts: planet/Melees.c4f/Ruins.c4s/ObjectFade.c4d/Script.c planet/Objects.c4d/Goals.c4d/KingOfTheHill.c4d/Script.c planet/Objects.c4d/Goals.c4d/LastManStanding.c4d/Relaunch.c4d/Script.c planet/Objects.c4d/Items.c4d/Resources.c4d/BlackPowder.c4d/Script.c planet/Objects.c4d/Items.c4d/Resources.c4d/Coal.c4d/Script.c planet/Objects.c4d/Items.c4d/Resources.c4d/Earth.c4d/Script.c planet/Objects.c4d/Items.c4d/Resources.c4d/Firestone.c4d/Script.c planet/Objects.c4d/Items.c4d/Resources.c4d/Gold.c4d/Script.c planet/Objects.c4d/Items.c4d/Resources.c4d/Ice.c4d/Script.c planet/Objects.c4d/Items.c4d/Resources.c4d/Loam.c4d/Script.c planet/Objects.c4d/Items.c4d/Resources.c4d/Metal.c4d/Script.c planet/Objects.c4d/Items.c4d/Resources.c4d/Ore.c4d/Script.c planet/Objects.c4d/Items.c4d/Resources.c4d/Rock.c4d/Script.c planet/Objects.c4d/Items.c4d/Resources.c4d/Snow.c4d/Script.c planet/Objects.c4d/Items.c4d/Resources.c4d/Sulphur.c4d/Script.c planet/Objects.c4d/Items.c4d/Resources.c4d/Wood.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/Axe.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/Balloon.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/Barrel.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/Boompack.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/CableReel.c4d/PowerLine.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/CableReel.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/Dynamite.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/DynamiteBox.c4d/Fuse.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/DynamiteBox.c4d/Igniter.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/DynamiteBox.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/GrappleBow.c4d/Hook.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/GrappleBow.c4d/Rope.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/GrappleBow.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/Hammer.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/JarOfWinds.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/OrbOfTelekinesis.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/Pickaxe.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/PowderKeg.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/Ropeladder.c4d/LadderGrabber.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/Ropeladder.c4d/LadderSegment.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/Ropeladder.c4d/Script.c planet/Objects.c4d/Items.c4d/Tools.c4d/Shovel.c4d/Script.c planet/Objects.c4d/Items.c4d/Weapons.c4d/Bow.c4d/Arrow.c4d/Script.c planet/Objects.c4d/Items.c4d/Weapons.c4d/Bow.c4d/Script.c planet/Objects.c4d/Items.c4d/Weapons.c4d/Club.c4d/Script.c planet/Objects.c4d/Items.c4d/Weapons.c4d/Javelin.c4d/Script.c planet/Objects.c4d/Items.c4d/Weapons.c4d/Musket.c4d/Ammo.c4d/Script.c planet/Objects.c4d/Items.c4d/Weapons.c4d/Musket.c4d/Script.c planet/Objects.c4d/Items.c4d/Weapons.c4d/Shield.c4d/Script.c planet/Objects.c4d/Vehicles.c4d/Cannon.c4d/Script.c planet/Objects.c4d/Vehicles.c4d/Lorry.c4d/Script.c planet/Tutorial.c4f/Tutorial.c4d/FlagGoal.c4d/Flag.c4d/Script.c planet/Tutorial.c4f/Tutorial.c4d/FlagGoal.c4d/Script.c planet/Tutorial.c4f/Tutorial.c4d/MenuDeco.c4d/Script.c planet/Tutorial.c4f/Tutorial.c4d/ObjectRestorer.c4d/Script.c planet/Tutorial.c4f/Tutorial.c4d/TutGuide.c4d/Script.c planet/Tutorial.c4f/Tutorial.c4d/TutorialGoal.c4d/Script.c planet/Tutorial.c4f/Tutorial03.c4s/ShootTheTargets.c4d/Script.c src/game/object/C4Def.h
2010-09-11 17:30:45 +00:00
local Description = "$Description$";
local ForceFreeHands = true;
local Components = [[Wood, 2], [Metal, 1]];