Possible fix for highlander

TS Fix

Law Maker Incendiary Fix

Possible Lawgiver burstfire fix

Lawgiver Changes:
Fix Rapid Fire
Add Armor Piercing
Add Pellets

Lawgiver:
Nerf incendiary bullets

Blow up the users weapon arm if his dna doesnt match
Added a proper soundeffect

Added Changelog.
Closes #71, Closes #327

Make the lawgiver emagable and change stun to a beam

Added crowdcontrol mode to the lawgiver

Final Tweaks to the lawgiver

Updated .gitignore to inclode the .atom-build.json

Fixed indentation
Fixed blowing up the wrong hand if the user switch hands after the killswitch has been triggered
This commit is contained in:
Werner
2016-05-27 22:28:55 +02:00
parent f34fa32690
commit a424b71a4b
11 changed files with 230 additions and 88 deletions
+4 -6
View File
@@ -385,14 +385,12 @@ datum/projectile_data
/proc/projectile_trajectory(var/src_x, var/src_y, var/rotation, var/angle, var/power)
// returns the destination (Vx,y) that a projectile shot at [src_x], [src_y], with an angle of [angle],
// rotated at [rotation] and with the power of [power]
// Thanks to VistaPOWA for this function
var/g = 9.81
var/h = 10
var/power_x = power * cos(angle)
var/power_y = power * sin(angle)
var/time = 2* power_y / 10 //10 = g
// var/time = 2* power_y / 10 //10 = g
var/time = (power_x + sqrt((power_x*power_x)+(2*g*h)))/g
var/distance = time * power_x
var/dest_x = src_x + distance*sin(rotation);
+3 -1
View File
@@ -35,6 +35,8 @@ var/datum/antagonist/highlander/highlanders
for (var/obj/item/I in player)
if (istype(I, /obj/item/weapon/implant))
continue
if (istype(I, /obj/item/organ))
continue
qdel(I)
player.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(player), slot_w_uniform)
@@ -65,4 +67,4 @@ var/datum/antagonist/highlander/highlanders
highlanders.add_antagonist(H.mind)
message_admins("\blue [key_name_admin(usr)] used THERE CAN BE ONLY ONE!", 1)
log_admin("[key_name(usr)] used there can be only one.")
log_admin("[key_name(usr)] used there can be only one.")
@@ -32,7 +32,7 @@
msg_admin_attack("[key_name_admin(M)] stungloved [src.name] ([src.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[M.x];Y=[M.y];Z=[M.z]'>JMP</a>)")
var/armorblock = run_armor_check(M.zone_sel.selecting, "energy")
apply_effects(5,5,0,0,5,0,0,armorblock)
apply_effects(5,5,0,0,5,0,0,0,0,armorblock)
apply_damage(rand(5,25), BURN, M.zone_sel.selecting,armorblock)
if(prob(15))
+5 -1
View File
@@ -61,11 +61,14 @@
eye_blurry = max(eye_blurry,(effect/(blocked+1)))
if(DROWSY)
drowsyness = max(drowsyness,(effect/(blocked+1)))
if(INCINERATE)
adjust_fire_stacks(effect/(blocked+1))
IgniteMob()
updatehealth()
return 1
/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0)
/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/incinerate = 0, var/blocked = 0)
if(blocked >= 2) return 0
if(stun) apply_effect(stun, STUN, blocked)
if(weaken) apply_effect(weaken, WEAKEN, blocked)
@@ -75,4 +78,5 @@
if(eyeblur) apply_effect(eyeblur, EYE_BLUR, blocked)
if(drowsy) apply_effect(drowsy, DROWSY, blocked)
if(agony) apply_effect(agony, AGONY, blocked)
if(incinerate) apply_effect(incinerate, INCINERATE, blocked)
return 1
+165 -78
View File
@@ -1,94 +1,181 @@
/obj/item/weapon/gun/energy/lawgiver
name = "Lawgiver Mk II"
desc = "A highly advanced firearm for the modern police force. It has multiple voice-activated firing modes."
icon_state = "lawgiver"
item_state = "gun"
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
fire_delay = 3
recoil = 1
projectile_type = /obj/item/projectile/bullet/pistol
origin_tech = "combat=6;magnets=5"
projectile_type=/obj/item/projectile/bullet/pistol
fire_sound='sound/weapons/Gunshot_smg.ogg'
sel_mode = 1
desc = "A highly advanced firearm for the modern police force. It has multiple voice-activated firing modes."
var/dna = null//dna-locking the firearm
var/emagged = 0 //if the gun is emagged or not
var/owner_name = null //Name of the (initial) owner
var/message = null //Message that should be played to the user
var/message_delay = 100 //Delay of the message_delay
var/message_enabled = 0 //If playing the message should be enabled
var/message_disable = 0 //If the loop should be stopped
var/default_desc = "A highly advanced firearm for the modern police force. It has multiple voice-activated firing modes."
var/ammomode = 0
var/dna //dna-locking the firearm
firemodes = list(
list(
name="singleshot",
charge_cost=50,
fire_delay=3,
recoil=1
),
list(
name="rapidfire",
charge_cost=150,
fire_delay=3,
recoil=1,
burst=3,
move_delay=4,
accuracy = list(0,-1,-1,-2,-2),
dispersion = list(0.0, 0.6, 1.0)
),
list(
name="highex",
charge_cost=300,
fire_delay=6,
recoil=3
),
list(
name="stun",
charge_cost=50,
fire_delay=4,
recoil=0
),
list(
name="hotshot",
charge_cost=200,
fire_delay=4,
recoil=3
),
list(
name="armorpiercing",
charge_cost=300,
fire_delay=6,
recoil=3
),
list(
name="pellets",
charge_cost=300,
fire_delay=6,
recoil=3
),
)
proc/hear(message, source as mob)
/obj/item/weapon/gun/energy/lawgiver/proc/play_message()
while (message_enabled && !message_disable) //Shut down command issued. Inform user that boardcasting has been stopped
usr.audible_message("<span class='warning'>[usr]'s [src.name] broadcasts: [message]</span>","")
playsound(get_turf(src), 'sound/voice/halt.ogg', 100, 1, vary = 0)
sleep(message_delay)
usr << "\red Broadcasting Message disabled"
message_enabled = 0
message_disable = 0
/obj/item/weapon/gun/energy/lawgiver/attack_self(mob/living/carbon/user as mob)
if(dna != null)
return
else
src.dna = user.dna.unique_enzymes
src.owner_name = user.real_name
user << "\blue You feel your palm heat up as the gun reads your DNA profile."
desc += "<br>Linked to: [user.real_name]"
return
/obj/item/weapon/gun/energy/lawgiver/attack_self(mob/user)
if(dna != null)
return
else
src.dna = user.dna.unique_enzymes
user << "\blue You feel your palm heat up as the gun reads your DNA profile."
desc += "<br>Linked to: [user.real_name]"
Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0)
if(src.dna != user.dna.unique_enzymes)
/obj/item/weapon/gun/energy/lawgiver/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0)
if(src.dna != user.dna.unique_enzymes && !emagged)
if(istype(user, /mob/living/carbon/human))
//Save the users active hand
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/LA = H.get_organ("l_arm")
var/obj/item/organ/external/RA = H.get_organ("r_arm")
var/active_hand = H.hand
playsound(user, 'sound/weapons/lawgiver_idfail.ogg', 40, 1)
user << "\red You hear a soft beep from the gun and 'ID FAIL' flashes across the screen."
playsound(user, 'sound/weapons/smg_empty_alarm.ogg', 40, 1)
user << "<span class='danger'>[src] blows up in your face!</span>"
explosion(get_turf(user), 0, 0, 1, rand(1,2))
user << "<span class='danger'>You feel a tiny prick in your hand!</span>"
user.drop_item()
qdel(src)
return 0
//Blow up Unauthorized Users Hand
sleep(60)
if(active_hand)
LA.droplimb(0,DROPLIMB_BLUNT)
else
RA.droplimb(0,DROPLIMB_BLUNT)
return 0
..()
/obj/item/weapon/gun/energy/lawgiver/proc/Emag(mob/user as mob)
usr << "<span class='warning'>You short out [src]'s id check</span>"
emagged = 1
return 1
/obj/item/weapon/gun/energy/lawgiver/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/card/emag) && !emagged)
Emag(user)
else
..()
hear_talk(mob/living/M in range(0,src), msg)
/obj/item/weapon/gun/energy/lawgiver/hear_talk(mob/living/M in range(0,src), msg)
if( (src.dna==usr.dna.unique_enzymes || emagged) && (src in usr.contents))
hear(msg)
return
return
hear(var/msg)
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = ""," " = "")
msg = sanitize_old(msg, replacechars)
if(findtext(msg,"singleshot") && (src.dna==usr.dna.unique_enzymes) && (src in usr.contents))
ammomode = 0
charge_cost = 50
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
usr << "\red [src.name] is now set to single shot mode."
projectile_type = /obj/item/projectile/bullet/pistol
fire_delay = 3
burst_delay = 0
recoil = 1
else if(findtext(msg,"rapidfire") && (src.dna==usr.dna.unique_enzymes) && (src in usr.contents))
ammomode = 1
charge_cost = 50
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
usr << "\red [src.name] is now set to rapid fire mode."
projectile_type = /obj/item/projectile/bullet/pistol
fire_delay = 1
burst_delay = 0
recoil = 2
else if(findtext(msg,"highex") && (src.dna==usr.dna.unique_enzymes) && (src in usr.contents))
ammomode = 2
charge_cost = 200
fire_sound = 'sound/effects/Explosion1.ogg'
usr << "\red [src.name] is now set to high explosive mode."
projectile_type = /obj/item/projectile/bullet/gyro/law
fire_delay = 6
burst_delay = 0
recoil = 3
else if(findtext(msg,"stun") && (src.dna==usr.dna.unique_enzymes) && (src in usr.contents))
ammomode = 3
charge_cost = 50
fire_sound = 'sound/weapons/Taser.ogg'
usr << "\red [src.name] is now set to stun mode."
projectile_type = /obj/item/projectile/energy/electrode
fire_delay = 4
burst_delay = 0
recoil = 0
else if(findtext(msg,"hotshot") && (src.dna==usr.dna.unique_enzymes) && (src in usr.contents))
ammomode = 4
charge_cost = 200
fire_sound = 'sound/weapons/lasercannonfire.ogg'
usr << "\red [src.name] is now set to incendiary mode."
projectile_type = /obj/item/projectile/bullet/shotgun
fire_delay = 6
burst_delay = 0
recoil = 1
else
/obj/item/weapon/gun/energy/lawgiver/proc/hear(var/msg)
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = ""," " = "")
msg = sanitize_old(msg, replacechars)
/* Firing Modes*/
if(findtext(msg,"single"))
sel_mode = 1
projectile_type=/obj/item/projectile/bullet/pistol
fire_sound='sound/weapons/Gunshot_smg.ogg'
usr << "\red [src.name] is now set to single shot mode."
else if(findtext(msg,"rapidfire"))
sel_mode = 2
projectile_type=/obj/item/projectile/bullet/pistol
fire_sound='sound/weapons/Gunshot_smg.ogg'
usr << "\red [src.name] is now set to rapid fire mode."
else if(findtext(msg,"highex") || findtext(msg,"grenade"))
sel_mode = 3
projectile_type=/obj/item/projectile/bullet/gyro/law
fire_sound='sound/effects/Explosion1.ogg'
usr << "\red [src.name] is now set to high explosive mode."
else if(findtext(msg,"stun"))
sel_mode = 4
projectile_type=/obj/item/projectile/beam/stun
fire_sound='sound/weapons/Taser.ogg'
usr << "\red [src.name] is now set to stun mode."
else if(findtext(msg,"hotshot") || findtext(msg,"incendiary"))
sel_mode = 5
projectile_type=/obj/item/projectile/bullet/shotgun/incendiary
fire_sound='sound/weapons/Gunshot.ogg'
usr << "\red [src.name] is now set to incendiary mode."
else if(findtext(msg,"armorpiercing") || findtext(msg,"execution"))
sel_mode = 6
projectile_type=/obj/item/projectile/bullet/rifle/a556
fire_sound='sound/weapons/Gunshot.ogg'
usr << "\red [src.name] is now set to armorpiercing mode."
else if(findtext(msg,"pellets"))
sel_mode = 7
projectile_type=/obj/item/projectile/bullet/pellet/shotgun
fire_sound='sound/weapons/Gunshot.ogg'
usr << "\red [src.name] is now set to pellet mode."
/* Other Stuff */
else if(findtext(msg,"reset") && (findtext(msg,"user") || findtext(msg,"dna")))
dna = null
desc = default_desc
usr << "\red [src.name]´s owner has been reset. Do not attempt to fire [src.name] without rebinding a new owner"
else if((findtext(msg,"disable") || findtext(msg,"deactivate")) && findtext(msg,"crowdcontrol"))
message_disable = 1
usr << "\red [src.name]´s crowdcontrol deactivation sequence started"
else if((findtext(msg,"enable") || findtext(msg,"activate")) && findtext(msg,"crowdcontrol"))
if(message_enabled) //Check if a message is already broadcasting -> abort
usr << "\red [src.name] is already broadcasting a message."
return
usr << "\red [src.name]´s crowdcontrol activation sequence started"
message = "Citizens stay calm. Stand back from the crimescense. Interference with the crimescene carries an automatice brig sentence."
message_enabled = 1
message_disable = 0
play_message()
else
return
+2 -1
View File
@@ -56,6 +56,7 @@
var/eyeblur = 0
var/drowsy = 0
var/agony = 0
var/incinerate = 0
var/embed = 0 // whether or not the projectile can embed itself in the mob
var/hitscan = 0 // whether the projectile should be hitscan
@@ -77,7 +78,7 @@
if(!isliving(target)) return 0
if(isanimal(target)) return 0
var/mob/living/L = target
L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, agony, blocked) // add in AGONY!
L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, agony, incinerate, blocked) // add in AGONY!
return 1
//called when the projectile stops flying because it collided with something
@@ -130,6 +130,15 @@
embed = 0
sharp = 0
/obj/item/projectile/bullet/shotgun/incendiary
name = "incendiary"
check_armour = "melee"
damage = 5
agony = 0
embed = 0
sharp = 0
incinerate = 10
//Should do about 80 damage at 1 tile distance (adjacent), and 50 damage at 3 tiles distance.
//Overall less damage than slugs in exchange for more damage at very close range and more embedding
/obj/item/projectile/bullet/pellet/shotgun
+1
View File
@@ -413,6 +413,7 @@
#define STUTTER "stutter"
#define EYE_BLUR "eye_blur"
#define DROWSY "drowsy"
#define INCINERATE "incinerate"
// I hate adding defines like this but I'd much rather deal with bitflags than lists and string searches.
#define BRUTELOSS 1