mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-22 11:37:40 +01:00
Merge remote-tracking branch 'upstream/master' into chaplain-things
This commit is contained in:
@@ -53,3 +53,11 @@
|
||||
#define AI_ON 1
|
||||
#define AI_IDLE 2
|
||||
#define AI_OFF 3
|
||||
|
||||
//Gun Stuff
|
||||
#define SAWN_INTACT 0
|
||||
#define SAWN_OFF 1
|
||||
|
||||
#define WEAPON_LIGHT 0
|
||||
#define WEAPON_MEDIUM 1
|
||||
#define WEAPON_HEAVY 2
|
||||
|
||||
@@ -251,3 +251,7 @@
|
||||
0.3, 0.3, 0.3, 0,\
|
||||
0.3, 0.3, 0.3, 0,\
|
||||
0, 0, 0, 1)
|
||||
//Gun trigger guards
|
||||
#define TRIGGER_GUARD_ALLOW_ALL -1
|
||||
#define TRIGGER_GUARD_NONE 0
|
||||
#define TRIGGER_GUARD_NORMAL 1
|
||||
|
||||
+1
-1
@@ -45,7 +45,7 @@
|
||||
if(modifiers["middle"])
|
||||
MiddleClickOn(A)
|
||||
if(controlled_mech) //Are we piloting a mech? Placed here so the modifiers are not overridden.
|
||||
controlled_mech.click_action(A, src) //Override AI normal click behavior.
|
||||
controlled_mech.click_action(A, src, params) //Override AI normal click behavior.
|
||||
return
|
||||
if(modifiers["shift"])
|
||||
ShiftClickOn(A)
|
||||
|
||||
+5
-59
@@ -74,7 +74,7 @@
|
||||
if(!locate(/turf) in list(A,A.loc)) // Prevents inventory from being drilled
|
||||
return
|
||||
var/obj/mecha/M = loc
|
||||
return M.click_action(A,src)
|
||||
return M.click_action(A, src, params)
|
||||
|
||||
if(restrained())
|
||||
changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow
|
||||
@@ -167,9 +167,8 @@
|
||||
animals lunging, etc.
|
||||
*/
|
||||
/mob/proc/RangedAttack(var/atom/A, var/params)
|
||||
if(ishuman(src) && (istype(src:gloves, /obj/item/clothing/gloves/color/yellow/power)) && a_intent == I_HARM)
|
||||
PowerGlove(A)
|
||||
if(!mutations.len) return
|
||||
if(!mutations.len)
|
||||
return
|
||||
if((LASER in mutations) && a_intent == I_HARM)
|
||||
LaserEyes(A) // moved into a proc below
|
||||
return
|
||||
@@ -319,61 +318,8 @@
|
||||
LE.current = T
|
||||
LE.yo = U.y - T.y
|
||||
LE.xo = U.x - T.x
|
||||
spawn(1)
|
||||
LE.process()
|
||||
LE.fire()
|
||||
|
||||
/mob/proc/PowerGlove(atom/A)
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/PowerGlove(atom/A)
|
||||
var/obj/item/clothing/gloves/color/yellow/power/G = src:gloves
|
||||
var/time = 100
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/U = get_turf(A)
|
||||
var/obj/structure/cable/cable = locate() in T
|
||||
if(!cable || !istype(cable))
|
||||
to_chat(src, "<span class='warning'>There is no cable here to power the gloves.</span>")
|
||||
return
|
||||
if(world.time < G.next_shock)
|
||||
to_chat(src, "<span class='warning'>[G] aren't ready to shock again!</span>")
|
||||
return
|
||||
src.visible_message("<span class='warning'>[name] fires an arc of electricity!</span>", \
|
||||
"<span class='warning'>You fire an arc of electricity!</span>", \
|
||||
"You hear the loud crackle of electricity!")
|
||||
var/datum/powernet/PN = cable.get_powernet()
|
||||
var/available = 0
|
||||
var/obj/item/projectile/beam/lightning/L = new /obj/item/projectile/beam/lightning/(get_turf(src))
|
||||
if(PN)
|
||||
available = PN.avail
|
||||
L.damage = PN.get_electrocute_damage()
|
||||
if(available >= 5000000)
|
||||
L.damage = 205
|
||||
if(L.damage >= 200)
|
||||
time = 200
|
||||
else if(L.damage >= 100)
|
||||
time = 150
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
if(L.damage <= 0)
|
||||
qdel(L)
|
||||
if(L)
|
||||
playsound(get_turf(src), 'sound/effects/eleczap.ogg', 75, 1)
|
||||
L.tang = L.adjustAngle(get_angle(U,T))
|
||||
L.icon = midicon
|
||||
L.icon_state = "[L.tang]"
|
||||
L.firer = usr
|
||||
L.def_zone = get_organ_target()
|
||||
L.original = src
|
||||
L.current = U
|
||||
L.starting = U
|
||||
L.yo = U.y - T.y
|
||||
L.xo = U.x - T.x
|
||||
spawn( 1 )
|
||||
L.process()
|
||||
|
||||
next_move = world.time + 12
|
||||
G.next_shock = world.time + time
|
||||
// Simple helper to face what you clicked on, in case it should be needed in more than one place
|
||||
/mob/proc/face_atom(var/atom/A)
|
||||
|
||||
@@ -419,4 +365,4 @@
|
||||
else
|
||||
var/turf/T = screen_loc2turf(modifiers["screen-loc"], get_turf(usr))
|
||||
T.Click(location, control, params)
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -40,4 +40,29 @@
|
||||
newObject.loc = get_turf(A)
|
||||
to_chat(user, "<span class='notice'>You release the power you had stored up, summoning \a [newObject.name]! </span>")
|
||||
usr.loc.visible_message("<span class='notice'>[user] waves \his hand and summons \a [newObject.name]</span>")
|
||||
..()
|
||||
..()
|
||||
|
||||
/datum/middleClickOverride/power_gloves
|
||||
var/last_shocked = 0
|
||||
var/shock_delay = 120
|
||||
|
||||
/datum/middleClickOverride/power_gloves/onClick(var/atom/A, var/mob/living/user)
|
||||
if(user.incapacitated())
|
||||
return
|
||||
if(world.time < last_shocked + shock_delay)
|
||||
to_chat(user, "<span class='warning'>The gloves are still recharging.</span>")
|
||||
return
|
||||
if(!isliving(A))
|
||||
to_chat(user, "<span class='warning'>Shocking an inanimate object would be pointless.</span>")
|
||||
return
|
||||
var/mob/living/L = A
|
||||
var/turf/T = get_turf(user)
|
||||
var/obj/structure/cable/C = locate() in T
|
||||
if(!C || !istype(C))
|
||||
to_chat(user, "<span class='warning'>There is no cable here to power the gloves.</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user.name] fires an arc of electricity at [L]!</span>", "<span class='warning'>You fire an arc of electricity at [L]!</span>", "You hear the loud crackle of electricity!")
|
||||
var/datum/powernet/PN = C.get_powernet()
|
||||
user.Beam(L,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5)
|
||||
electrocute_mob(L, PN, user)
|
||||
last_shocked = world.time
|
||||
|
||||
@@ -217,11 +217,25 @@
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_ALIVE|AB_CHECK_INSIDE
|
||||
|
||||
/datum/action/item_action/CheckRemoval(mob/living/user)
|
||||
return !(target in user)
|
||||
return get(target, /mob/living) != user
|
||||
|
||||
/datum/action/item_action/hands_free
|
||||
check_flags = AB_CHECK_ALIVE|AB_CHECK_INSIDE
|
||||
|
||||
// for clothing accessories like holsters
|
||||
/datum/action/item_action/accessory
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_ALIVE
|
||||
|
||||
/datum/action/item_action/accessory/Checks()
|
||||
. = ..()
|
||||
if(!.)
|
||||
return 0
|
||||
if(target.loc == owner)
|
||||
return 1
|
||||
if(istype(target.loc, /obj/item/clothing/under) && target.loc.loc == owner)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
///prset for organ actions
|
||||
/datum/action/item_action/organ_action
|
||||
check_flags = AB_CHECK_ALIVE
|
||||
|
||||
@@ -369,8 +369,7 @@
|
||||
A.current = T
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
spawn( 1 )
|
||||
A.process()
|
||||
A.fire()
|
||||
|
||||
usr.next_move = world.time + 6
|
||||
return
|
||||
|
||||
@@ -79,8 +79,11 @@
|
||||
qdel(trail)
|
||||
|
||||
current_loc = projectile.loc
|
||||
var/matrix/M = new
|
||||
M.Turn(dir2angle(projectile.dir))
|
||||
projectile.transform = M
|
||||
|
||||
sleep(proj_step_delay)
|
||||
|
||||
if(projectile)
|
||||
qdel(projectile)
|
||||
qdel(projectile)
|
||||
|
||||
@@ -234,9 +234,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
|
||||
/datum/supply_packs/security/taser
|
||||
name = "Stun Guns Crate"
|
||||
contains = list(/obj/item/weapon/gun/energy/advtaser,
|
||||
/obj/item/weapon/gun/energy/advtaser,
|
||||
/obj/item/weapon/gun/energy/advtaser)
|
||||
contains = list(/obj/item/weapon/gun/energy/gun/advtaser,
|
||||
/obj/item/weapon/gun/energy/gun/advtaser,
|
||||
/obj/item/weapon/gun/energy/gun/advtaser)
|
||||
cost = 15
|
||||
containername = "stun gun crate"
|
||||
|
||||
|
||||
@@ -605,10 +605,10 @@ var/list/uplink_items = list()
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/machinegun
|
||||
name = "Box Magazine - 7.62x51mm"
|
||||
desc = "A 50-round magazine of 7.62x51mm ammunition for use in the L6 SAW machine gun. By the time you need to use this, you'll already be on a pile of corpses."
|
||||
name = "Box Magazine - 5.56x45mm"
|
||||
desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW machine gun. By the time you need to use this, you'll already be on a pile of corpses."
|
||||
reference = "762"
|
||||
item = /obj/item/ammo_box/magazine/m762
|
||||
item = /obj/item/ammo_box/magazine/mm556x45
|
||||
cost = 12
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
surplus = 0
|
||||
|
||||
@@ -16,6 +16,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"across" = 'sound/vox_fem/across.ogg',
|
||||
"activate" = 'sound/vox_fem/activate.ogg',
|
||||
"activated" = 'sound/vox_fem/activated.ogg',
|
||||
"active" = 'sound/vox_fem/active.ogg',
|
||||
"activity" = 'sound/vox_fem/activity.ogg',
|
||||
"adios" = 'sound/vox_fem/adios.ogg',
|
||||
"administration" = 'sound/vox_fem/administration.ogg',
|
||||
@@ -24,7 +25,9 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"after" = 'sound/vox_fem/after.ogg',
|
||||
"agent" = 'sound/vox_fem/agent.ogg',
|
||||
"ai" = 'sound/vox_fem/ai.ogg',
|
||||
"airlock" = 'sound/vox_fem/airlock.ogg',
|
||||
"alarm" = 'sound/vox_fem/alarm.ogg',
|
||||
"alcohol" = 'sound/vox_fem/alcohol.ogg',
|
||||
"alert" = 'sound/vox_fem/alert.ogg',
|
||||
"alien" = 'sound/vox_fem/alien.ogg',
|
||||
"aligned" = 'sound/vox_fem/aligned.ogg',
|
||||
@@ -51,6 +54,8 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"armory" = 'sound/vox_fem/armory.ogg',
|
||||
"array" = 'sound/vox_fem/array.ogg',
|
||||
"arrest" = 'sound/vox_fem/arrest.ogg',
|
||||
"arrival" = 'sound/vox_fem/arrival.ogg',
|
||||
"arrivals" = 'sound/vox_fem/arrivals.ogg',
|
||||
"asimov" = 'sound/vox_fem/asimov.ogg',
|
||||
"ass" = 'sound/vox_fem/ass.ogg',
|
||||
"asshole" = 'sound/vox_fem/asshole.ogg',
|
||||
@@ -74,8 +79,10 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"base" = 'sound/vox_fem/base.ogg',
|
||||
"bay" = 'sound/vox_fem/bay.ogg',
|
||||
"be" = 'sound/vox_fem/be.ogg',
|
||||
"becoming" = 'sound/vox_fem/becoming.ogg',
|
||||
"been" = 'sound/vox_fem/been.ogg',
|
||||
"before" = 'sound/vox_fem/before.ogg',
|
||||
"between" = 'sound/vox_fem/between.ogg',
|
||||
"beyond" = 'sound/vox_fem/beyond.ogg',
|
||||
"biohazard" = 'sound/vox_fem/biohazard.ogg',
|
||||
"biological" = 'sound/vox_fem/biological.ogg',
|
||||
@@ -86,6 +93,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"bizwarn" = 'sound/vox_fem/bizwarn.ogg',
|
||||
"black" = 'sound/vox_fem/black.ogg',
|
||||
"blast" = 'sound/vox_fem/blast.ogg',
|
||||
"blob" = 'sound/vox_fem/blob.ogg',
|
||||
"blocked" = 'sound/vox_fem/blocked.ogg',
|
||||
"bloop" = 'sound/vox_fem/bloop.ogg',
|
||||
"blue" = 'sound/vox_fem/blue.ogg',
|
||||
@@ -104,6 +112,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"breached" = 'sound/vox_fem/breached.ogg',
|
||||
"break" = 'sound/vox_fem/break.ogg',
|
||||
"bridge" = 'sound/vox_fem/bridge.ogg',
|
||||
"briefing" = 'sound/vox_fem/briefing.ogg',
|
||||
"brig" = 'sound/vox_fem/brig.ogg',
|
||||
"bust" = 'sound/vox_fem/bust.ogg',
|
||||
"but" = 'sound/vox_fem/but.ogg',
|
||||
@@ -115,6 +124,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"cage" = 'sound/vox_fem/cage.ogg',
|
||||
"call" = 'sound/vox_fem/call.ogg',
|
||||
"called" = 'sound/vox_fem/called.ogg',
|
||||
"camp" = 'sound/vox_fem/camp.ogg',
|
||||
"can" = 'sound/vox_fem/can.ogg',
|
||||
"canal" = 'sound/vox_fem/canal.ogg',
|
||||
"cancer" = 'sound/vox_fem/cancer.ogg',
|
||||
@@ -130,11 +140,13 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"center" = 'sound/vox_fem/center.ogg',
|
||||
"centi" = 'sound/vox_fem/centi.ogg',
|
||||
"central" = 'sound/vox_fem/central.ogg',
|
||||
"chair" = 'sound/vox_fem/chair.ogg',
|
||||
"chamber" = 'sound/vox_fem/chamber.ogg',
|
||||
"changed" = 'sound/vox_fem/changed.ogg',
|
||||
"changeling" = 'sound/vox_fem/changeling.ogg',
|
||||
"changelings" = 'sound/vox_fem/changelings.ogg',
|
||||
"changer" = 'sound/vox_fem/changer.ogg',
|
||||
"chapel" = 'sound/vox_fem/chapel.ogg',
|
||||
"charlie" = 'sound/vox_fem/charlie.ogg',
|
||||
"check" = 'sound/vox_fem/check.ogg',
|
||||
"checkpoint" = 'sound/vox_fem/checkpoint.ogg',
|
||||
@@ -147,6 +159,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"clear" = 'sound/vox_fem/clear.ogg',
|
||||
"clearance" = 'sound/vox_fem/clearance.ogg',
|
||||
"close" = 'sound/vox_fem/close.ogg',
|
||||
"closet" = 'sound/vox_fem/closet.ogg',
|
||||
"clown" = 'sound/vox_fem/clown.ogg',
|
||||
"clowns" = 'sound/vox_fem/clowns.ogg',
|
||||
"cmo" = 'sound/vox_fem/cmo.ogg',
|
||||
@@ -179,6 +192,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"cryogenic" = 'sound/vox_fem/cryogenic.ogg',
|
||||
"cunt" = 'sound/vox_fem/cunt.ogg',
|
||||
"cunts" = 'sound/vox_fem/cunts.ogg',
|
||||
"cyberiad" = 'sound/vox_fem/cyberiad.ogg',
|
||||
"cyborg" = 'sound/vox_fem/cyborg.ogg',
|
||||
"cyborgs" = 'sound/vox_fem/cyborgs.ogg',
|
||||
"d" = 'sound/vox_fem/d.ogg',
|
||||
@@ -190,6 +204,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"deactivated" = 'sound/vox_fem/deactivated.ogg',
|
||||
"dead" = 'sound/vox_fem/dead.ogg',
|
||||
"death" = 'sound/vox_fem/death.ogg',
|
||||
"declared" = 'sound/vox_fem/declared.ogg',
|
||||
"decompression" = 'sound/vox_fem/decompression.ogg',
|
||||
"decontamination" = 'sound/vox_fem/decontamination.ogg',
|
||||
"deeoo" = 'sound/vox_fem/deeoo.ogg',
|
||||
@@ -206,11 +221,13 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"destroyed" = 'sound/vox_fem/destroyed.ogg',
|
||||
"detain" = 'sound/vox_fem/detain.ogg',
|
||||
"detected" = 'sound/vox_fem/detected.ogg',
|
||||
"detective" = 'sound/vox_fem/detective.ogg',
|
||||
"detonation" = 'sound/vox_fem/detonation.ogg',
|
||||
"device" = 'sound/vox_fem/device.ogg',
|
||||
"did" = 'sound/vox_fem/did.ogg',
|
||||
"die" = 'sound/vox_fem/die.ogg',
|
||||
"dimensional" = 'sound/vox_fem/dimensional.ogg',
|
||||
"diona" = 'sound/vox_fem/diona.ogg',
|
||||
"dirt" = 'sound/vox_fem/dirt.ogg',
|
||||
"disengaged" = 'sound/vox_fem/disengaged.ogg',
|
||||
"dish" = 'sound/vox_fem/dish.ogg',
|
||||
@@ -218,12 +235,18 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"distance" = 'sound/vox_fem/distance.ogg',
|
||||
"distortion" = 'sound/vox_fem/distortion.ogg',
|
||||
"do" = 'sound/vox_fem/do.ogg',
|
||||
"dock" = 'sound/vox_fem/dock.ogg',
|
||||
"docked" = 'sound/vox_fem/docked.ogg',
|
||||
"docking" = 'sound/vox_fem/docking.ogg',
|
||||
"docks" = 'sound/vox_fem/docks.ogg',
|
||||
"doctor" = 'sound/vox_fem/doctor.ogg',
|
||||
"doctors" = 'sound/vox_fem/doctors.ogg',
|
||||
"doop" = 'sound/vox_fem/doop.ogg',
|
||||
"door" = 'sound/vox_fem/door.ogg',
|
||||
"dorms" = 'sound/vox_fem/dorms.ogg',
|
||||
"down" = 'sound/vox_fem/down.ogg',
|
||||
"drask" = 'sound/vox_fem/drask.ogg',
|
||||
"drunk" = 'sound/vox_fem/drunk.ogg',
|
||||
"dual" = 'sound/vox_fem/dual.ogg',
|
||||
"duct" = 'sound/vox_fem/duct.ogg',
|
||||
"e" = 'sound/vox_fem/e.ogg',
|
||||
@@ -240,6 +263,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"elevator" = 'sound/vox_fem/elevator.ogg',
|
||||
"eleven" = 'sound/vox_fem/eleven.ogg',
|
||||
"eliminate" = 'sound/vox_fem/eliminate.ogg',
|
||||
"emag" = 'sound/vox_fem/emag.ogg',
|
||||
"emergency" = 'sound/vox_fem/emergency.ogg',
|
||||
"energy" = 'sound/vox_fem/energy.ogg',
|
||||
"engage" = 'sound/vox_fem/engage.ogg',
|
||||
@@ -251,9 +275,11 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"enter" = 'sound/vox_fem/enter.ogg',
|
||||
"entry" = 'sound/vox_fem/entry.ogg',
|
||||
"environment" = 'sound/vox_fem/environment.ogg',
|
||||
"equipment" = 'sound/vox_fem/equipment.ogg',
|
||||
"error" = 'sound/vox_fem/error.ogg',
|
||||
"escape" = 'sound/vox_fem/escape.ogg',
|
||||
"evacuate" = 'sound/vox_fem/evacuate.ogg',
|
||||
"evacuation" = 'sound/vox_fem/evacuation.ogg',
|
||||
"every" = 'sound/vox_fem/every.ogg',
|
||||
"everywhere" = 'sound/vox_fem/everywhere.ogg',
|
||||
"exchange" = 'sound/vox_fem/exchange.ogg',
|
||||
@@ -262,6 +288,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"expect" = 'sound/vox_fem/expect.ogg',
|
||||
"experiment" = 'sound/vox_fem/experiment.ogg',
|
||||
"experimental" = 'sound/vox_fem/experimental.ogg',
|
||||
"experimentor" = 'sound/vox_fem/experimentor.ogg',
|
||||
"explode" = 'sound/vox_fem/explode.ogg',
|
||||
"explosion" = 'sound/vox_fem/explosion.ogg',
|
||||
"exposure" = 'sound/vox_fem/exposure.ogg',
|
||||
@@ -310,6 +337,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"fuel" = 'sound/vox_fem/fuel.ogg',
|
||||
"g" = 'sound/vox_fem/g.ogg',
|
||||
"gas" = 'sound/vox_fem/gas.ogg',
|
||||
"gateway" = 'sound/vox_fem/gateway.ogg',
|
||||
"get" = 'sound/vox_fem/get.ogg',
|
||||
"glory" = 'sound/vox_fem/glory.ogg',
|
||||
"go" = 'sound/vox_fem/go.ogg',
|
||||
@@ -332,6 +360,8 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"hacker" = 'sound/vox_fem/hacker.ogg',
|
||||
"hackers" = 'sound/vox_fem/hackers.ogg',
|
||||
"hacking" = 'sound/vox_fem/hacking.ogg',
|
||||
"hail" = 'sound/vox_fem/hail.ogg',
|
||||
"hallway" = 'sound/vox_fem/hallway.ogg',
|
||||
"handling" = 'sound/vox_fem/handling.ogg',
|
||||
"hangar" = 'sound/vox_fem/hangar.ogg',
|
||||
"happening" = 'sound/vox_fem/happening.ogg',
|
||||
@@ -352,6 +382,8 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"highest" = 'sound/vox_fem/highest.ogg',
|
||||
"hit" = 'sound/vox_fem/hit.ogg',
|
||||
"hole" = 'sound/vox_fem/hole.ogg',
|
||||
"holoparasite" = 'sound/vox_fem/holoparasite.ogg',
|
||||
"honk" = 'sound/vox_fem/honk.ogg',
|
||||
"hop" = 'sound/vox_fem/hop.ogg',
|
||||
"hos" = 'sound/vox_fem/hos.ogg',
|
||||
"hostile" = 'sound/vox_fem/hostile.ogg',
|
||||
@@ -359,6 +391,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"hotel" = 'sound/vox_fem/hotel.ogg',
|
||||
"hour" = 'sound/vox_fem/hour.ogg',
|
||||
"hours" = 'sound/vox_fem/hours.ogg',
|
||||
"hull" = 'sound/vox_fem/hull.ogg',
|
||||
"human" = 'sound/vox_fem/human.ogg',
|
||||
"humans" = 'sound/vox_fem/humans.ogg',
|
||||
"hundred" = 'sound/vox_fem/hundred.ogg',
|
||||
@@ -367,10 +400,12 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"hydroponics" = 'sound/vox_fem/hydroponics.ogg',
|
||||
"i" = 'sound/vox_fem/i.ogg',
|
||||
"iaa" = 'sound/vox_fem/iaa.ogg',
|
||||
"ian" = 'sound/vox_fem/ian.ogg',
|
||||
"idiot" = 'sound/vox_fem/idiot.ogg',
|
||||
"illegal" = 'sound/vox_fem/illegal.ogg',
|
||||
"immediate" = 'sound/vox_fem/immediate.ogg',
|
||||
"immediately" = 'sound/vox_fem/immediately.ogg',
|
||||
"imminent" = 'sound/vox_fem/imminent.ogg',
|
||||
"in" = 'sound/vox_fem/in.ogg',
|
||||
"inches" = 'sound/vox_fem/inches.ogg',
|
||||
"india" = 'sound/vox_fem/india.ogg',
|
||||
@@ -380,7 +415,9 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"inspection" = 'sound/vox_fem/inspection.ogg',
|
||||
"inspector" = 'sound/vox_fem/inspector.ogg',
|
||||
"interchange" = 'sound/vox_fem/interchange.ogg',
|
||||
"interested" = 'sound/vox_fem/interested.ogg',
|
||||
"intruder" = 'sound/vox_fem/intruder.ogg',
|
||||
"intruders" = 'sound/vox_fem/intruders.ogg',
|
||||
"invalid" = 'sound/vox_fem/invalid.ogg',
|
||||
"invasion" = 'sound/vox_fem/invasion.ogg',
|
||||
"is" = 'sound/vox_fem/is.ogg',
|
||||
@@ -390,6 +427,8 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"juliet" = 'sound/vox_fem/juliet.ogg',
|
||||
"k" = 'sound/vox_fem/k.ogg',
|
||||
"key" = 'sound/vox_fem/key.ogg',
|
||||
"kida" = 'sound/vox_fem/kida.ogg',
|
||||
"kidan" = 'sound/vox_fem/kidan.ogg',
|
||||
"kill" = 'sound/vox_fem/kill.ogg',
|
||||
"killed" = 'sound/vox_fem/killed.ogg',
|
||||
"killing" = 'sound/vox_fem/killing.ogg',
|
||||
@@ -398,6 +437,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"kitchen" = 'sound/vox_fem/kitchen.ogg',
|
||||
"l" = 'sound/vox_fem/l.ogg',
|
||||
"lab" = 'sound/vox_fem/lab.ogg',
|
||||
"labor" = 'sound/vox_fem/labor.ogg',
|
||||
"lambda" = 'sound/vox_fem/lambda.ogg',
|
||||
"laser" = 'sound/vox_fem/laser.ogg',
|
||||
"last" = 'sound/vox_fem/last.ogg',
|
||||
@@ -411,6 +451,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"legal" = 'sound/vox_fem/legal.ogg',
|
||||
"level" = 'sound/vox_fem/level.ogg',
|
||||
"lever" = 'sound/vox_fem/lever.ogg',
|
||||
"library" = 'sound/vox_fem/library.ogg',
|
||||
"lie" = 'sound/vox_fem/lie.ogg',
|
||||
"lieutenant" = 'sound/vox_fem/lieutenant.ogg',
|
||||
"life" = 'sound/vox_fem/life.ogg',
|
||||
@@ -457,8 +498,13 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"military" = 'sound/vox_fem/military.ogg',
|
||||
"milli" = 'sound/vox_fem/milli.ogg',
|
||||
"million" = 'sound/vox_fem/million.ogg',
|
||||
"mime" = 'sound/vox_fem/mime.ogg',
|
||||
"mimes" = 'sound/vox_fem/mimes.ogg',
|
||||
"minefield" = 'sound/vox_fem/minefield.ogg',
|
||||
"miner" = 'sound/vox_fem/miner.ogg',
|
||||
"miners" = 'sound/vox_fem/miners.ogg',
|
||||
"minimum" = 'sound/vox_fem/minimum.ogg',
|
||||
"mining" = 'sound/vox_fem/mining.ogg',
|
||||
"minus" = 'sound/vox_fem/minus.ogg',
|
||||
"minutes" = 'sound/vox_fem/minutes.ogg',
|
||||
"mister" = 'sound/vox_fem/mister.ogg',
|
||||
@@ -473,6 +519,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"must" = 'sound/vox_fem/must.ogg',
|
||||
"my" = 'sound/vox_fem/my.ogg',
|
||||
"n" = 'sound/vox_fem/n.ogg',
|
||||
"n2o" = 'sound/vox_fem/n2o.ogg',
|
||||
"nanotrasen" = 'sound/vox_fem/nanotrasen.ogg',
|
||||
"nearest" = 'sound/vox_fem/nearest.ogg',
|
||||
"negative" = 'sound/vox_fem/negative.ogg',
|
||||
@@ -488,20 +535,25 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"not" = 'sound/vox_fem/not.ogg',
|
||||
"november" = 'sound/vox_fem/november.ogg',
|
||||
"now" = 'sound/vox_fem/now.ogg',
|
||||
"nuke" = 'sound/vox_fem/nuke.ogg',
|
||||
"number" = 'sound/vox_fem/number.ogg',
|
||||
"o" = 'sound/vox_fem/o.ogg',
|
||||
"objective" = 'sound/vox_fem/objective.ogg',
|
||||
"observation" = 'sound/vox_fem/observation.ogg',
|
||||
"obtain" = 'sound/vox_fem/obtain.ogg',
|
||||
"of" = 'sound/vox_fem/of.ogg',
|
||||
"office" = 'sound/vox_fem/office.ogg',
|
||||
"officer" = 'sound/vox_fem/officer.ogg',
|
||||
"ok" = 'sound/vox_fem/ok.ogg',
|
||||
"on" = 'sound/vox_fem/on.ogg',
|
||||
"one" = 'sound/vox_fem/one.ogg',
|
||||
"op" = 'sound/vox_fem/op.ogg',
|
||||
"open" = 'sound/vox_fem/open.ogg',
|
||||
"operating" = 'sound/vox_fem/operating.ogg',
|
||||
"operational" = 'sound/vox_fem/operational.ogg',
|
||||
"operations" = 'sound/vox_fem/operations.ogg',
|
||||
"operative" = 'sound/vox_fem/operative.ogg',
|
||||
"ops" = 'sound/vox_fem/ops.ogg',
|
||||
"option" = 'sound/vox_fem/option.ogg',
|
||||
"or" = 'sound/vox_fem/or.ogg',
|
||||
"order" = 'sound/vox_fem/order.ogg',
|
||||
@@ -526,7 +578,10 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"plasma" = 'sound/vox_fem/plasma.ogg',
|
||||
"platform" = 'sound/vox_fem/platform.ogg',
|
||||
"please" = 'sound/vox_fem/please.ogg',
|
||||
"pod" = 'sound/vox_fem/pod.ogg',
|
||||
"pods" = 'sound/vox_fem/pods.ogg',
|
||||
"point" = 'sound/vox_fem/point.ogg',
|
||||
"poly" = 'sound/vox_fem/poly.ogg',
|
||||
"port" = 'sound/vox_fem/port.ogg',
|
||||
"portal" = 'sound/vox_fem/portal.ogg',
|
||||
"power" = 'sound/vox_fem/power.ogg',
|
||||
@@ -540,6 +595,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"propulsion" = 'sound/vox_fem/propulsion.ogg',
|
||||
"prosecute" = 'sound/vox_fem/prosecute.ogg',
|
||||
"protective" = 'sound/vox_fem/protective.ogg',
|
||||
"pun" = 'sound/vox_fem/pun.ogg',
|
||||
"push" = 'sound/vox_fem/push.ogg',
|
||||
"q" = 'sound/vox_fem/q.ogg',
|
||||
"qm" = 'sound/vox_fem/qm.ogg',
|
||||
@@ -569,10 +625,12 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"released" = 'sound/vox_fem/released.ogg',
|
||||
"remaining" = 'sound/vox_fem/remaining.ogg',
|
||||
"removal" = 'sound/vox_fem/removal.ogg',
|
||||
"renault" = 'sound/vox_fem/renault.ogg',
|
||||
"renegade" = 'sound/vox_fem/renegade.ogg',
|
||||
"repair" = 'sound/vox_fem/repair.ogg',
|
||||
"report" = 'sound/vox_fem/report.ogg',
|
||||
"reports" = 'sound/vox_fem/reports.ogg',
|
||||
"representative" = 'sound/vox_fem/representative.ogg',
|
||||
"request" = 'sound/vox_fem/request.ogg',
|
||||
"requested" = 'sound/vox_fem/requested.ogg',
|
||||
"required" = 'sound/vox_fem/required.ogg',
|
||||
@@ -591,6 +649,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"room" = 'sound/vox_fem/room.ogg',
|
||||
"round" = 'sound/vox_fem/round.ogg',
|
||||
"run" = 'sound/vox_fem/run.ogg',
|
||||
"runtime" = 'sound/vox_fem/runtime.ogg',
|
||||
"s" = 'sound/vox_fem/s.ogg',
|
||||
"safe" = 'sound/vox_fem/safe.ogg',
|
||||
"safety" = 'sound/vox_fem/safety.ogg',
|
||||
@@ -601,6 +660,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"science" = 'sound/vox_fem/science.ogg',
|
||||
"scream" = 'sound/vox_fem/scream.ogg',
|
||||
"screen" = 'sound/vox_fem/screen.ogg',
|
||||
"scrubbers" = 'sound/vox_fem/scrubbers.ogg',
|
||||
"search" = 'sound/vox_fem/search.ogg',
|
||||
"second" = 'sound/vox_fem/second.ogg',
|
||||
"secondary" = 'sound/vox_fem/secondary.ogg',
|
||||
@@ -612,6 +672,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"select" = 'sound/vox_fem/select.ogg',
|
||||
"selected" = 'sound/vox_fem/selected.ogg',
|
||||
"sensors" = 'sound/vox_fem/sensors.ogg',
|
||||
"sequencer" = 'sound/vox_fem/sequencer.ogg',
|
||||
"service" = 'sound/vox_fem/service.ogg',
|
||||
"seven" = 'sound/vox_fem/seven.ogg',
|
||||
"seventeen" = 'sound/vox_fem/seventeen.ogg',
|
||||
@@ -642,6 +703,9 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"sixteen" = 'sound/vox_fem/sixteen.ogg',
|
||||
"sixty" = 'sound/vox_fem/sixty.ogg',
|
||||
"skipjack" = 'sound/vox_fem/skipjack.ogg',
|
||||
"skree" = 'sound/vox_fem/skree.ogg',
|
||||
"skrek" = 'sound/vox_fem/skrek.ogg',
|
||||
"skrell" = 'sound/vox_fem/skrell.ogg',
|
||||
"slime" = 'sound/vox_fem/slime.ogg',
|
||||
"slow" = 'sound/vox_fem/slow.ogg',
|
||||
"smoke" = 'sound/vox_fem/smoke.ogg',
|
||||
@@ -654,6 +718,9 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"son" = 'sound/vox_fem/son.ogg',
|
||||
"sorry" = 'sound/vox_fem/sorry.ogg',
|
||||
"south" = 'sound/vox_fem/south.ogg',
|
||||
"space" = 'sound/vox_fem/space.ogg',
|
||||
"spider" = 'sound/vox_fem/spider.ogg',
|
||||
"spiders" = 'sound/vox_fem/spiders.ogg',
|
||||
"squad" = 'sound/vox_fem/squad.ogg',
|
||||
"square" = 'sound/vox_fem/square.ogg',
|
||||
"ss13" = 'sound/vox_fem/ss13.ogg',
|
||||
@@ -664,8 +731,10 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"status" = 'sound/vox_fem/status.ogg',
|
||||
"sterile" = 'sound/vox_fem/sterile.ogg',
|
||||
"sterilization" = 'sound/vox_fem/sterilization.ogg',
|
||||
"still" = 'sound/vox_fem/still.ogg',
|
||||
"storage" = 'sound/vox_fem/storage.ogg',
|
||||
"stuck" = 'sound/vox_fem/stuck.ogg',
|
||||
"stupid" = 'sound/vox_fem/stupid.ogg',
|
||||
"sub" = 'sound/vox_fem/sub.ogg',
|
||||
"subsurface" = 'sound/vox_fem/subsurface.ogg',
|
||||
"sudden" = 'sound/vox_fem/sudden.ogg',
|
||||
@@ -679,7 +748,10 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"surrender" = 'sound/vox_fem/surrender.ogg',
|
||||
"surround" = 'sound/vox_fem/surround.ogg',
|
||||
"surrounded" = 'sound/vox_fem/surrounded.ogg',
|
||||
"swarmer" = 'sound/vox_fem/swarmer.ogg',
|
||||
"swarmers" = 'sound/vox_fem/swarmers.ogg',
|
||||
"switch" = 'sound/vox_fem/switch.ogg',
|
||||
"sword" = 'sound/vox_fem/sword.ogg',
|
||||
"syndicate" = 'sound/vox_fem/syndicate.ogg',
|
||||
"system" = 'sound/vox_fem/system.ogg',
|
||||
"systems" = 'sound/vox_fem/systems.ogg',
|
||||
@@ -692,13 +764,19 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"tank" = 'sound/vox_fem/tank.ogg',
|
||||
"target" = 'sound/vox_fem/target.ogg',
|
||||
"team" = 'sound/vox_fem/team.ogg',
|
||||
"technology" = 'sound/vox_fem/technology.ogg',
|
||||
"telecomms" = 'sound/vox_fem/telecomms.ogg',
|
||||
"teleport" = 'sound/vox_fem/teleport.ogg',
|
||||
"teleported" = 'sound/vox_fem/teleported.ogg',
|
||||
"teleporter" = 'sound/vox_fem/teleporter.ogg',
|
||||
"teleporting" = 'sound/vox_fem/teleporting.ogg',
|
||||
"temperature" = 'sound/vox_fem/temperature.ogg',
|
||||
"temporal" = 'sound/vox_fem/temporal.ogg',
|
||||
"ten" = 'sound/vox_fem/ten.ogg',
|
||||
"terminal" = 'sound/vox_fem/terminal.ogg',
|
||||
"terminated" = 'sound/vox_fem/terminated.ogg',
|
||||
"termination" = 'sound/vox_fem/termination.ogg',
|
||||
"tesla" = 'sound/vox_fem/tesla.ogg',
|
||||
"test" = 'sound/vox_fem/test.ogg',
|
||||
"that" = 'sound/vox_fem/that.ogg',
|
||||
"the" = 'sound/vox_fem/the.ogg',
|
||||
@@ -716,6 +794,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"tide" = 'sound/vox_fem/tide.ogg',
|
||||
"time" = 'sound/vox_fem/time.ogg',
|
||||
"to" = 'sound/vox_fem/to.ogg',
|
||||
"tool" = 'sound/vox_fem/tool.ogg',
|
||||
"top" = 'sound/vox_fem/top.ogg',
|
||||
"topside" = 'sound/vox_fem/topside.ogg',
|
||||
"touch" = 'sound/vox_fem/touch.ogg',
|
||||
@@ -735,6 +814,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"twenty" = 'sound/vox_fem/twenty.ogg',
|
||||
"two" = 'sound/vox_fem/two.ogg',
|
||||
"u" = 'sound/vox_fem/u.ogg',
|
||||
"unathi" = 'sound/vox_fem/unathi.ogg',
|
||||
"unauthorized" = 'sound/vox_fem/unauthorized.ogg',
|
||||
"under" = 'sound/vox_fem/under.ogg',
|
||||
"uniform" = 'sound/vox_fem/uniform.ogg',
|
||||
@@ -753,13 +833,16 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"used" = 'sound/vox_fem/used.ogg',
|
||||
"user" = 'sound/vox_fem/user.ogg',
|
||||
"v" = 'sound/vox_fem/v.ogg',
|
||||
"vacant" = 'sound/vox_fem/vacant.ogg',
|
||||
"vacate" = 'sound/vox_fem/vacate.ogg',
|
||||
"valid" = 'sound/vox_fem/valid.ogg',
|
||||
"vampire" = 'sound/vox_fem/vampire.ogg',
|
||||
"vampires" = 'sound/vox_fem/vampires.ogg',
|
||||
"vapor" = 'sound/vox_fem/vapor.ogg',
|
||||
"vault" = 'sound/vox_fem/vault.ogg',
|
||||
"vent" = 'sound/vox_fem/vent.ogg',
|
||||
"ventilation" = 'sound/vox_fem/ventilation.ogg',
|
||||
"vents" = 'sound/vox_fem/vents.ogg',
|
||||
"victor" = 'sound/vox_fem/victor.ogg',
|
||||
"violated" = 'sound/vox_fem/violated.ogg',
|
||||
"violation" = 'sound/vox_fem/violation.ogg',
|
||||
@@ -767,6 +850,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"voltage" = 'sound/vox_fem/voltage.ogg',
|
||||
"vox" = 'sound/vox_fem/vox.ogg',
|
||||
"vox_login" = 'sound/vox_fem/vox_login.ogg',
|
||||
"vulpkanin" = 'sound/vox_fem/vulpkanin.ogg',
|
||||
"w" = 'sound/vox_fem/w.ogg',
|
||||
"walk" = 'sound/vox_fem/walk.ogg',
|
||||
"wall" = 'sound/vox_fem/wall.ogg',
|
||||
@@ -783,12 +867,15 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"weapon" = 'sound/vox_fem/weapon.ogg',
|
||||
"weed" = 'sound/vox_fem/weed.ogg',
|
||||
"welcome" = 'sound/vox_fem/welcome.ogg',
|
||||
"weld" = 'sound/vox_fem/weld.ogg',
|
||||
"west" = 'sound/vox_fem/west.ogg',
|
||||
"whiskey" = 'sound/vox_fem/whiskey.ogg',
|
||||
"white" = 'sound/vox_fem/white.ogg',
|
||||
"wiggle" = 'sound/vox_fem/wiggle.ogg',
|
||||
"wilco" = 'sound/vox_fem/wilco.ogg',
|
||||
"will" = 'sound/vox_fem/will.ogg',
|
||||
"window" = 'sound/vox_fem/window.ogg',
|
||||
"windows" = 'sound/vox_fem/windows.ogg',
|
||||
"with" = 'sound/vox_fem/with.ogg',
|
||||
"without" = 'sound/vox_fem/without.ogg',
|
||||
"wizard" = 'sound/vox_fem/wizard.ogg',
|
||||
@@ -807,6 +894,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
|
||||
"year" = 'sound/vox_fem/year.ogg',
|
||||
"yellow" = 'sound/vox_fem/yellow.ogg',
|
||||
"yes" = 'sound/vox_fem/yes.ogg',
|
||||
"yet" = 'sound/vox_fem/yet.ogg',
|
||||
"you" = 'sound/vox_fem/you.ogg',
|
||||
"your" = 'sound/vox_fem/your.ogg',
|
||||
"yourself" = 'sound/vox_fem/yourself.ogg',
|
||||
|
||||
@@ -331,4 +331,4 @@
|
||||
/atom/movable/CanPass(atom/movable/mover, turf/target, height=1.5)
|
||||
if(buckled_mob == mover)
|
||||
return 1
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -91,6 +91,8 @@
|
||||
loc.visible_message("<span class='warning'>The corpse of [H.name] suddenly rises!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobspore/death()
|
||||
..()
|
||||
|
||||
// On death, create a small smoke of harmful gas (s-Acid)
|
||||
var/datum/effect/system/chem_smoke_spread/S = new
|
||||
var/turf/location = get_turf(src)
|
||||
@@ -108,7 +110,6 @@
|
||||
S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud
|
||||
S.start()
|
||||
|
||||
ghostize()
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobspore/Destroy()
|
||||
|
||||
@@ -72,7 +72,7 @@ rcd light flash thingy on matter drain
|
||||
if(T.z in config.station_levels)
|
||||
// Increase health by 37.5% of original max, decrease delays between shots to 66%
|
||||
turret.health += initial(turret.health) * 3 / 8
|
||||
turret.eprojectile = /obj/item/projectile/beam/heavylaser //Once you see it, you will know what it means to FEAR.
|
||||
turret.eprojectile = /obj/item/projectile/beam/laser/heavylaser //Once you see it, you will know what it means to FEAR.
|
||||
turret.eshot_sound = 'sound/weapons/lasercannonfire.ogg'
|
||||
to_chat(src, "<span class='notice'>Turrets upgraded.</span>")
|
||||
/datum/AI_Module/large/destroy_rcd
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
origin_tech = "materials=5;biotech=4;powerstorage=5;abductor=3"
|
||||
armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15)
|
||||
action_button_name = "Activate"
|
||||
action_button_is_hands_free = 1
|
||||
action_button_custom_type = /datum/action/item_action/hands_free
|
||||
var/mode = VEST_STEALTH
|
||||
var/stealth_active = 0
|
||||
var/combat_cooldown = 10
|
||||
@@ -308,14 +308,7 @@
|
||||
icon_state = "alienpistol"
|
||||
item_state = "alienpistol"
|
||||
origin_tech = "combat=5;materials=4;powerstorage=3;abductor=3"
|
||||
|
||||
/obj/item/weapon/gun/energy/decloner/alien/special_check(user)
|
||||
if(istype(user, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.get_species() != "Abductor")
|
||||
to_chat(user, "<span class='userdanger'>UNAUTHORIZED -- UNAUTHORIZED</span>")
|
||||
return 0
|
||||
return 1
|
||||
restricted_species = list("Abductor")
|
||||
|
||||
/obj/item/weapon/paper/abductor
|
||||
name = "Dissection Guide"
|
||||
@@ -631,4 +624,4 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
icon_state = "abductor"
|
||||
icon_closed = "abductor"
|
||||
icon_opened = "abductoropen"
|
||||
material_drop = /obj/item/stack/sheet/mineral/abductor
|
||||
material_drop = /obj/item/stack/sheet/mineral/abductor
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
/datum/theft_objective/hoslaser
|
||||
name = "the head of security's recreated antique laser gun"
|
||||
typepath = /obj/item/weapon/gun/energy/hos
|
||||
typepath = /obj/item/weapon/gun/energy/gun/hos
|
||||
protected_jobs = list("Head Of Security")
|
||||
|
||||
/datum/theft_objective/hand_tele
|
||||
@@ -244,4 +244,4 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/device/aicard/C)
|
||||
typepath = /obj/item/stack/sheet/mineral/uranium
|
||||
min=10
|
||||
max=30
|
||||
step=5
|
||||
step=5
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
if(!summon_type)
|
||||
switch (randomizeguns)
|
||||
if("taser")
|
||||
new /obj/item/weapon/gun/energy/advtaser(get_turf(H))
|
||||
new /obj/item/weapon/gun/energy/gun/advtaser(get_turf(H))
|
||||
if("egun")
|
||||
new /obj/item/weapon/gun/energy/gun(get_turf(H))
|
||||
if("laser")
|
||||
@@ -34,7 +34,7 @@
|
||||
if("gyrojet")
|
||||
new /obj/item/weapon/gun/projectile/automatic/gyropistol(get_turf(H))
|
||||
if("pulse")
|
||||
new /obj/item/weapon/gun/energy/pulse_rifle(get_turf(H))
|
||||
new /obj/item/weapon/gun/energy/pulse(get_turf(H))
|
||||
if("suppressed")
|
||||
new /obj/item/weapon/gun/projectile/automatic/pistol(get_turf(H))
|
||||
new /obj/item/weapon/suppressor(get_turf(H))
|
||||
@@ -71,7 +71,7 @@
|
||||
if("turret")
|
||||
new /obj/item/weapon/gun/energy/gun/turret(get_turf(H))
|
||||
if("pulsecarbine")
|
||||
new /obj/item/weapon/gun/energy/pulse_rifle/carbine(get_turf(H))
|
||||
new /obj/item/weapon/gun/energy/pulse/carbine(get_turf(H))
|
||||
if("decloner")
|
||||
new /obj/item/weapon/gun/energy/decloner(get_turf(H))
|
||||
if("mindflayer")
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
|
||||
// H.equip_or_collect(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk
|
||||
H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_s_store)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
|
||||
if(H.backbag == 1)
|
||||
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
|
||||
H.equip_or_collect(new /obj/item/weapon/restraints/handcuffs(H), slot_l_hand)
|
||||
@@ -175,7 +175,7 @@
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head)
|
||||
H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda)
|
||||
H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_s_store)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
|
||||
H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
|
||||
if(H.backbag == 1)
|
||||
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
|
||||
@@ -249,7 +249,7 @@
|
||||
H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
|
||||
H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda)
|
||||
H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_s_store)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
|
||||
H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
|
||||
if(H.backbag == 1)
|
||||
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
|
||||
|
||||
@@ -174,10 +174,10 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
|
||||
if(H.backbag == 1)
|
||||
H.equip_or_collect(new /obj/item/weapon/storage/box/deathimp(H), slot_r_hand)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/blueshield(H), slot_l_hand)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/blueshield(H), slot_l_hand)
|
||||
else
|
||||
H.equip_or_collect(new /obj/item/weapon/storage/box/deathimp(H.back), slot_in_backpack)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/blueshield(H.back), slot_in_backpack)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/blueshield(H.back), slot_in_backpack)
|
||||
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
|
||||
L.imp_in = H
|
||||
L.implanted = 1
|
||||
@@ -263,4 +263,4 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
L.imp_in = H
|
||||
L.implanted = 1
|
||||
H.sec_hud_set_implants()
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -244,6 +244,10 @@
|
||||
H.equip_or_collect(new /obj/item/toy/crayon/rainbow(H), slot_in_backpack)
|
||||
H.equip_or_collect(new /obj/item/weapon/storage/fancy/crayons(H), slot_in_backpack)
|
||||
H.equip_or_collect(new /obj/item/weapon/reagent_containers/spray/waterflower(H), slot_in_backpack)
|
||||
if(H.get_species() == "Machine")
|
||||
var/obj/item/organ/internal/cyberimp/brain/clown_voice/implant
|
||||
implant = new
|
||||
implant.insert(H)
|
||||
H.mutations.Add(CLUMSY)
|
||||
H.dna.SetSEState(COMICBLOCK,1,1)
|
||||
genemutcheck(H,COMICBLOCK,null,MUTCHK_FORCED)
|
||||
|
||||
@@ -2,11 +2,12 @@
|
||||
name = "Virtual Gameboard"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "gboard_on"
|
||||
desc = "A holographic table allowing the crew to have fun™ on boring shifts! One player per board."
|
||||
desc = "A holographic table allowing the crew to have fun(TM) on boring shifts! One player per board."
|
||||
density = 1
|
||||
anchored = 1
|
||||
use_power = 1
|
||||
var/cooling_down = 0
|
||||
light_color = LIGHT_COLOR_LIGHTBLUE
|
||||
|
||||
/obj/machinery/gameboard/New()
|
||||
..()
|
||||
@@ -20,6 +21,10 @@
|
||||
/obj/machinery/gameboard/power_change()
|
||||
. = ..()
|
||||
update_icon()
|
||||
if(stat & NOPOWER)
|
||||
set_light(0)
|
||||
else
|
||||
set_light(3, 3)
|
||||
|
||||
/obj/machinery/gameboard/update_icon()
|
||||
if(stat & NOPOWER)
|
||||
@@ -34,6 +39,9 @@
|
||||
if(src.in_use)
|
||||
to_chat(user, "This gameboard is already in use!")
|
||||
return
|
||||
if(!anchored)
|
||||
to_chat(user, "The gameboard is not secured!")
|
||||
return
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/gameboard/interact(mob/user)
|
||||
@@ -68,10 +76,10 @@
|
||||
/obj/machinery/gameboard/Topic(var/href, var/list/href_list)
|
||||
. = ..()
|
||||
var/prize = /obj/item/stack/tickets
|
||||
if (.)
|
||||
if(.)
|
||||
return
|
||||
|
||||
if (href_list["checkmate"])
|
||||
if(href_list["checkmate"])
|
||||
if(cooling_down)
|
||||
message_admins("Too many checkmates on chessboard, possible HREF exploits: [key_name_admin(usr)] on [src] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
return
|
||||
@@ -82,5 +90,11 @@
|
||||
spawn(600)
|
||||
cooling_down = 0
|
||||
|
||||
if (href_list["close"])
|
||||
if(href_list["close"])
|
||||
close_game()
|
||||
|
||||
/obj/machinery/gameboard/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob, params)
|
||||
if(istype(G, /obj/item/weapon/wrench))
|
||||
default_unfasten_wrench(user, G)
|
||||
else if(istype(G, /obj/item/weapon/crowbar))
|
||||
default_deconstruction_crowbar(G, ignore_panel = 1)
|
||||
|
||||
@@ -99,13 +99,12 @@
|
||||
one_access = 0
|
||||
|
||||
/obj/machinery/porta_turret/proc/setup()
|
||||
var/obj/item/weapon/gun/energy/E = installation //All energy-based weapons are applicable
|
||||
if(istext(installation)) E = text2path(installation)
|
||||
//var/obj/item/ammo_casing/shottype = E.projectile_type
|
||||
var/obj/item/weapon/gun/energy/E= new installation //All energy-based weapons are applicable
|
||||
var/obj/item/ammo_casing/shottype = E.ammo_type[1]
|
||||
|
||||
projectile = initial(E.projectile_type)
|
||||
projectile = shottype.projectile_type
|
||||
eprojectile = projectile
|
||||
shot_sound = initial(E.fire_sound)
|
||||
shot_sound = shottype.fire_sound
|
||||
eshot_sound = shot_sound
|
||||
|
||||
weapon_setup(installation)
|
||||
@@ -561,9 +560,6 @@ var/list/turret_icons
|
||||
if(get_dist(src, L) > 7) //if it's too far away, why bother?
|
||||
return TURRET_NOT_TARGET
|
||||
|
||||
if(!check_trajectory(L, src)) //check if we have true line of sight
|
||||
return TURRET_NOT_TARGET
|
||||
|
||||
if(emagged) // If emagged not even the dead get a rest
|
||||
return L.stat ? TURRET_SECONDARY_TARGET : TURRET_PRIORITY_TARGET
|
||||
|
||||
@@ -670,6 +666,8 @@ var/list/turret_icons
|
||||
return
|
||||
|
||||
/obj/machinery/porta_turret/proc/shootAt(var/mob/living/target)
|
||||
if(!raised) //the turret has to be raised in order to fire - makes sense, right?
|
||||
return
|
||||
//any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power!
|
||||
if(!emagged) //if it hasn't been emagged, it has to obey a cooldown rate
|
||||
if(last_fired || !raised) //prevents rapid-fire shooting, unless it's been emagged
|
||||
@@ -684,10 +682,6 @@ var/list/turret_icons
|
||||
if(!istype(T) || !istype(U))
|
||||
return
|
||||
|
||||
if(!raised) //the turret has to be raised in order to fire - makes sense, right?
|
||||
return
|
||||
|
||||
|
||||
update_icon()
|
||||
var/obj/item/projectile/A
|
||||
if(emagged || lethal)
|
||||
@@ -698,18 +692,17 @@ var/list/turret_icons
|
||||
if(projectile)
|
||||
A = new projectile(loc)
|
||||
playsound(loc, shot_sound, 75, 1)
|
||||
A.original = target
|
||||
|
||||
// Lethal/emagged turrets use twice the power due to higher energy beams
|
||||
// Emagged turrets again use twice as much power due to higher firing rates
|
||||
use_power(reqpower * (2 * (emagged || lethal)) * (2 * emagged))
|
||||
|
||||
//Shooting Code:
|
||||
A.original = target
|
||||
A.current = T
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
spawn(1)
|
||||
A.process()
|
||||
A.fire()
|
||||
return A
|
||||
|
||||
/datum/turret_checks
|
||||
var/enabled
|
||||
|
||||
@@ -203,7 +203,8 @@
|
||||
if(istype(O,/obj/item/weapon/gun/energy/disabler/cyborg))
|
||||
var/obj/item/weapon/gun/energy/disabler/cyborg/D = O
|
||||
if(D.power_supply.charge < D.power_supply.maxcharge)
|
||||
D.power_supply.give(D.charge_cost)
|
||||
var/obj/item/ammo_casing/energy/E = D.ammo_type[D.select]
|
||||
D.power_supply.give(E.e_cost)
|
||||
D.update_icon()
|
||||
else
|
||||
D.charge_tick = 0
|
||||
|
||||
@@ -387,7 +387,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
|
||||
src.receive_information(signal, src)
|
||||
|
||||
// Try sending it!
|
||||
var/list/try_send = list("/obj/machinery/telecomms/server", "/obj/machinery/telecomms/hub", "/obj/machinery/telecomms/broadcaster", "/obj/machinery/telecomms/bus")
|
||||
var/list/try_send = list("/obj/machinery/telecomms/server", "/obj/machinery/telecomms/hub", "/obj/machinery/telecomms/broadcaster")
|
||||
var/i = 0
|
||||
for(var/send in try_send)
|
||||
if(i)
|
||||
|
||||
@@ -227,15 +227,15 @@
|
||||
if(1)
|
||||
A = new /obj/item/projectile/beam(loc)
|
||||
if(2)
|
||||
A = new /obj/item/projectile/beam/heavylaser(loc)
|
||||
A = new /obj/item/projectile/beam/laser/heavylaser(loc)
|
||||
if(3)
|
||||
A = new /obj/item/projectile/beam/pulse(loc)
|
||||
if(4)
|
||||
A = new /obj/item/projectile/magic/change(loc)
|
||||
if(5)
|
||||
A = new /obj/item/projectile/lasertag/blue(loc)
|
||||
A = new /obj/item/projectile/beam/lasertag/bluetag(loc)
|
||||
if(6)
|
||||
A = new /obj/item/projectile/lasertag/red(loc)
|
||||
A = new /obj/item/projectile/beam/lasertag/redtag(loc)
|
||||
A.original = target
|
||||
use_power(500)
|
||||
else
|
||||
@@ -248,8 +248,7 @@
|
||||
A.current = T
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
spawn( 0 )
|
||||
A.process()
|
||||
A.fire()
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -849,7 +849,7 @@
|
||||
product_ads = "Float like an astronaut, sting like a bullet!;Express your second amendment today!;Guns don't kill people, but you can!;Who needs responsibilities when you have guns?"
|
||||
vend_reply = "Remember the name: Liberation Station!"
|
||||
products = list(/obj/item/weapon/gun/projectile/automatic/pistol/deagle/gold = 2,/obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo = 2,
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol/m2411 = 2,/obj/item/weapon/gun/projectile/automatic/proto = 2,
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol/m1911 = 2,/obj/item/weapon/gun/projectile/automatic/proto = 2,
|
||||
/obj/item/weapon/gun/projectile/shotgun/automatic/combat = 2,/obj/item/weapon/gun/projectile/automatic/gyropistol = 1,
|
||||
/obj/item/weapon/gun/projectile/shotgun = 2,/obj/item/weapon/gun/projectile/automatic/ar = 2)
|
||||
premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2,/obj/item/ammo_box/magazine/m50 = 4,/obj/item/ammo_box/magazine/m45 = 2,/obj/item/ammo_box/magazine/m75 = 2)
|
||||
|
||||
@@ -384,7 +384,7 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
|
||||
name = "Syringe Gun"
|
||||
desc = "Exosuit-mounted chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur. (Can be attached to: Medical Exosuits)"
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon = 'icons/obj/guns/projectile.dmi'
|
||||
icon_state = "syringegun"
|
||||
item_state = "syringegun"
|
||||
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
|
||||
@@ -666,4 +666,4 @@
|
||||
for(var/reagent in S.processed_reagents)
|
||||
S.reagents.add_reagent(reagent,amount)
|
||||
S.chassis.use_power(energy_drain)
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
var/projectile
|
||||
var/fire_sound
|
||||
var/size=0
|
||||
var/projectiles_per_shot = 1
|
||||
var/variance = 0
|
||||
var/randomspread = 0 //use random spread for machineguns, instead of shotgun scatter
|
||||
var/projectile_delay = 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(var/obj/mecha/combat/M as obj)
|
||||
if(..())
|
||||
@@ -16,32 +20,51 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/proc/get_shot_amount()
|
||||
return projectiles_per_shot
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy
|
||||
name = "General Energy Weapon"
|
||||
size = 2
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
var/turf/curloc = chassis.loc
|
||||
var/atom/targloc = get_turf(target)
|
||||
if (!targloc || !istype(targloc, /turf) || !curloc)
|
||||
return
|
||||
if (targloc == curloc)
|
||||
return
|
||||
set_ready_state(0)
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/action(target, params)
|
||||
if(!action_checks(target))
|
||||
return 0
|
||||
|
||||
var/turf/curloc = get_turf(chassis)
|
||||
var/turf/targloc = get_turf(target)
|
||||
if (!targloc || !istype(targloc) || !curloc)
|
||||
return 0
|
||||
if (targloc == curloc)
|
||||
return 0
|
||||
|
||||
set_ready_state(0)
|
||||
for(var/i=1 to get_shot_amount())
|
||||
var/obj/item/projectile/A = new projectile(curloc)
|
||||
A.firer = chassis.occupant
|
||||
A.original = target
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
chassis.use_power(energy_drain)
|
||||
A.process()
|
||||
chassis.log_message("Fired from [src.name], targeting [target].")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
var/spread = 0
|
||||
if(variance)
|
||||
if(randomspread)
|
||||
spread = round((rand() - 0.5) * variance)
|
||||
else
|
||||
spread = round((i / projectiles_per_shot - 0.5) * variance)
|
||||
A.preparePixelProjectile(target, targloc, chassis.occupant, params, spread)
|
||||
|
||||
chassis.use_power(energy_drain)
|
||||
A.fire()
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
|
||||
sleep(max(0, projectile_delay))
|
||||
set_ready_state(0)
|
||||
log_message("Fired from [name], targeting [target].")
|
||||
var/turf/T = get_turf(src)
|
||||
msg_admin_attack("[key_name_admin(chassis.occupant)] fired a [src] in ([T.x], [T.y], [T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
|
||||
log_game("[key_name(chassis.occupant)] fired a [src] in [T.x], [T.y], [T.z]")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy
|
||||
name = "General Energy Weapon"
|
||||
size = 2
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
|
||||
equip_cooldown = 8
|
||||
@@ -56,7 +79,7 @@
|
||||
name = "CH-LC \"Solaris\" Laser Cannon"
|
||||
icon_state = "mecha_laser"
|
||||
energy_drain = 40
|
||||
projectile = /obj/item/projectile/beam/heavylaser
|
||||
projectile = /obj/item/projectile/beam/laser/heavylaser
|
||||
fire_sound = 'sound/weapons/lasercannonfire.ogg'
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion
|
||||
@@ -82,25 +105,25 @@
|
||||
icon_state = "pulse1_bl"
|
||||
var/life = 20
|
||||
|
||||
Bump(atom/A)
|
||||
A.bullet_act(src, def_zone)
|
||||
src.life -= 10
|
||||
if(ismob(A))
|
||||
var/mob/M = A
|
||||
if(istype(firer, /mob))
|
||||
M.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
|
||||
firer.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
|
||||
log_attack("<font color='red'>[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src]</font>")
|
||||
if(!iscarbon(firer))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = firer
|
||||
/obj/item/projectile/beam/pulse/heavy/Bump(atom/A)
|
||||
A.bullet_act(src, def_zone)
|
||||
life -= 10
|
||||
if(ismob(A))
|
||||
var/mob/M = A
|
||||
if(istype(firer, /mob))
|
||||
M.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
|
||||
firer.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
|
||||
log_attack("<font color='red'>[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src]</font>")
|
||||
if(!iscarbon(firer))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.attack_log += "\[[time_stamp()]\] <b>UNKNOWN SUBJECT (No longer exists)</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
|
||||
log_attack("<font color='red'>UNKNOWN shot [M] ([M.ckey]) with a [src]</font>")
|
||||
if(life <= 0)
|
||||
qdel(src)
|
||||
return
|
||||
M.LAssailant = firer
|
||||
else
|
||||
M.attack_log += "\[[time_stamp()]\] <b>UNKNOWN SUBJECT (No longer exists)</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
|
||||
log_attack("<font color='red'>UNKNOWN shot [M] ([M.ckey]) with a [src]</font>")
|
||||
if(life <= 0)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser
|
||||
@@ -119,89 +142,89 @@
|
||||
equip_cooldown = 150
|
||||
range = MELEE|RANGED
|
||||
|
||||
can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/honker/can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/honker/action(target, params)
|
||||
if(!chassis)
|
||||
return 0
|
||||
if(energy_drain && chassis.get_charge() < energy_drain)
|
||||
return 0
|
||||
if(!equip_ready)
|
||||
return 0
|
||||
|
||||
action(target)
|
||||
if(!chassis)
|
||||
return 0
|
||||
if(energy_drain && chassis.get_charge() < energy_drain)
|
||||
return 0
|
||||
if(!equip_ready)
|
||||
return 0
|
||||
playsound(chassis, 'sound/items/AirHorn.ogg', 100, 1)
|
||||
chassis.occupant_message("<font color='red' size='5'>HONK</font>")
|
||||
for(var/mob/living/carbon/M in ohearers(6, chassis))
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs))
|
||||
continue
|
||||
to_chat(M, "<font color='red' size='7'>HONK</font>")
|
||||
M.sleeping = 0
|
||||
M.stuttering = 20
|
||||
M.ear_deaf = 30
|
||||
M.Weaken(3)
|
||||
if(prob(30))
|
||||
M.Stun(10)
|
||||
M.Paralyse(4)
|
||||
else
|
||||
M.Jitter(500)
|
||||
///else the mousetraps are useless
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(isobj(H.shoes))
|
||||
var/thingy = H.shoes
|
||||
H.unEquip(H.shoes)
|
||||
walk_away(thingy,chassis,15,2)
|
||||
spawn(20)
|
||||
if(thingy)
|
||||
walk(thingy,0)
|
||||
for(var/obj/mecha/combat/recitence/R in oview(6, chassis))
|
||||
R.occupant_message("\The [R] has protected you from [chassis]'s HONK at the cost of some power.")
|
||||
R.use_power(R.get_charge() / 4)
|
||||
|
||||
playsound(chassis, 'sound/items/AirHorn.ogg', 100, 1)
|
||||
chassis.occupant_message("<font color='red' size='5'>HONK</font>")
|
||||
for(var/mob/living/carbon/M in ohearers(6, chassis))
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs))
|
||||
continue
|
||||
to_chat(M, "<font color='red' size='7'>HONK</font>")
|
||||
M.sleeping = 0
|
||||
M.stuttering = 20
|
||||
M.ear_deaf = 30
|
||||
M.Weaken(3)
|
||||
if(prob(30))
|
||||
M.Stun(10)
|
||||
M.Paralyse(4)
|
||||
else
|
||||
M.Jitter(500)
|
||||
///else the mousetraps are useless
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(isobj(H.shoes))
|
||||
var/thingy = H.shoes
|
||||
H.unEquip(H.shoes)
|
||||
walk_away(thingy,chassis,15,2)
|
||||
spawn(20)
|
||||
if(thingy)
|
||||
walk(thingy,0)
|
||||
for(var/obj/mecha/combat/recitence/R in oview(6, chassis))
|
||||
R.occupant_message("\The [R] has protected you from [chassis]'s HONK at the cost of some power.")
|
||||
R.use_power(R.get_charge() / 4)
|
||||
|
||||
chassis.use_power(energy_drain)
|
||||
log_message("Honked from [src.name]. HONK!")
|
||||
var/turf/T = get_turf(src)
|
||||
msg_admin_attack("[key_name_admin(chassis.occupant)] used a Mecha Honker in ([T.x], [T.y], [T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
|
||||
log_game("[key_name(chassis.occupant)] used a Mecha Honker in [T.x], [T.y], [T.z]")
|
||||
do_after_cooldown()
|
||||
return
|
||||
chassis.use_power(energy_drain)
|
||||
log_message("Honked from [name]. HONK!")
|
||||
var/turf/T = get_turf(src)
|
||||
msg_admin_attack("[key_name_admin(chassis.occupant)] used a Mecha Honker in ([T.x], [T.y], [T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
|
||||
log_game("[key_name(chassis.occupant)] used a Mecha Honker in [T.x], [T.y], [T.z]")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic
|
||||
name = "General Ballisic Weapon"
|
||||
var/projectiles
|
||||
var/projectile_energy_cost
|
||||
size = 2
|
||||
action_checks(atom/target)
|
||||
if(..())
|
||||
if(projectiles > 0)
|
||||
return 1
|
||||
return 0
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action_checks(atom/target)
|
||||
if(..())
|
||||
if(projectiles > 0)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
get_equip_info()
|
||||
return "[..()]\[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - <a href='?src=\ref[src];rearm=1'>Rearm</a>":null]"
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_equip_info()
|
||||
return "[..()]\[[projectiles]\][(projectiles < initial(projectiles))?" - <a href='?src=\ref[src];rearm=1'>Rearm</a>":null]"
|
||||
|
||||
proc/rearm()
|
||||
if(projectiles < initial(projectiles))
|
||||
var/projectiles_to_add = initial(projectiles) - projectiles
|
||||
while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add)
|
||||
projectiles++
|
||||
projectiles_to_add--
|
||||
chassis.use_power(projectile_energy_cost)
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
log_message("Rearmed [src.name].")
|
||||
return
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/proc/rearm()
|
||||
if(projectiles < initial(projectiles))
|
||||
var/projectiles_to_add = initial(projectiles) - projectiles
|
||||
while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add)
|
||||
projectiles++
|
||||
projectiles_to_add--
|
||||
chassis.use_power(projectile_energy_cost)
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",get_equip_info())
|
||||
log_message("Rearmed [name].")
|
||||
return
|
||||
|
||||
Topic(href, href_list)
|
||||
..()
|
||||
if (href_list["rearm"])
|
||||
src.rearm()
|
||||
return
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/Topic(href, href_list)
|
||||
..()
|
||||
if (href_list["rearm"])
|
||||
rearm()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine
|
||||
name = "FNX-66 Carbine"
|
||||
@@ -211,41 +234,6 @@
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
projectiles = 24
|
||||
projectile_energy_cost = 15
|
||||
var/projectiles_per_shot = 1
|
||||
var/deviation = 0.0
|
||||
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
var/turf/targloc = get_turf(target)
|
||||
var/target_x = targloc.x
|
||||
var/target_y = targloc.y
|
||||
var/target_z = targloc.z
|
||||
targloc = null
|
||||
spawn for(var/i=1 to min(projectiles, projectiles_per_shot))
|
||||
if(!chassis) break
|
||||
var/turf/curloc = get_turf(chassis)
|
||||
targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z)
|
||||
if (!targloc || !curloc)
|
||||
continue
|
||||
if (targloc == curloc)
|
||||
continue
|
||||
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
var/obj/item/projectile/A = new projectile(curloc)
|
||||
src.projectiles--
|
||||
A.original = target
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
A.process()
|
||||
sleep(2)
|
||||
set_ready_state(0)
|
||||
log_message("Fired from [src.name], targeting [target].")
|
||||
var/turf/T = get_turf(src)
|
||||
msg_admin_attack("[key_name_admin(chassis.occupant)] fired a [src] in ([T.x], [T.y], [T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
|
||||
log_game("[key_name(chassis.occupant)] fired a [src] in [T.x], [T.y], [T.z]")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine/silenced
|
||||
name = "\improper S.H.H. \"Quietus\" Carbine"
|
||||
@@ -270,36 +258,8 @@
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
projectiles = 40
|
||||
projectile_energy_cost = 25
|
||||
var/projectiles_per_shot = 4
|
||||
var/deviation = 0.7
|
||||
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
var/turf/curloc = get_turf(chassis)
|
||||
var/turf/targloc = get_turf(target)
|
||||
if(!curloc || !targloc) return
|
||||
var/target_x = targloc.x
|
||||
var/target_y = targloc.y
|
||||
var/target_z = targloc.z
|
||||
targloc = null
|
||||
for(var/i=1 to min(projectiles, projectiles_per_shot))
|
||||
targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z)
|
||||
if(!targloc || targloc == curloc)
|
||||
break
|
||||
playsound(chassis, fire_sound, 80, 1)
|
||||
var/obj/item/projectile/A = new projectile(curloc)
|
||||
src.projectiles--
|
||||
A.original = target
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
set_ready_state(0)
|
||||
A.process()
|
||||
log_message("Fired from [src.name], targeting [target].")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
|
||||
projectiles_per_shot = 4
|
||||
variance = 25
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
|
||||
name = "Ultra AC 2"
|
||||
@@ -309,38 +269,9 @@
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
projectiles = 300
|
||||
projectile_energy_cost = 20
|
||||
var/projectiles_per_shot = 3
|
||||
var/deviation = 0.3
|
||||
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
var/turf/targloc = get_turf(target)
|
||||
var/target_x = targloc.x
|
||||
var/target_y = targloc.y
|
||||
var/target_z = targloc.z
|
||||
targloc = null
|
||||
spawn for(var/i=1 to min(projectiles, projectiles_per_shot))
|
||||
if(!chassis) break
|
||||
var/turf/curloc = get_turf(chassis)
|
||||
targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z)
|
||||
if (!targloc || !curloc)
|
||||
continue
|
||||
if (targloc == curloc)
|
||||
continue
|
||||
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
var/obj/item/projectile/A = new projectile(curloc)
|
||||
src.projectiles--
|
||||
A.original = target
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
A.process()
|
||||
sleep(2)
|
||||
set_ready_state(0)
|
||||
log_message("Fired from [src.name], targeting [target].")
|
||||
do_after_cooldown()
|
||||
return
|
||||
projectiles_per_shot = 3
|
||||
variance = 6
|
||||
projectile_delay = 2
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
|
||||
name = "SRM-8 Missile Rack"
|
||||
@@ -353,20 +284,21 @@
|
||||
var/missile_speed = 2
|
||||
var/missile_range = 30
|
||||
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
set_ready_state(0)
|
||||
var/obj/item/missile/M = new projectile(chassis.loc)
|
||||
M.primed = 1
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
M.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Fired from [src.name], targeting [target].")
|
||||
var/turf/T = get_turf(src)
|
||||
msg_admin_attack("[key_name_admin(chassis.occupant)] fired a [src] in ([T.x], [T.y], [T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
|
||||
log_game("[key_name(chassis.occupant)] fired a [src] in [T.x], [T.y], [T.z]")
|
||||
do_after_cooldown()
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/action(target, params)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
set_ready_state(0)
|
||||
var/obj/item/missile/M = new projectile(chassis.loc)
|
||||
M.primed = 1
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
M.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Fired from [name], targeting [target].")
|
||||
var/turf/T = get_turf(src)
|
||||
msg_admin_attack("[key_name_admin(chassis.occupant)] fired a [src] in ([T.x], [T.y], [T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
|
||||
log_game("[key_name(chassis.occupant)] fired a [src] in [T.x], [T.y], [T.z]")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/missile
|
||||
@@ -375,13 +307,13 @@
|
||||
var/primed = null
|
||||
throwforce = 15
|
||||
|
||||
throw_impact(atom/hit_atom)
|
||||
if(primed)
|
||||
explosion(hit_atom, 0, 0, 2, 4, 0)
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
return
|
||||
/obj/item/missile/throw_impact(atom/hit_atom)
|
||||
if(primed)
|
||||
explosion(hit_atom, 0, 0, 2, 4, 0)
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
|
||||
name = "SGL-6 Grenade Launcher"
|
||||
@@ -394,18 +326,19 @@
|
||||
equip_cooldown = 60
|
||||
var/det_time = 20
|
||||
size=1
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
set_ready_state(0)
|
||||
var/obj/item/weapon/grenade/flashbang/F = new projectile(chassis.loc)
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
F.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Fired from [src.name], targeting [target].")
|
||||
spawn(det_time)
|
||||
F.prime()
|
||||
do_after_cooldown()
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/action(target, params)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
set_ready_state(0)
|
||||
var/obj/item/weapon/grenade/flashbang/F = new projectile(chassis.loc)
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
F.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Fired from [name], targeting [target].")
|
||||
spawn(det_time)
|
||||
F.prime()
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang//Because I am a heartless bastard -Sieve
|
||||
name = "SOB-3 Grenade Launcher"
|
||||
@@ -417,7 +350,7 @@
|
||||
size=1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/get_equip_info()//Limited version of the clusterbang launcher that can't reload
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [chassis.selected==src?"<b>":"<a href='?src=\ref[chassis];select_equip=\ref[src]'>"][src.name][chassis.selected==src?"</b>":"</a>"]\[[src.projectiles]\]"
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [chassis.selected==src?"<b>":"<a href='?src=\ref[chassis];select_equip=\ref[src]'>"][name][chassis.selected==src?"</b>":"</a>"]\[[projectiles]\]"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/rearm()
|
||||
return//Extra bit of security
|
||||
@@ -432,22 +365,23 @@
|
||||
projectile_energy_cost = 100
|
||||
equip_cooldown = 20
|
||||
|
||||
can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar/can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
set_ready_state(0)
|
||||
var/obj/item/weapon/bananapeel/B = new projectile(chassis.loc)
|
||||
playsound(chassis, fire_sound, 60, 1)
|
||||
B.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Bananed from [src.name], targeting [target]. HONK!")
|
||||
do_after_cooldown()
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar/action(target, params)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
set_ready_state(0)
|
||||
var/obj/item/weapon/bananapeel/B = new projectile(chassis.loc)
|
||||
playsound(chassis, fire_sound, 60, 1)
|
||||
B.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Bananed from [name], targeting [target]. HONK!")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar
|
||||
@@ -460,23 +394,24 @@
|
||||
projectile_energy_cost = 100
|
||||
equip_cooldown = 10
|
||||
|
||||
can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar/can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
set_ready_state(0)
|
||||
var/obj/item/device/assembly/mousetrap/M = new projectile(chassis.loc)
|
||||
M.secured = 1
|
||||
playsound(chassis, fire_sound, 60, 1)
|
||||
M.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Launched a mouse-trap from [src.name], targeting [target]. HONK!")
|
||||
do_after_cooldown()
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar/action(target, params)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
set_ready_state(0)
|
||||
var/obj/item/device/assembly/mousetrap/M = new projectile(chassis.loc)
|
||||
M.secured = 1
|
||||
playsound(chassis, fire_sound, 60, 1)
|
||||
M.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Launched a mouse-trap from [name], targeting [target]. HONK!")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas
|
||||
name = "PCMK-6 Bolas Launcher"
|
||||
@@ -489,23 +424,24 @@
|
||||
projectile_energy_cost = 50
|
||||
equip_cooldown = 10
|
||||
|
||||
can_attach(obj/mecha/combat/gygax/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas/can_attach(obj/mecha/combat/gygax/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
set_ready_state(0)
|
||||
var/obj/item/weapon/legcuffs/bolas/M = new projectile(chassis.loc)
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
M.thrown_from = src
|
||||
M.throw_at(target, missile_range, missile_speed)
|
||||
projectiles--
|
||||
log_message("Fired from [src.name], targeting [target].")
|
||||
do_after_cooldown()
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas/action(target, params)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
set_ready_state(0)
|
||||
var/obj/item/weapon/legcuffs/bolas/M = new projectile(chassis.loc)
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
M.thrown_from = src
|
||||
M.throw_at(target, missile_range, missile_speed)
|
||||
projectiles--
|
||||
log_message("Fired from [name], targeting [target].")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma
|
||||
equip_cooldown = 20
|
||||
|
||||
@@ -219,7 +219,7 @@
|
||||
// return ..()
|
||||
*/
|
||||
|
||||
/obj/mecha/proc/click_action(atom/target,mob/user)
|
||||
/obj/mecha/proc/click_action(atom/target, mob/user, params)
|
||||
if(!src.occupant || src.occupant != user ) return
|
||||
if(user.stat || !user.canmove)
|
||||
return
|
||||
@@ -239,9 +239,9 @@
|
||||
return
|
||||
if(!target.Adjacent(src))
|
||||
if(selected && selected.is_ranged())
|
||||
selected.action(target)
|
||||
selected.action(target, params)
|
||||
else if(selected && selected.is_melee())
|
||||
selected.action(target)
|
||||
selected.action(target, params)
|
||||
else
|
||||
if(internal_damage&MECHA_INT_CONTROL_LOST)
|
||||
target = safepick(oview(1,src))
|
||||
@@ -1991,4 +1991,4 @@
|
||||
|
||||
|
||||
/obj/mecha/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
|
||||
flick_overlay(image('icons/mob/talk.dmi', bubble_loc, bubble_state,MOB_LAYER+1), bubble_recipients, 30)
|
||||
flick_overlay(image('icons/mob/talk.dmi', bubble_loc, bubble_state,MOB_LAYER+1), bubble_recipients, 30)
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
//If this is set, The item will make an action button on the player's HUD when picked up.
|
||||
var/action_button_name //It is also the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. If it's not set, there'll be no button.
|
||||
var/action_button_is_hands_free = 0 //If 1, bypass the restrained, lying, and stunned checks action buttons normally test for
|
||||
var/action_button_custom_type = null
|
||||
var/datum/action/item_action/action = null
|
||||
|
||||
var/list/materials = list()
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
var/mob/attacher = null
|
||||
var/valve_open = 0
|
||||
var/toggle = 1
|
||||
origin_tech = "materials=1;engineering=1"
|
||||
|
||||
/obj/item/device/transfer_valve/proc/process_activation(var/obj/item/device/D)
|
||||
|
||||
@@ -187,7 +188,7 @@
|
||||
attacher_name = "[key_name_admin(attacher)]"
|
||||
|
||||
var/mob/mob = get_mob_by_key(src.fingerprintslast)
|
||||
|
||||
|
||||
bombers += "Bomb valve opened at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]) with [attached_device ? attached_device : "no device"], attached by [attacher_name]. Last touched by: [key_name(mob)]"
|
||||
message_admins("Bomb valve opened at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a> with [attached_device ? attached_device : "no device"], attached by [attacher_name]. Last touched by: [key_name_admin(mob)]")
|
||||
log_game("Bomb valve opened at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]) with [attached_device ? attached_device : "no device"], attached by [attacher_name]. Last touched by: [key_name(mob)]")
|
||||
|
||||
@@ -125,13 +125,13 @@
|
||||
to_chat(usr, "This robot has had its disabler removed!")
|
||||
return 0
|
||||
|
||||
if(T.recharge_time <= 2)
|
||||
if(T.charge_delay <= 2)
|
||||
to_chat(R, "Maximum cooling achieved for this hardpoint!")
|
||||
to_chat(usr, "There's no room for another cooling unit!")
|
||||
return 0
|
||||
|
||||
else
|
||||
T.recharge_time = max(2 , T.recharge_time - 4)
|
||||
T.charge_delay = max(2 , T.charge_delay - 4)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -214,4 +214,4 @@
|
||||
return 0
|
||||
|
||||
R.emagged = 1
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
bmark.pixel_x--
|
||||
bmark.pixel_y--
|
||||
|
||||
if(Proj.damage >= 20 || istype(Proj, /obj/item/projectile/practice))
|
||||
if(Proj.damage >= 20 || istype(Proj, /obj/item/projectile/beam/practice))
|
||||
bmark.icon_state = "scorch"
|
||||
bmark.dir = pick(NORTH,SOUTH,EAST,WEST) // random scorch design
|
||||
|
||||
@@ -178,4 +178,4 @@
|
||||
b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4)
|
||||
b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4)
|
||||
|
||||
Target.bulletholes.Add(src)
|
||||
Target.bulletholes.Add(src)
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
return
|
||||
to_chat(usr, "\blue Assembling grille...")
|
||||
|
||||
if (!do_after(usr, 10, target = src))
|
||||
if (!do_after(usr, 10, target = user))
|
||||
return
|
||||
|
||||
var /obj/structure/grille/F = new /obj/structure/grille/ ( usr.loc )
|
||||
|
||||
@@ -140,7 +140,6 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \
|
||||
new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("bookcase", /obj/structure/bookcase, 5, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40), \
|
||||
new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0), \
|
||||
new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("easel", /obj/structure/easel, 3, one_per_turf = 1, on_floor = 1), \
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
return
|
||||
if (R.time)
|
||||
to_chat(usr, "\blue Building [R.title] ...")
|
||||
if (!do_after(usr, R.time, target = src))
|
||||
if (!do_after(usr, R.time, target = usr))
|
||||
return
|
||||
if (src.amount < R.req_amount*multiplier)
|
||||
return
|
||||
@@ -194,20 +194,24 @@
|
||||
/obj/item/stack/proc/get_max_amount()
|
||||
return max_amount
|
||||
|
||||
/obj/item/stack/proc/split(mob/user, amt)
|
||||
var/obj/item/stack/F = new type(user, amt)
|
||||
F.copy_evidences(src)
|
||||
if(isliving(user))
|
||||
add_fingerprint(user)
|
||||
F.add_fingerprint(user)
|
||||
use(amt)
|
||||
return F
|
||||
|
||||
/obj/item/stack/attack_hand(mob/user as mob)
|
||||
if (user.get_inactive_hand() == src)
|
||||
var/obj/item/stack/F = new src.type( user, 1)
|
||||
F.copy_evidences(src)
|
||||
var/obj/item/stack/F = split(user, 1)
|
||||
user.put_in_hands(F)
|
||||
src.add_fingerprint(user)
|
||||
F.add_fingerprint(user)
|
||||
use(1)
|
||||
if (src && usr.machine==src)
|
||||
spawn(0) src.interact(usr)
|
||||
if(src && usr.machine == src)
|
||||
spawn(0)
|
||||
interact(usr)
|
||||
else
|
||||
..()
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/stack/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
..()
|
||||
|
||||
@@ -1318,7 +1318,7 @@ obj/item/toy/cards/deck/syndicate/black
|
||||
/obj/item/toy/russian_revolver
|
||||
name = "russian revolver"
|
||||
desc = "for fun and games!"
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon = 'icons/obj/guns/projectile.dmi'
|
||||
icon_state = "detective_gold"
|
||||
item_state = "gun"
|
||||
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
|
||||
|
||||
@@ -41,12 +41,11 @@
|
||||
icon = 'icons/obj/chronos.dmi'
|
||||
icon_state = "chronogun"
|
||||
item_state = "chronogun"
|
||||
w_class = 3.0
|
||||
projectile_type = "/obj/item/projectile/energy/chrono_beam"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
charge_cost = 0
|
||||
fire_delay = 50
|
||||
w_class = 3
|
||||
flags = NODROP
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam)
|
||||
can_charge = 0
|
||||
fire_delay = 50
|
||||
var/obj/item/weapon/chrono_eraser/TED = null
|
||||
var/obj/effect/chrono_field/field = null
|
||||
var/turf/startpos = null
|
||||
@@ -60,12 +59,13 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/gun/energy/chrono_gun/dropped()
|
||||
..()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/gun/energy/chrono_gun/update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/energy/chrono_gun/Fire()
|
||||
/obj/item/weapon/gun/energy/chrono_gun/process_fire()
|
||||
if(field)
|
||||
field_disconnect(field)
|
||||
..()
|
||||
@@ -125,18 +125,23 @@
|
||||
nodamage = 1
|
||||
var/obj/item/weapon/gun/energy/chrono_gun/gun = null
|
||||
|
||||
/obj/item/projectile/energy/chrono_beam/process()
|
||||
/obj/item/projectile/energy/chrono_beam/fire()
|
||||
gun = firer.get_active_hand()
|
||||
if(istype(gun))
|
||||
return ..()
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/projectile/energy/chrono_beam/on_hit(var/atom/target)
|
||||
/obj/item/projectile/energy/chrono_beam/on_hit(atom/target)
|
||||
if(target && gun && isliving(target))
|
||||
var/obj/effect/chrono_field/F = new(target.loc, target, gun)
|
||||
gun.field_connect(F)
|
||||
|
||||
/obj/item/ammo_casing/energy/chrono_beam
|
||||
name = "eradication beam"
|
||||
projectile_type = /obj/item/projectile/energy/chrono_beam
|
||||
icon_state = "chronobolt"
|
||||
e_cost = 0
|
||||
|
||||
/obj/effect/chrono_field
|
||||
name = "eradication field"
|
||||
@@ -256,4 +261,4 @@
|
||||
|
||||
|
||||
#undef CHRONO_BEAM_RANGE
|
||||
#undef CHRONO_FRAME_COUNT
|
||||
#undef CHRONO_FRAME_COUNT
|
||||
|
||||
@@ -382,3 +382,75 @@
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharp = 1
|
||||
edge = 1
|
||||
|
||||
/obj/item/weapon/nullrod/rosary
|
||||
icon_state = "rosary"
|
||||
item_state = null
|
||||
name = "prayer beads"
|
||||
desc = "A set of prayer beads used by many of the more traditional religions in space.<br>Vampires and other unholy abominations have learned to fear these."
|
||||
force = 0
|
||||
throwforce = 0
|
||||
var/praying = 0
|
||||
|
||||
/obj/item/weapon/nullrod/rosary/New()
|
||||
..()
|
||||
processing_objects.Add(src)
|
||||
|
||||
|
||||
/obj/item/weapon/nullrod/rosary/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
if(!istype(M))
|
||||
return ..()
|
||||
|
||||
if(!user.mind || user.mind.assigned_role != "Chaplain")
|
||||
to_chat(user, "<span class='notice'>You are not close enough with [ticker.Bible_deity_name] to use [src].</span>")
|
||||
return
|
||||
|
||||
if(in_use)
|
||||
to_chat(user, "<span class='notice'>You are already using [src].</span>")
|
||||
|
||||
user.visible_message("<span class='info'>[user] kneels[M == user ? null : " next to [M]"] and begins to utter a prayer to [ticker.Bible_deity_name].</span>", \
|
||||
"<span class='info'>You kneel[M == user ? null : " next to [M]"] and begin a prayer to [ticker.Bible_deity_name].</span>")
|
||||
|
||||
in_use = 1
|
||||
if(do_after(user, 150, target = M))
|
||||
if(istype(M, /mob/living/carbon/human)) // This probably should not work on vulps. They're unholy abominations.
|
||||
var/mob/living/carbon/human/target = M
|
||||
|
||||
if(target.mind)
|
||||
if(iscultist(target))
|
||||
ticker.mode.remove_cultist(target.mind) // This proc will handle message generation.
|
||||
praying = 0
|
||||
return
|
||||
|
||||
if(target.mind.vampire && !target.mind.vampire.get_ability(/datum/vampire_passive/full)) // Getting a full prayer off on a vampire will interrupt their powers for a large duration.
|
||||
target.mind.vampire.nullified = max(120, target.mind.vampire.nullified + 120)
|
||||
to_chat(target, "<span class='userdanger'>[user]'s prayer to [ticker.Bible_deity_name] has interfered with your power!</span>")
|
||||
praying = 0
|
||||
return
|
||||
|
||||
if(prob(25))
|
||||
to_chat(target, "<span class='notice'>[user]'s prayer to [ticker.Bible_deity_name] has eased your pain!</span>")
|
||||
target.adjustToxLoss(-5)
|
||||
target.adjustOxyLoss(-5)
|
||||
target.adjustBruteLoss(-5)
|
||||
target.adjustFireLoss(-5)
|
||||
|
||||
praying = 0
|
||||
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Your prayer to [ticker.Bible_deity_name] was interrupted.</span>")
|
||||
praying = 0
|
||||
|
||||
/obj/item/weapon/nullrod/rosary/process()
|
||||
if(istype(loc, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/holder = loc
|
||||
|
||||
if(src == holder.l_hand || src == holder.r_hand) // Holding this in your hand will
|
||||
for(var/mob/living/carbon/human/M in range(5))
|
||||
if(M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full))
|
||||
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
|
||||
if(prob(10))
|
||||
to_chat(M, "<span class='userdanger'>Being in the presence of [holder]'s [src] is interfering with your powers!</span>")
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "implant"
|
||||
icon = 'icons/obj/implants.dmi'
|
||||
icon_state = "generic" //Shows up as the action button icon
|
||||
action_button_is_hands_free = 1
|
||||
action_button_custom_type = /datum/action/item_action/hands_free
|
||||
origin_tech = "materials=2;biotech=3;programming=2"
|
||||
|
||||
var/activated = 1 //1 for implant types that can be activated, 0 for ones that are "always on" like loyalty implants
|
||||
|
||||
@@ -1815,18 +1815,6 @@
|
||||
</ol>
|
||||
<br><br>
|
||||
|
||||
<h1><a name="atmos"><B>Atmospherics Technician</B></a></h1><BR>
|
||||
<ol>
|
||||
<li>Atmospheric Technicians are permitted to completely repipe the Atmospherics Piping Setup, provided they do not pump harmful gases into anywhere except the Turbine;</li>
|
||||
<li>Atmospheric Technicians are not permitted to create volatile mixes using Plasma and Oxygen, nor are they permitted to create any potentially harmful mixes with Carbon Dioxide and/or Nitrous Oxide. An exception is made when working with the Turbine;</li>
|
||||
<li>Atmospheric Technicians are permitted to cool Plasma and store it for later use in Radiation Collectors. Likewise, they are permitted to cool Nitrogen or Carbon Dioxide and store it for use as coolant for the Supermatter Engine;</li>
|
||||
<li>Atmospheric Technicians are not permitted to take the axe out of its case unless there is an immediate and urgent threat to their life or urgent access to crisis locations is necessary. The axe must be returned to the case afterwards, and the case locked;</li>
|
||||
<li>Atmospheric Technicians are not permitted to tamper with the default values on Air Alarms. They are, however, permitted to create small, acclimatized rooms for species that require special atmospheric conditions (such as Plasmamen and Vox), provided they receive express permission from the Chief Engineer;</li>
|
||||
<li>Atmospheric Technicians must periodically check on the Central Alarms Computer, in periods of, at most, thirty (30) minutes;</li>
|
||||
<li>Atmospheric Technicians must respond promptly to piping and station breaches. Failure to report within fifteen (15) minutes will be considered a breach of Standard Operating Procedure, unless there are no spare Atmospheric Technicians to report, or an Engineer has arrived on scene first. All Hazard Zones must be cordoned off with Engineering Tape, for the sake of everyone else</li>
|
||||
</ol>
|
||||
<br><br>
|
||||
|
||||
<h1><a name="sf"><B>Shaft Miner</B></a></h1><BR>
|
||||
<ol>
|
||||
<li>Shaft Miners are not permitted to bring Gibtonite aboard the station;</li>
|
||||
@@ -2412,7 +2400,104 @@
|
||||
<li>Demotion of Chief Engineer and reparation of Engine if no threat manifests.</li>
|
||||
</ul>
|
||||
<br><br>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
"}
|
||||
|
||||
/obj/item/weapon/book/manual/sop_command
|
||||
name = "Command Standard Operating Procedures"
|
||||
desc = "A set of guidelines aiming at the safe conduct of all Command activities."
|
||||
icon_state = "book4"
|
||||
author = "Nanotrasen"
|
||||
title = "Command Standard Operating Procedures"
|
||||
dat = {"
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
h1 {font-size: 15px; margin: 15px 0px 5px;}
|
||||
li {margin: 2px 0px 2px 15px;}
|
||||
ul {list-style: none; margin: 5px; padding: 0px;}
|
||||
ol {margin: 5px; padding: 0px 15px;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<font face="Verdana" color=black>
|
||||
|
||||
<h1><a name="Contents">Contents</a></h1>
|
||||
<ol>
|
||||
<li><a href="#foreword">Foreword</a></li>
|
||||
<li><a href="#cap">Captain</a></li>
|
||||
<li><a href="#hop">Head of Personnel</a></li>
|
||||
<li><a href="#ntrep">NanoTrasen Representative</a></li>
|
||||
<li><a href="#bs">Blueshield Officer</a></li>
|
||||
<li><a href="#ai">AI</a></li>
|
||||
</ol>
|
||||
<br><BR>
|
||||
|
||||
<h1><a name="foreword"><U><B>FOREWORD</B></U></a></h1><BR>
|
||||
Job SOP should not be a considered a checklist of conditions to fire someone over, and should not be rigidly followed to the letter in detriment of circumstances and context.
|
||||
As always, SOP can be malleable if the situation so requires, and the decision to punish a crewmember for breaching it ultimately falls onto the relevant Head of Staff,
|
||||
for Department Members, or Captain, for the Head of Staff.<BR><BR>
|
||||
|
||||
<h1><a name="cap"><B>Captain</B></a></h1><BR>
|
||||
<ol>
|
||||
<li>The Captain is not permitted to perform regular Security Duty. However, they may still assist Security if they are understaffed, or if they see a crime being committed. However, the Captain is not permitted to take items from the Armory under normal circumstances, unless authorized by the Head of Security. In addition, the Captain may not requisition weaponry for themselves from Cargo and/or Science, unless there's an immediate threat to station and/or crew;</li>
|
||||
<li>If a Department lacks a Head of Staff, the Captain should make reasonable efforts to appoint an Acting Head of Staff, if there are available personnel to fill the position;</li>
|
||||
<li>The Captain is to ensure that Space Law is being correctly applied. This should be done in cooperation with the Head of Security;</li>
|
||||
<li>The Captain is not to leave the NSS Cyberiad unless given specific permission by Central Command, or it happens to be the end of the shift. This includes via space or via the Gateway. To do so is to be considered abandoning their posts and is grounds for termination;</li>
|
||||
<li>The Captain must keep the Nuclear Authentication Disk on their person at all times or, failing that, in the possession of the Head of Security or Blueshield;</li>
|
||||
<li>The Captain is to attempt to resolve every issue that arises in Command locally before contacting Central Command;</li>
|
||||
<li>The Captain is not permitted to carry their Antique Laser Gun or Space Armor unless there's an immediate emergency that requires attending to;</li>
|
||||
<li>The Captain, despite being in charge of the Cyberiad, is not independent from NanoTrasen. Any attempts to disregard general company policy are to be considered an instant condition for contract termination;</li>
|
||||
<li>The Captain may only promote personnel to a Acting Head of Staff position if there is no assigned Head of Staff associated with the Department. Said Acting Head of Staff must be a member of the Department they are to lead. See below for more information on Chain of Command;</li>
|
||||
<li>The Captain may not fire any Head of Staff without reasonable justification (ie, incompetency, criminal activity, or otherwise any action that endangers/compromises the station and/or crew). The Captain may not fire any Central Command VIPs (ie, Blueshield, Magistrate, NanoTrasen Representative) without permission from Central Command, unless they are blatantly acting against the well-being and safety of the crew and station.</li>
|
||||
</ol><BR>
|
||||
|
||||
<h1><a name="hop"><B>Head of Personnel</B></a></h1><BR>
|
||||
<ol>
|
||||
<li>The Head of Personnel may not transfer any personnel to another Department without authorization from the relevant Head of Staff. If no Head of Staff is available, the Head of Personnel may make a judgement call. This does not apply to Security, which always requires authorization from the Head of Security, or Genetics, which requires both Chief Medical Officer and Research Director approval. If there is no Head of Security active, no transfers are allowed to Security without authorization from the Captain;</li>
|
||||
<li>The Head of Personnel may not give any personnel increased access without authorization from the relevant Head of Staff. This includes the Head of Personnel. In addition, the Head of Personnel may only give Captain-Level access to someone if they are the Acting Captain. This access is to be removed when a proper Captain arrives on the station;</li>
|
||||
<li>The Head of Personnel may not increase any Job Openings unless the relevant Head of Staff approves;</li>
|
||||
<li>The Head of Personnel may not fire any personnel without authorization from the relevant Head of Staff, unless other conditions apply (see Space Law and General Standard Operating Procedure);</li>
|
||||
<li>The Head of Personnel may not promote any personnel to the following Jobs without authorization from Central Command: Barber, Brig Physician, NanoTrasen Representative, Blueshield, Security Pod Pilot, Mechanic and Magistrate; (This is due to them being karma locked. Do not promote people to these positions without approval from the Administrators);</li>
|
||||
<li>The Head of Personnel is free to utilize paperwork at their discretion. However, during major station emergencies, expediency should take precedence over bureaucracy;</li>
|
||||
<li>The Head of Personnel may not leave their office unmanned if there are personnel waiting in line. Failure to respond to personnel with a legitimate request within ten (10) minutes, either via radio or in person, is to be considered a breach of Standard Operating Procedure;</li>
|
||||
<li>Despite nominally being in charge of Supply, the Head of Personnel should allow the Quartermaster to run the Department, unless they prove themselves to be incompetent/dangerous;</li>
|
||||
<li>The Head of Personnel is bound to the same rules regarding ordering Cargo Crates as the Quartermaster and Cargo Technicians. In addition, the Head of Personnel may not order unneeded, non-essential items against the wishes of Cargo;</li>
|
||||
<li>The Head of Personnel is not permitted to perform Security duty. The Head of Personnel is permitted to carry an Energy Gun, for self-defence only.</li>
|
||||
</ol><BR>
|
||||
|
||||
<h1><a name="ntrep"><B>NanoTrasen Representative</B></a></h1><BR>
|
||||
<ol>
|
||||
<li>The NanoTrasen Representative is to ensure that every Department is following Standard Operating Procedure, up to and including the respective Head of Staff. If a Head of Staff is not available for a Department, the NanoTrasen Representative must ensure that the Captain appoints an Acting Head of Staff for said Department;</li>
|
||||
<li>The NanoTrasen Representative must attempt to resolve any breach of Standard Operating Procedure locally before contacting Central Command. This is an imperative: Standard Operating Procedure should always be followed unless there is a very good reason not to;</li>
|
||||
<li>The NanoTrasen Representative must, together with the Magistrate and Head of Security, ensure that Space Law is being followed and correctly applied;</li>
|
||||
<li>The NanoTrasen Representative may not threaten the use of a fax in order to gain leverage over any personnel, up to and including Command. In addition they may not threaten to fire, or have Central Command, fire anyone, unless they actually possess a demotion note;</li>
|
||||
<li>The NanoTrasen Representative is permitted to carry their Stun-Cane, or a Telescopic Baton if the Stun-Cane is lost.</li>
|
||||
</ol><BR>
|
||||
|
||||
<h1><a name="bs"><B>Blueshield Officer</B></a></h1><BR>
|
||||
<ol>
|
||||
<li>The Blueshield may not conduct arrests under the same conditions as Security. However, they may apprehend any personnel that trespass on a Head of Staff Office or Command Area, any personnel that steal from those locations, or any personnel that steal from and/or injure any Head of Staff or Central Command VIP. However, all apprehended personnel are to be processed by Security personnel;</li>
|
||||
<li>The Blueshield is to put the lives of Command over those of any other personnel, the Blueshield included. Their continued well-being is the Blueshield's top priority. This includes applying basic first aid and making sure they are revived if killed;</li>
|
||||
<li>The Blueshield is to protect the lives of Command personnel, not follow their orders to a fault. The Blueshield is not to interfere with legal demotions or arrests. To do so is to place themselves under the Special Modifier Aiding and Abetting;</li>
|
||||
<li>The Blueshield is not to apply Lethal Force unless there is a clear and present danger to their life, or to the life of a member of Command, and the assailant cannot be non-lethally detained.</li>
|
||||
</ol><BR>
|
||||
|
||||
<h1><a name="ai"><B>AI</B></a></h1><BR>
|
||||
<b><i>The following are procedures for AI Maintenance:</i></b><br>
|
||||
<ol>
|
||||
<li>Only the Captain or Research Director may enter the AI Upload to perform Law Changes (see below), and only the Captain, Research Director or Chief Engineer may enter the AI Core to perform a Carding (see below);</li>
|
||||
<li> No Law Changes are to be performed without approval from the Captain and Research Director. The only Lawsets to be used are those provided by NanoTrasen. Failure to legally perform a Law Change is to be considered Sabotage. Command must be informed prior to the Law Change, and all objections must be taken into consideration. If the number of Command personnel opposing the Law Change is greater than the number of Command personnel in favour, the Law Change is not to be done. If the Law Change is performed, the crew is to be immediately informed of the new Law(s);</li>
|
||||
<li>The AI may not be Carded unless it it clearly malfunctioning or subverted. However, any member of Command may card it if the AI agrees to it, either at the end of the shift, or due to external circumstances (such as massive damage to the AI Satellite);</li>
|
||||
<li>The AI Upload and Minisat Antechamber Turrets are to be kept on Non-Lethal in Code Green and Code Blue. The AI Core Turrets are to be kept on Lethal at all times. If a legal Law Change or Carding is occurring, the Turrets are to be disabled;</li>
|
||||
<li>If the AI Unit is not malfunctioning or subverted, any attempt at performing an illegal Carding or Law Change is to be responded to with non-lethal force. If the illegal attempts persist, and the perpetrator is demonstrably hostile, lethal force from Command/Security is permitted;</li>
|
||||
<li>Freeform Laws are only to be added if absolutely necessary due to external circumstances (such as major station emergencies). Adding unnecessary Freeform Laws is not permitted. Exception is made if the AI Unit and majority of Command agree to the Freeform Law that is proposed;</li>
|
||||
<li>Any use of the "Purge" Module is to be followed by the upload of a NanoTrasen-approved Lawset immediately. AI Units must be bound to a Lawset at all times.</li>
|
||||
</ol><BR>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
@@ -128,7 +128,6 @@
|
||||
materials = list()
|
||||
minor_fault = 1
|
||||
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/high/slime
|
||||
name = "charged slime core"
|
||||
desc = "A yellow slime core infused with plasma, it crackles with power."
|
||||
@@ -138,6 +137,12 @@
|
||||
materials = list()
|
||||
self_recharge = 1 // Infused slime cores self-recharge, over time
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/pulse //200 pulse shots
|
||||
name = "pulse rifle power cell"
|
||||
maxcharge = 40000
|
||||
rating = 3
|
||||
chargerate = 1500
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/pulse/carbine
|
||||
name = "pulse carbine power cell"
|
||||
maxcharge = 4000
|
||||
@@ -168,9 +173,3 @@
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/emproof/corrupt()
|
||||
return
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/temperaturegun
|
||||
name = "temperature gun cell"
|
||||
desc = "A specially designed power cell for heating and cooling projectiles"
|
||||
icon_state = "icell"
|
||||
maxcharge = 900
|
||||
@@ -131,7 +131,7 @@
|
||||
name = "nano-manipulator"
|
||||
desc = "A tiny little manipulator used in the construction of certain devices."
|
||||
icon_state = "nano_mani"
|
||||
origin_tech = "materials=3,programming=2"
|
||||
origin_tech = "materials=3;programming=2"
|
||||
rating = 2
|
||||
materials = list(MAT_METAL=30)
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
name = "pico-manipulator"
|
||||
desc = "A tiny little manipulator used in the construction of certain devices."
|
||||
icon_state = "pico_mani"
|
||||
origin_tech = "materials=5,programming=2"
|
||||
origin_tech = "materials=5;programming=2"
|
||||
rating = 3
|
||||
materials = list(MAT_METAL=30)
|
||||
|
||||
|
||||
@@ -6,8 +6,17 @@
|
||||
item_state = "utility"
|
||||
slot_flags = SLOT_BELT
|
||||
attack_verb = list("whipped", "lashed", "disciplined")
|
||||
var/use_item_overlays = 0 // Do we have overlays for items held inside the belt?
|
||||
|
||||
|
||||
/obj/item/weapon/storage/belt/update_icon()
|
||||
if(use_item_overlays)
|
||||
overlays.Cut()
|
||||
for(var/obj/item/I in contents)
|
||||
overlays += "[I.name]"
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/weapon/storage/belt/proc/can_use()
|
||||
return is_equipped()
|
||||
|
||||
@@ -148,6 +157,7 @@
|
||||
item_state = "security"//Could likely use a better one.
|
||||
storage_slots = 5
|
||||
max_w_class = 3
|
||||
use_item_overlays = 1
|
||||
can_hold = list(
|
||||
"/obj/item/weapon/grenade/flashbang",
|
||||
"/obj/item/weapon/grenade/chem_grenade/teargas",
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
new /obj/item/weapon/melee/baton/loaded(src)
|
||||
new /obj/item/weapon/storage/belt/security/sec(src)
|
||||
new /obj/item/taperoll/police(src)
|
||||
new /obj/item/weapon/gun/energy/hos(src)
|
||||
new /obj/item/weapon/gun/energy/gun/hos(src)
|
||||
new /obj/item/weapon/door_remote/head_of_security(src)
|
||||
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
new /obj/item/weapon/storage/box/flashbangs(src)
|
||||
new /obj/item/weapon/reagent_containers/spray/pepper(src)
|
||||
new /obj/item/weapon/melee/baton/loaded(src)
|
||||
new /obj/item/weapon/gun/energy/advtaser(src)
|
||||
new /obj/item/weapon/gun/energy/gun/advtaser(src)
|
||||
new /obj/item/weapon/storage/belt/security/sec(src)
|
||||
new /obj/item/weapon/storage/box/holobadge(src)
|
||||
|
||||
|
||||
@@ -382,7 +382,7 @@ var/send_emergency_team
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/ert/security(M), slot_wear_suit)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/advtaser(M), slot_s_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(M), slot_s_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/ert/security(M), slot_in_backpack)
|
||||
@@ -459,7 +459,7 @@ var/send_emergency_team
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/security(M), slot_wear_suit)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/advtaser(M), slot_s_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(M), slot_s_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/security(M), slot_in_backpack)
|
||||
@@ -532,7 +532,7 @@ var/send_emergency_team
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/device/t_scanner/extended_range(M), slot_l_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
|
||||
@@ -553,7 +553,7 @@ var/send_emergency_team
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/ionrifle/carbine(M), slot_in_backpack)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/carbine(M), slot_r_hand)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/carbine(M), slot_r_hand)
|
||||
|
||||
if("Medic")
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
|
||||
@@ -566,7 +566,7 @@ var/send_emergency_team
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/medical(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/surgery(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_l_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
|
||||
@@ -585,7 +585,7 @@ var/send_emergency_team
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/storage/lockbox/loyalty(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(M), slot_l_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
|
||||
@@ -610,4 +610,4 @@ var/send_emergency_team
|
||||
new /obj/item/device/radio/centcom( src )
|
||||
new /obj/item/weapon/reagent_containers/food/pill/salicylic( src )
|
||||
new /obj/item/weapon/reagent_containers/food/pill/patch/synthflesh( src )
|
||||
return
|
||||
return
|
||||
|
||||
+30
-14
@@ -9,8 +9,9 @@ var/list/jackboot_sound = list('sound/effects/jackboot1.ogg','sound/effects/jack
|
||||
var/list/swing_hit_sound = list('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg')
|
||||
var/list/hiss_sound = list('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg')
|
||||
var/list/page_sound = list('sound/effects/pageturn1.ogg', 'sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg')
|
||||
//var/list/gun_sound = list('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg')
|
||||
var/list/gun_sound = list('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg')
|
||||
var/list/computer_ambience = list('sound/goonstation/machines/ambicomp1.ogg', 'sound/goonstation/machines/ambicomp2.ogg', 'sound/goonstation/machines/ambicomp3.ogg')
|
||||
var/list/ricochet = list('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg','sound/weapons/effects/ric3.ogg','sound/weapons/effects/ric4.ogg','sound/weapons/effects/ric5.ogg')
|
||||
|
||||
/proc/playsound(var/atom/source, soundin, vol as num, vary, extrarange as num, falloff, var/is_global, var/pitch)
|
||||
|
||||
@@ -107,17 +108,32 @@ var/const/FALLOFF_SOUNDS = 0.5
|
||||
/proc/get_sfx(soundin)
|
||||
if(istext(soundin))
|
||||
switch(soundin)
|
||||
if ("shatter") soundin = pick(shatter_sound)
|
||||
if ("explosion") soundin = pick(explosion_sound)
|
||||
if ("sparks") soundin = pick(spark_sound)
|
||||
if ("rustle") soundin = pick(rustle_sound)
|
||||
if ("bodyfall") soundin = pick(bodyfall_sound)
|
||||
if ("punch") soundin = pick(punch_sound)
|
||||
if ("clownstep") soundin = pick(clown_sound)
|
||||
if ("jackboot") soundin = pick(jackboot_sound)
|
||||
if ("swing_hit") soundin = pick(swing_hit_sound)
|
||||
if ("hiss") soundin = pick(hiss_sound)
|
||||
if ("pageturn") soundin = pick(page_sound)
|
||||
//if ("gunshot") soundin = pick(gun_sound)
|
||||
if("computer_ambience") soundin = pick(computer_ambience)
|
||||
if ("shatter")
|
||||
soundin = pick(shatter_sound)
|
||||
if ("explosion")
|
||||
soundin = pick(explosion_sound)
|
||||
if ("sparks")
|
||||
soundin = pick(spark_sound)
|
||||
if ("rustle")
|
||||
soundin = pick(rustle_sound)
|
||||
if ("bodyfall")
|
||||
soundin = pick(bodyfall_sound)
|
||||
if ("punch")
|
||||
soundin = pick(punch_sound)
|
||||
if ("clownstep")
|
||||
soundin = pick(clown_sound)
|
||||
if ("jackboot")
|
||||
soundin = pick(jackboot_sound)
|
||||
if ("swing_hit")
|
||||
soundin = pick(swing_hit_sound)
|
||||
if ("hiss")
|
||||
soundin = pick(hiss_sound)
|
||||
if ("pageturn")
|
||||
soundin = pick(page_sound)
|
||||
if ("gunshot")
|
||||
soundin = pick(gun_sound)
|
||||
if("computer_ambience")
|
||||
soundin = pick(computer_ambience)
|
||||
if("ricochet")
|
||||
soundin = pick(ricochet)
|
||||
return soundin
|
||||
|
||||
@@ -2483,7 +2483,7 @@
|
||||
for(var/obj/item/W in world)
|
||||
if(istype(W, /obj/item/clothing) || istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/weapon/disk) || istype(W, /obj/item/weapon/tank))
|
||||
continue
|
||||
W.icon = 'icons/obj/gun.dmi'
|
||||
W.icon = 'icons/obj/guns/projectile.dmi'
|
||||
W.icon_state = "revolver"
|
||||
W.item_state = "gun"
|
||||
message_admins("[key_name_admin(usr)] made every item look like a gun")
|
||||
|
||||
@@ -690,7 +690,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(M), slot_r_hand)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/destroyer(M), slot_r_hand)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store)
|
||||
|
||||
@@ -881,7 +881,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
|
||||
M.equip_or_collect(pda, slot_r_store)
|
||||
M.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
|
||||
M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_belt)
|
||||
M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt)
|
||||
|
||||
var/obj/item/weapon/card/id/centcom/W = new(M)
|
||||
W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Officer)"
|
||||
@@ -904,7 +904,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
|
||||
M.equip_or_collect(pda, slot_r_store)
|
||||
M.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
|
||||
M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_belt)
|
||||
M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt)
|
||||
|
||||
var/obj/item/weapon/card/id/centcom/W = new(M)
|
||||
W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Captain)"
|
||||
@@ -967,7 +967,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/pistol/m1911(M), slot_belt)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_store)
|
||||
|
||||
@@ -996,7 +996,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/pistol/m1911(M), slot_belt)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store)
|
||||
M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_l_store)
|
||||
@@ -1233,4 +1233,4 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
assets.register()
|
||||
|
||||
// Clear the user's cache so they get resent.
|
||||
usr.client.cache = list()
|
||||
usr.client.cache = list()
|
||||
|
||||
@@ -121,7 +121,7 @@ var/global/sent_honksquad = 0
|
||||
if(prob(50))
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/energy/clown(src), slot_in_backpack)
|
||||
else
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/grenadelauncher/piecannon(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/throw/piecannon(src), slot_in_backpack)
|
||||
src.mutations.Add(CLUMSY)
|
||||
|
||||
|
||||
@@ -134,4 +134,4 @@ var/global/sent_honksquad = 0
|
||||
W.registered_name = real_name
|
||||
equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -154,7 +154,7 @@ var/global/sent_strike_team = 0
|
||||
equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(src), slot_belt)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(src), slot_r_hand)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse(src), slot_r_hand)
|
||||
|
||||
|
||||
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(src)//Here you go Deuryn
|
||||
@@ -170,4 +170,4 @@ var/global/sent_strike_team = 0
|
||||
W.registered_name = real_name
|
||||
equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -144,7 +144,7 @@ var/global/sent_syndicate_strike_team = 0
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(src), slot_back)
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m762, slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/mm556x45)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m45(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_in_backpack)
|
||||
@@ -160,7 +160,7 @@ var/global/sent_syndicate_strike_team = 0
|
||||
equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(src), slot_l_store)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/grenade/empgrenade(src), slot_r_store)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol/m2411(src), slot_belt)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol/m1911(src), slot_belt)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/l6_saw(src), slot_r_hand)
|
||||
|
||||
@@ -173,4 +173,4 @@ var/global/sent_syndicate_strike_team = 0
|
||||
W.registered_name = real_name
|
||||
equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -18,7 +18,7 @@ var/global/vox_tick = 1
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
|
||||
equip_to_slot_or_del(new /obj/item/device/chameleon(src), slot_l_store)
|
||||
|
||||
var/obj/item/weapon/gun/launcher/spikethrower/W = new(src)
|
||||
var/obj/item/weapon/gun/projectile/automatic/spikethrower/W = new(src)
|
||||
equip_to_slot_or_del(W, slot_r_hand)
|
||||
|
||||
|
||||
@@ -77,4 +77,4 @@ var/global/vox_tick = 1
|
||||
vox_tick++
|
||||
if (vox_tick > 4) vox_tick = 1
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
var/status = 0 //0 - not readied //1 - bomb finished with welder
|
||||
var/obj/item/device/assembly_holder/bombassembly = null //The first part of the bomb is an assembly holder, holding an igniter+some device
|
||||
var/obj/item/weapon/tank/bombtank = null //the second part of the bomb is a plasma tank
|
||||
origin_tech = "materials=1;engineering=1"
|
||||
|
||||
/obj/item/device/onetankbomb/examine(mob/user)
|
||||
..(user)
|
||||
|
||||
@@ -61,10 +61,8 @@
|
||||
*/
|
||||
//Captain's retro laser - Fires practice laser shots instead.
|
||||
obj/item/weapon/gun/energy/laser/retro/sc_retro
|
||||
name ="retro laser"
|
||||
icon_state = "retro"
|
||||
desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces."
|
||||
// projectile_type = "/obj/item/projectile/practice"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser/practice)
|
||||
clumsy_check = 0 //No sense in having a harmless gun blow up in the clowns face
|
||||
|
||||
//Syndicate sub-machine guns.
|
||||
@@ -196,4 +194,4 @@ var/sc_safecode5 = "[rand(0,9)]"
|
||||
return
|
||||
|
||||
/obj/singularity/narsie/sc_Narsie/ex_act()
|
||||
return
|
||||
return
|
||||
|
||||
@@ -316,8 +316,9 @@
|
||||
send_resources()
|
||||
|
||||
if(prefs.lastchangelog != changelog_hash) //bolds the changelog button on the interface so we know there are updates. -CP
|
||||
if(!establish_db_connection())
|
||||
return // if we have db problems, don't show anything
|
||||
winset(src, "rpane.changelog", "background-color=#f4aa94;font-style=bold")
|
||||
prefs.SetChangelog(src,changelog_hash)
|
||||
to_chat(src, "<span class='info'>Changelog has changed since your last visit.</span>")
|
||||
|
||||
if(!void)
|
||||
|
||||
@@ -456,10 +456,12 @@
|
||||
|
||||
/datum/preferences/proc/SetChangelog(client/C,hash)
|
||||
lastchangelog=hash
|
||||
winset(C, "rpane.changelog", "background-color=none;font-style=")
|
||||
var/DBQuery/query = dbcon.NewQuery("UPDATE [format_table_name("player")] SET lastchangelog='[lastchangelog]' WHERE ckey='[C.ckey]'")
|
||||
if(!query.Execute())
|
||||
var/err = query.ErrorMsg()
|
||||
log_game("SQL ERROR during lastchangelog updating. Error : \[[err]\]\n")
|
||||
message_admins("SQL ERROR during lastchangelog updating. Error : \[[err]\]\n")
|
||||
to_chat(C, "Couldn't update your last seen changelog, please try again later.")
|
||||
return
|
||||
return 1
|
||||
|
||||
@@ -6,8 +6,32 @@
|
||||
siemens_coefficient = 0
|
||||
permeability_coefficient = 0.05
|
||||
item_color="yellow"
|
||||
power
|
||||
var/next_shock = 0
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/power
|
||||
description_antag = "These are a pair of power gloves, and can be used to fire bolts of electricity while standing over powered power cables."
|
||||
var/old_mclick_override
|
||||
var/datum/middleClickOverride/power_gloves/mclick_override = new /datum/middleClickOverride/power_gloves
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/power/equipped(mob/user, slot)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(slot == slot_gloves)
|
||||
if(H.middleClickOverride)
|
||||
old_mclick_override = H.middleClickOverride
|
||||
H.middleClickOverride = mclick_override
|
||||
to_chat(H, "<span class='notice'>You feel electricity begin to build up in [src].</span>")
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/power/dropped(mob/user, slot)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.get_item_by_slot(slot_gloves) == src && H.middleClickOverride == mclick_override)
|
||||
if(old_mclick_override)
|
||||
H.middleClickOverride = old_mclick_override
|
||||
old_mclick_override = null
|
||||
else
|
||||
H.middleClickOverride = null
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/fake
|
||||
desc = "These gloves will protect the wearer from electric shock. They don't feel like rubber..."
|
||||
@@ -167,4 +191,4 @@
|
||||
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
|
||||
heat_protection = HANDS
|
||||
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
|
||||
strip_delay = 60
|
||||
strip_delay = 60
|
||||
|
||||
@@ -34,8 +34,8 @@
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 60)
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \
|
||||
/obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \
|
||||
/obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse_rifle, \
|
||||
/obj/item/weapon/gun/energy/advtaser, /obj/item/weapon/melee/baton, /obj/item/weapon/gun/energy/gun)
|
||||
/obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse, \
|
||||
/obj/item/weapon/gun/energy/gun/advtaser, /obj/item/weapon/melee/baton, /obj/item/weapon/gun/energy/gun)
|
||||
strip_delay = 130
|
||||
|
||||
//Commander
|
||||
@@ -121,4 +121,4 @@
|
||||
|
||||
/obj/item/clothing/suit/space/rig/ert/paranormal/New()
|
||||
..()
|
||||
new /obj/item/weapon/nullrod(src)
|
||||
new /obj/item/weapon/nullrod(src)
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
gun.attack_self(holder.wearer)
|
||||
return 1
|
||||
|
||||
gun.Fire(target,holder.wearer)
|
||||
gun.process_fire(target,holder.wearer)
|
||||
return 1
|
||||
|
||||
/obj/item/rig_module/mounted/egun
|
||||
@@ -168,7 +168,7 @@
|
||||
active_power_cost = 10
|
||||
passive_power_cost = 0
|
||||
|
||||
gun_type = /obj/item/weapon/gun/energy/crossbow/ninja
|
||||
gun_type = /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/ninja
|
||||
|
||||
/obj/item/rig_module/mounted/energy_blade/process()
|
||||
|
||||
|
||||
@@ -135,13 +135,13 @@
|
||||
icon_state = "armor_reflec"
|
||||
item_state = "armor_reflec"
|
||||
blood_overlay_type = "armor"
|
||||
var/hit_reflect_chance = 40
|
||||
armor = list(melee = 10, bullet = 10, laser = 80, energy = 50, bomb = 0, bio = 0, rad = 0)
|
||||
var/hit_reflect_chance = 40
|
||||
|
||||
/obj/item/clothing/suit/armor/laserproof/IsReflect(var/def_zone)
|
||||
if(!(def_zone in list("chest", "groin"))) //If not shot where ablative is covering you, you don't get the reflection bonus!
|
||||
hit_reflect_chance = 0
|
||||
if (prob(hit_reflect_chance))
|
||||
return 0
|
||||
if(prob(hit_reflect_chance))
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/det_suit
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
var/slot = "decor"
|
||||
var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to
|
||||
var/image/inv_overlay = null //overlay used when attached to clothing.
|
||||
action_button_custom_type = /datum/action/item_action/accessory
|
||||
|
||||
/obj/item/clothing/accessory/New()
|
||||
..()
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
/obj/item/robot_parts/r_leg = 1,
|
||||
/obj/item/stack/sheet/metal = 5,
|
||||
/obj/item/stack/cable_coil = 5,
|
||||
/obj/item/weapon/gun/energy/advtaser = 1,
|
||||
/obj/item/weapon/gun/energy/gun/advtaser = 1,
|
||||
/obj/item/weapon/stock_parts/cell = 1,
|
||||
/obj/item/device/assembly/prox_sensor = 1,
|
||||
/obj/item/robot_parts/r_arm = 1)
|
||||
@@ -200,4 +200,22 @@
|
||||
time = 15
|
||||
reqs = list(/obj/item/stack/sheet/wood = 1,
|
||||
/obj/item/stack/cable_coil = 5)
|
||||
tools = list(/obj/item/weapon/kitchen/knife) // Gotta carve the wood into handles
|
||||
tools = list(/obj/item/weapon/kitchen/knife) // Gotta carve the wood into handles
|
||||
|
||||
/datum/table_recipe/makeshift_bolt
|
||||
name = "Makeshift Bolt"
|
||||
result = /obj/item/weapon/arrow/rod
|
||||
time = 15
|
||||
reqs = list(/obj/item/stack/rods = 1)
|
||||
tools = list(/obj/item/weapon/weldingtool)
|
||||
|
||||
/datum/table_recipe/crossbow
|
||||
name = "Powered Crossbow"
|
||||
result = /obj/item/weapon/gun/throw/crossbow
|
||||
time = 300
|
||||
reqs = list(/obj/item/stack/rods = 3,
|
||||
/obj/item/stack/cable_coil = 10,
|
||||
/obj/item/stack/sheet/mineral/plastic = 3,
|
||||
/obj/item/stack/sheet/wood = 5)
|
||||
tools = list(/obj/item/weapon/weldingtool,
|
||||
/obj/item/weapon/screwdriver)
|
||||
|
||||
@@ -293,6 +293,16 @@
|
||||
src.item_state = "[item_color]"
|
||||
usr.update_inv_w_uniform()
|
||||
|
||||
/obj/item/clothing/under/fluff/honourable // MrBarrelrolll: Maximus Greenwood
|
||||
name = "Viridi Protegat"
|
||||
desc = "A set of chainmail adorned with a hide mantle. \"Greenwood\" is engraved into the right breast."
|
||||
icon = 'icons/obj/clothing/uniforms.dmi'
|
||||
icon_state = "roman"
|
||||
item_state = "maximus_armor"
|
||||
item_color = "maximus_armor"
|
||||
displays_id = 0
|
||||
strip_delay = 100
|
||||
|
||||
//////////// Masks ////////////
|
||||
|
||||
//////////// Shoes ////////////
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
then click where you want to fire. Most energy weapons can fire through windows harmlessly. To switch between stun and lethal, click the weapon \
|
||||
in your hand. To recharge this weapon, use a weapon recharger."
|
||||
|
||||
/obj/item/weapon/gun/energy/advtaser
|
||||
/obj/item/weapon/gun/energy/gun/advtaser
|
||||
description_info = "This is an energy weapon. To fire the weapon, have your gun mode set to 'fire', \
|
||||
then click where you want to fire. To recharge this weapon, use a weapon recharger. \
|
||||
To switch between insta-stun and disabler beams, click the weapon in your hand. This weapon can only fire through glass if it is set to disabler beams."
|
||||
@@ -55,11 +55,6 @@
|
||||
then click where you want to fire. After firing, you will need to pump the gun, by clicking on the gun in your hand. To reload, load more shotgun \
|
||||
shells into the gun."
|
||||
|
||||
/obj/item/weapon/gun/projectile/heavysniper
|
||||
description_info = "This is a ballistic weapon. To fire the weapon, have your gun mode set to 'fire', \
|
||||
then click where you want to fire. The gun's chamber can be opened or closed by using it in your hand. To reload, open the chamber, add a new bullet \
|
||||
then close it. To use the scope, use the appropriate verb in the object tab."
|
||||
|
||||
//*******
|
||||
//*Melee*
|
||||
//*******
|
||||
|
||||
@@ -695,7 +695,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
|
||||
halitem.layer = 50
|
||||
switch(rand(1,6))
|
||||
if(1) //revolver
|
||||
halitem.icon = 'icons/obj/gun.dmi'
|
||||
halitem.icon = 'icons/obj/guns/projectile.dmi'
|
||||
halitem.icon_state = "revolver"
|
||||
halitem.name = "Revolver"
|
||||
if(2) //c4
|
||||
@@ -780,4 +780,4 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
|
||||
if(client) client.images += halbody
|
||||
spawn(rand(50,80)) //Only seen for a brief moment.
|
||||
if(client) client.images -= halbody
|
||||
halbody = null
|
||||
halbody = null
|
||||
|
||||
@@ -179,6 +179,7 @@
|
||||
if(locked)
|
||||
if(istype(W, /obj/item/weapon/card/emag))
|
||||
boom(user)
|
||||
return 1
|
||||
if(istype(W, /obj/item/device/multitool))
|
||||
to_chat(user, "<span class='notice'>DECA-CODE LOCK REPORT:</span>")
|
||||
if(attempts == 1)
|
||||
@@ -186,30 +187,24 @@
|
||||
else
|
||||
to_chat(user, "<span class='notice'>* Anti-Tamper Bomb will activate after [src.attempts] failed access attempts.</span>")
|
||||
if(lastattempt != null)
|
||||
var/guess = lastattempt
|
||||
var/bulls = 0
|
||||
var/cows = 0
|
||||
var/list/banned = list()
|
||||
for(var/i; i <= length(lastattempt); i++)
|
||||
var/list/a = strip_first(guess)
|
||||
if(a[1] in banned)
|
||||
for(var/i in 1 to codelen)
|
||||
var/list/a = copytext(lastattempt, i, i + 1)
|
||||
if(a in banned)
|
||||
continue
|
||||
if(findtext(a[2], a[1]))
|
||||
if(findtext(code, a[1], i, i+1))
|
||||
var/g = findtext(code, a)
|
||||
if(g)
|
||||
banned += a
|
||||
if(g == i)
|
||||
++bulls
|
||||
banned += a[1]
|
||||
else
|
||||
var/g = findtext(code, a[1])
|
||||
if(g)
|
||||
if(g == i)
|
||||
++bulls
|
||||
else
|
||||
++cows
|
||||
guess = a[2]
|
||||
else
|
||||
++cows
|
||||
|
||||
to_chat(user, "<span class='notice'>Last code attempt had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.</span>")
|
||||
else ..()
|
||||
else ..()
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/crate/secure/loot/togglelock(mob/user)
|
||||
if(locked)
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
|
||||
/datum/manufacture/taser
|
||||
name = "Advanced Taser"
|
||||
item = /obj/item/weapon/gun/energy/advtaser
|
||||
item = /obj/item/weapon/gun/energy/gun/advtaser
|
||||
cost1 = /obj/item/weapon/ore/iron
|
||||
cname1 = "Iron"
|
||||
amount1 = 15
|
||||
|
||||
@@ -123,8 +123,8 @@ Doesn't work on other aliens/AI.*/
|
||||
A.firer = src
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
spawn(1)
|
||||
A.process()
|
||||
A.fire()
|
||||
A.newtonian_move(get_dir(U, T))
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/humanoid/proc/resin() // -- TLE
|
||||
@@ -185,4 +185,4 @@ Doesn't work on other aliens/AI.*/
|
||||
adjustPlasma(-amount)
|
||||
return 1
|
||||
|
||||
return 0
|
||||
return 0
|
||||
|
||||
@@ -32,22 +32,6 @@
|
||||
adjustToxLoss(3)
|
||||
updatehealth()
|
||||
|
||||
/mob/living/carbon/brain/handle_environment(datum/gas_mixture/environment)
|
||||
if(!environment)
|
||||
return
|
||||
var/environment_heat_capacity = environment.heat_capacity()
|
||||
if(istype(get_turf(src), /turf/space))
|
||||
var/turf/heat_turf = get_turf(src)
|
||||
environment_heat_capacity = heat_turf.heat_capacity
|
||||
|
||||
if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10)))
|
||||
var/transfer_coefficient = 1
|
||||
|
||||
handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient)
|
||||
|
||||
if(stat == DEAD)
|
||||
bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000)
|
||||
|
||||
/mob/living/carbon/brain/proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity)
|
||||
if(status_flags & GODMODE)
|
||||
return
|
||||
@@ -94,3 +78,6 @@
|
||||
see_in_dark = 2
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
handle_hud_icons_health()
|
||||
|
||||
/mob/living/carbon/brain/breathe()
|
||||
return
|
||||
|
||||
@@ -1982,4 +1982,21 @@
|
||||
. |= A.GetAccess()
|
||||
|
||||
/mob/living/carbon/human/is_mechanical()
|
||||
return ..() || (species.flags & ALL_RPARTS) != 0
|
||||
return ..() || (species.flags & ALL_RPARTS) != 0
|
||||
|
||||
/mob/living/carbon/human/can_use_guns(var/obj/item/weapon/gun/G)
|
||||
. = ..()
|
||||
|
||||
if(G.trigger_guard == TRIGGER_GUARD_NORMAL)
|
||||
if(HULK in mutations)
|
||||
to_chat(src, "<span class='warning'>Your meaty finger is much too large for the trigger guard!</span>")
|
||||
return 0
|
||||
if(species.flags & NOGUNS)
|
||||
to_chat(src, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
|
||||
return 0
|
||||
|
||||
if(martial_art && martial_art.name == "The Sleeping Carp") //great dishonor to famiry
|
||||
to_chat(src, "<span class='warning'>Use of ranged weaponry would bring dishonor to the clan.</span>")
|
||||
return 0
|
||||
|
||||
return .
|
||||
|
||||
@@ -27,7 +27,7 @@ emp_act
|
||||
P.current = curloc
|
||||
P.yo = new_y - curloc.y
|
||||
P.xo = new_x - curloc.x
|
||||
P.Angle = ""//round(Get_Angle(P,P.original))
|
||||
P.Angle = null
|
||||
|
||||
return -1 // complete projectile permutation
|
||||
|
||||
@@ -46,7 +46,10 @@ emp_act
|
||||
if((P.embed && prob(20 + max(P.damage - armor, -10))))
|
||||
var/obj/item/weapon/shard/shrapnel/SP = new()
|
||||
(SP.name) = "[P.name] shrapnel"
|
||||
(SP.desc) = "[SP.desc] It looks like it was fired from [P.shot_from]."
|
||||
if(P.ammo_casing && P.ammo_casing.caliber)
|
||||
(SP.desc) = "[SP.desc] It looks like it is a [P.ammo_casing.caliber] caliber round."
|
||||
else
|
||||
(SP.desc) = "[SP.desc] The round's caliber is unidentifiable."
|
||||
(SP.loc) = organ
|
||||
organ.embed(SP)
|
||||
|
||||
|
||||
@@ -693,7 +693,7 @@
|
||||
best = R
|
||||
if(istype(R, /obj/item/weapon/gun))
|
||||
var/obj/item/weapon/gun/G = R
|
||||
if(G.can_fire())
|
||||
if(G.can_shoot())
|
||||
best = R
|
||||
break // gun with ammo? screw the rest
|
||||
if(best && best != main_hand)
|
||||
@@ -727,22 +727,23 @@
|
||||
if(main_hand.force != 0)
|
||||
if(istype(main_hand,/obj/item/weapon/gun))
|
||||
var/obj/item/weapon/gun/G = main_hand
|
||||
if(G.special_check(src))
|
||||
if(G.can_trigger_gun(src))
|
||||
var/shouldFire = 1
|
||||
if(istype(main_hand, /obj/item/weapon/gun/energy))
|
||||
var/obj/item/weapon/gun/energy/P = main_hand
|
||||
var/stunning = 0
|
||||
if(ispath(text2path(P.projectile_type), /obj/item/projectile/energy/electrode))
|
||||
stunning = 1
|
||||
for(var/A in P.ammo_type)
|
||||
if(ispath(A,/obj/item/ammo_casing/energy/electrode))
|
||||
stunning = 1
|
||||
var/mob/stunCheck = TARGET
|
||||
if(stunning && stunCheck.stunned)
|
||||
shouldFire = 0
|
||||
if(shouldFire)
|
||||
if(!G.process_chambered())
|
||||
G.click_empty(src)
|
||||
if(!G.can_shoot())
|
||||
G.shoot_with_empty_chamber(src)
|
||||
npcDrop(G, 1)
|
||||
else
|
||||
G.Fire(TARGET, src)
|
||||
G.process_fire(TARGET, src)
|
||||
else
|
||||
if(get_dist(src,TARGET) > 6)
|
||||
if(!walk2derpless(TARGET))
|
||||
@@ -871,4 +872,4 @@
|
||||
else
|
||||
A.stamp(S)
|
||||
custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as they stamp \the [A] with \a [S]!")
|
||||
return
|
||||
return
|
||||
|
||||
@@ -148,6 +148,9 @@
|
||||
if(prob(braindam))
|
||||
message = uppertext(message)
|
||||
verb = "yells loudly"
|
||||
|
||||
if(locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs)
|
||||
message = "<span class='sans'>[message]</span>"
|
||||
|
||||
returns[1] = message
|
||||
returns[2] = verb
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
if("Warden","Security Officer","Security Pod Pilot")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_in_backpack)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_in_backpack)
|
||||
if("Magistrate")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/magistrate
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/magistrate
|
||||
|
||||
@@ -465,4 +465,4 @@
|
||||
else
|
||||
healths.icon_state = "health6"
|
||||
else
|
||||
healths.icon_state = "health7"
|
||||
healths.icon_state = "health7"
|
||||
|
||||
@@ -59,6 +59,8 @@
|
||||
if(get_nations_mode())
|
||||
process_nations()
|
||||
|
||||
..()
|
||||
|
||||
/mob/living/proc/handle_breathing()
|
||||
return
|
||||
|
||||
@@ -251,19 +253,17 @@
|
||||
/mob/living/proc/give_action_button(var/obj/item/I, recursive = 0)
|
||||
if(I.action_button_name)
|
||||
if(!I.action)
|
||||
if(istype(I, /obj/item/organ/internal))
|
||||
I.action = new/datum/action/item_action/organ_action
|
||||
else if(I.action_button_is_hands_free)
|
||||
I.action = new/datum/action/item_action/hands_free
|
||||
if(I.action_button_custom_type)
|
||||
I.action = new I.action_button_custom_type
|
||||
else
|
||||
I.action = new/datum/action/item_action
|
||||
I.action = new /datum/action/item_action
|
||||
I.action.name = I.action_button_name
|
||||
I.action.target = I
|
||||
I.action.Grant(src)
|
||||
|
||||
if(recursive)
|
||||
for(var/obj/item/T in I)
|
||||
give_action_button(I, recursive - 1)
|
||||
give_action_button(T, recursive - 1)
|
||||
|
||||
/mob/living/update_action_buttons()
|
||||
if(!hud_used) return
|
||||
|
||||
@@ -855,3 +855,9 @@
|
||||
tally += 10
|
||||
|
||||
return tally
|
||||
|
||||
/mob/living/proc/can_use_guns(var/obj/item/weapon/gun/G)
|
||||
if (G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser())
|
||||
to_chat(src, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -47,10 +47,6 @@
|
||||
proj_sharp = 0
|
||||
proj_edge = 0
|
||||
|
||||
if(istype(P, /obj/item/projectile/beam/lightning)) //Stupid snowflake lightning gun.
|
||||
if(P.damage >= 200)
|
||||
src.dust()
|
||||
|
||||
if(!P.nodamage)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, armor)
|
||||
return P.on_hit(src, armor, def_zone)
|
||||
|
||||
@@ -814,7 +814,8 @@ var/list/ai_verbs_default = list(
|
||||
var/icon_list[] = list(
|
||||
"default",
|
||||
"floating face",
|
||||
"xeno queen"
|
||||
"xeno queen",
|
||||
"eldritch"
|
||||
)
|
||||
input = input("Please select a hologram:") as null|anything in icon_list
|
||||
if(input)
|
||||
@@ -826,6 +827,8 @@ var/list/ai_verbs_default = list(
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo2"))
|
||||
if("xeno queen")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo3"))
|
||||
if("eldritch")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4"))
|
||||
return
|
||||
|
||||
/mob/living/silicon/ai/proc/corereturn()
|
||||
|
||||
@@ -337,7 +337,7 @@
|
||||
src.modules += new /obj/item/device/flash/cyborg(src)
|
||||
src.modules += new /obj/item/borg/sight/thermal(src)
|
||||
src.modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
|
||||
src.modules += new /obj/item/weapon/gun/energy/pulse_rifle/cyborg(src)
|
||||
src.modules += new /obj/item/weapon/gun/energy/pulse/cyborg(src)
|
||||
src.modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src)
|
||||
src.modules += new /obj/item/weapon/crowbar(src)
|
||||
src.emag = null
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
return
|
||||
newname = "redtag ED-209 assembly"
|
||||
if("")
|
||||
if(!istype(W, /obj/item/weapon/gun/energy/advtaser))
|
||||
if(!istype(W, /obj/item/weapon/gun/energy/gun/advtaser))
|
||||
return
|
||||
newname = "taser ED-209 assembly"
|
||||
else
|
||||
|
||||
@@ -365,7 +365,7 @@ Auto Patrol[]"},
|
||||
new /obj/item/device/assembly/prox_sensor(Tsec)
|
||||
|
||||
if(!lasercolor)
|
||||
var/obj/item/weapon/gun/energy/advtaser/G = new /obj/item/weapon/gun/energy/advtaser(Tsec)
|
||||
var/obj/item/weapon/gun/energy/gun/advtaser/G = new /obj/item/weapon/gun/energy/gun/advtaser(Tsec)
|
||||
G.power_supply.charge = 0
|
||||
G.update_icon()
|
||||
else if(lasercolor == "b")
|
||||
@@ -403,7 +403,7 @@ Auto Patrol[]"},
|
||||
shoot_sound = 'sound/weapons/laser.ogg'
|
||||
if(emagged == 2)
|
||||
if(lasercolor)
|
||||
projectile = /obj/item/projectile/lasertag
|
||||
projectile = /obj/item/projectile/beam/lasertag
|
||||
else
|
||||
projectile = /obj/item/projectile/beam
|
||||
else
|
||||
@@ -411,9 +411,9 @@ Auto Patrol[]"},
|
||||
shoot_sound = 'sound/weapons/Taser.ogg'
|
||||
projectile = /obj/item/projectile/energy/electrode
|
||||
else if(lasercolor == "b")
|
||||
projectile = /obj/item/projectile/lasertag/blue
|
||||
projectile = /obj/item/projectile/beam/lasertag/bluetag
|
||||
else if(lasercolor == "r")
|
||||
projectile = /obj/item/projectile/lasertag/red
|
||||
projectile = /obj/item/projectile/beam/lasertag/redtag
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/proc/shootAt(mob/target)
|
||||
if(lastfired && world.time - lastfired < shot_delay)
|
||||
@@ -438,8 +438,7 @@ Auto Patrol[]"},
|
||||
A.current = U
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
spawn(0)
|
||||
A.process()
|
||||
A.fire()
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/attack_alien(mob/living/carbon/alien/user)
|
||||
..()
|
||||
@@ -491,10 +490,10 @@ Auto Patrol[]"},
|
||||
if(!disabled)
|
||||
var/lasertag_check = 0
|
||||
if((lasercolor == "b"))
|
||||
if(istype(Proj, /obj/item/projectile/lasertag/red))
|
||||
if(istype(Proj, /obj/item/projectile/beam/lasertag/redtag))
|
||||
lasertag_check++
|
||||
else if((lasercolor == "r"))
|
||||
if(istype(Proj, /obj/item/projectile/lasertag/blue))
|
||||
if(istype(Proj, /obj/item/projectile/beam/lasertag/bluetag))
|
||||
lasertag_check++
|
||||
if(lasertag_check)
|
||||
icon_state = "[lasercolor]ed2090"
|
||||
|
||||
@@ -632,8 +632,7 @@
|
||||
A.current = T
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
spawn( 0 )
|
||||
A.process()
|
||||
A.fire()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/pet/corgi/Ian/borgi/Life()
|
||||
@@ -657,4 +656,4 @@
|
||||
s.start()
|
||||
respawnable_list += src
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
@@ -262,7 +262,8 @@
|
||||
|
||||
var/obj/item/projectile/A = new projectiletype(src.loc)
|
||||
playsound(user, projectilesound, 100, 1)
|
||||
if(!A) return
|
||||
if(!A)
|
||||
return
|
||||
|
||||
A.current = target
|
||||
A.firer = src
|
||||
@@ -272,7 +273,7 @@
|
||||
newtonian_move(get_dir(target, user))
|
||||
A.original = target
|
||||
spawn( 0 )
|
||||
A.process()
|
||||
A.fire()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/DestroySurroundings()
|
||||
|
||||
@@ -65,15 +65,26 @@
|
||||
if ((O.client && !( O.blinded )))
|
||||
to_chat(O, "\red [src] launches a razor-sharp quill at [target]!")
|
||||
|
||||
var/obj/item/weapon/arrow/quill/Q = new(loc)
|
||||
var/obj/item/weapon/quill/Q = new(loc)
|
||||
Q.fingerprintslast = src.ckey
|
||||
Q.throw_at(target,10,30)
|
||||
|
||||
quills--
|
||||
|
||||
spawn(100)
|
||||
to_chat(src, "\red You feel a fresh quill slide into place.")
|
||||
quills++
|
||||
|
||||
/obj/item/weapon/quill
|
||||
name = "vox quill"
|
||||
desc = "A wickedly barbed quill from some bizarre animal."
|
||||
icon_state = "quill"
|
||||
item_state = "quill"
|
||||
throwforce = 5
|
||||
w_class = 3.0
|
||||
sharp = 1
|
||||
edge = 0
|
||||
|
||||
/mob/living/simple_animal/vox/armalis/verb/message_mob()
|
||||
set category = "Alien"
|
||||
set name = "Commune with creature"
|
||||
@@ -155,4 +166,4 @@
|
||||
desc = "A series of metallic lenses and chains."
|
||||
icon = 'icons/obj/clothing/hats.dmi'
|
||||
icon_state = "amp"
|
||||
item_state = "amp"
|
||||
item_state = "amp"
|
||||
|
||||
@@ -34,10 +34,6 @@
|
||||
verbs += /client/proc/readmin
|
||||
spawn(40)
|
||||
if(client)
|
||||
if(client.prefs.lastchangelog != changelog_hash) //bolds the changelog button on the interface so we know there are updates. -CP
|
||||
winset(client, "rpane.changelog", "background-color=#f4aa94;font-style=bold")
|
||||
client.prefs.SetChangelog(client,changelog_hash)
|
||||
to_chat(src, "<span class='info'>Changelog has changed since your last visit.</span>")
|
||||
client.playtitlemusic()
|
||||
|
||||
if(config.player_overflow_cap && config.overflow_server_url) //Overflow rerouting, if set, forces players to be moved to a different server once a player cap is reached. Less rough than a pure kick.
|
||||
|
||||
@@ -452,7 +452,7 @@
|
||||
var/datum/language/chosen_language
|
||||
if(client.prefs.language)
|
||||
chosen_language = all_languages[client.prefs.language]
|
||||
if((chosen_language == null && chosen_language != "None") || (chosen_language && chosen_language.flags & RESTRICTED))
|
||||
if((chosen_language == null && client.prefs.language != "None") || (chosen_language && chosen_language.flags & RESTRICTED))
|
||||
log_debug("[src] had language [client.prefs.language], though they weren't supposed to. Setting to None.")
|
||||
client.prefs.language = "None"
|
||||
|
||||
|
||||
@@ -520,6 +520,11 @@ obj/structure/cable/proc/cableColor(var/colorC)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/stack/cable_coil/split()
|
||||
var/obj/item/stack/cable_coil/C = ..()
|
||||
C.color = color
|
||||
return C
|
||||
|
||||
/obj/item/stack/cable_coil/update_icon()
|
||||
if (!color)
|
||||
color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_ORANGE, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
|
||||
@@ -600,27 +605,6 @@ obj/structure/cable/proc/cableColor(var/colorC)
|
||||
src.use(amt)
|
||||
return
|
||||
|
||||
//remove cables from the stack
|
||||
/* This is probably reduntant
|
||||
/obj/item/stack/cable_coil/use(var/used)
|
||||
if(src.amount < used)
|
||||
return 0
|
||||
else if (src.amount == used)
|
||||
if(ismob(loc)) //handle mob icon update
|
||||
var/mob/M = loc
|
||||
M.unEquip(src)
|
||||
qdel(src)
|
||||
return 1
|
||||
else
|
||||
amount -= used
|
||||
update_icon()
|
||||
return 1
|
||||
*/
|
||||
/obj/item/stack/cable_coil/use(var/used)
|
||||
. = ..()
|
||||
update_icon()
|
||||
return
|
||||
|
||||
//add cables to the stack
|
||||
/obj/item/stack/cable_coil/proc/give(var/extra)
|
||||
if(amount + extra > MAXCOIL)
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
else // Any other
|
||||
A.yo = -20
|
||||
A.xo = 0
|
||||
A.process() //TODO: Carn: check this out
|
||||
A.fire() //TODO: Carn: check this out
|
||||
|
||||
|
||||
/obj/machinery/power/emitter/attackby(obj/item/W, mob/user, params)
|
||||
|
||||
@@ -6,14 +6,16 @@
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
throwforce = 1
|
||||
w_class = 1.0
|
||||
var/caliber = "" //Which kind of guns it can be loaded into
|
||||
var/projectile_type = ""//The bullet type to create when New() is called
|
||||
w_class = 1
|
||||
var/fire_sound = null //What sound should play when this ammo is fired
|
||||
var/caliber = null //Which kind of guns it can be loaded into
|
||||
var/projectile_type = null //The bullet type to create when New() is called
|
||||
var/obj/item/projectile/BB = null //The loaded bullet
|
||||
var/pellets = 1
|
||||
var/deviation = 0
|
||||
var/spread = 0
|
||||
|
||||
var/pellets = 1 //Pellets for spreadshot
|
||||
var/variance = 0 //Variance for inaccuracy fundamental to the casing
|
||||
var/delay = 0 //Delay for energy weapons
|
||||
var/randomspread = 0 //Randomspread for automatics
|
||||
var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown.
|
||||
|
||||
/obj/item/ammo_casing/New()
|
||||
..()
|
||||
@@ -29,54 +31,50 @@
|
||||
icon_state = "[initial(icon_state)][BB ? "-live" : ""]"
|
||||
desc = "[initial(desc)][BB ? "" : " This one is spent"]"
|
||||
|
||||
|
||||
|
||||
/obj/item/ammo_casing/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/weapon/screwdriver))
|
||||
if(BB)
|
||||
if(initial(BB.name) == "bullet")
|
||||
var/tmp_label = ""
|
||||
var/label_text = sanitize(input(user, "Inscribe some text into \the [initial(BB.name)]","Inscription",tmp_label))
|
||||
if(length(label_text) > 20)
|
||||
to_chat(user, "<span class='warning''>The inscription can be at most 20 characters long.</span>")
|
||||
else
|
||||
if(label_text == "")
|
||||
to_chat(user, "<span class='notice'>You scratch the inscription off of [initial(BB)].</span>")
|
||||
BB.name = initial(BB.name)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You inscribe \"[label_text]\" into \the [initial(BB.name)].</span>")
|
||||
BB.name = "[initial(BB.name)] \"[label_text]\""
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can only inscribe a metal bullet.</span>")//because inscribing beanbags is silly
|
||||
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There is no bullet in the casing to inscribe anything into.</span>")
|
||||
|
||||
/obj/item/ammo_casing/attackby(obj/item/ammo_box/box as obj, mob/user as mob, params)
|
||||
if(!istype(box, /obj/item/ammo_box))
|
||||
return
|
||||
if(isturf(loc))
|
||||
var/boolets = 0
|
||||
for(var/obj/item/ammo_casing/pew in loc)
|
||||
if(box.stored_ammo.len >= box.max_ammo)
|
||||
break
|
||||
if(pew.BB)
|
||||
if(box.give_round(pew))
|
||||
boolets++
|
||||
else
|
||||
continue
|
||||
if(boolets > 0)
|
||||
box.update_icon()
|
||||
to_chat(user, "<span class='notice'>You collect [boolets] shell\s. [box] now contains [box.stored_ammo.len] shell\s.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You fail to collect anything.</span>")
|
||||
|
||||
/obj/item/ammo_casing/proc/newshot() //For energy weapons, shotgun shells and wands (!).
|
||||
if(!BB)
|
||||
if (!BB)
|
||||
BB = new projectile_type(src)
|
||||
return
|
||||
|
||||
/obj/item/ammo_casing/attackby(obj/item/I as obj, mob/user as mob, params)
|
||||
if(istype(I, /obj/item/ammo_box))
|
||||
var/obj/item/ammo_box/box = I
|
||||
if(isturf(loc))
|
||||
var/boolets = 0
|
||||
for(var/obj/item/ammo_casing/bullet in loc)
|
||||
if (box.stored_ammo.len >= box.max_ammo)
|
||||
break
|
||||
if (bullet.BB)
|
||||
if (box.give_round(bullet, 0))
|
||||
boolets++
|
||||
else
|
||||
continue
|
||||
if (boolets > 0)
|
||||
box.update_icon()
|
||||
to_chat(user, "<span class='notice'>You collect [boolets] shell\s. [box] now contains [box.stored_ammo.len] shell\s.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You fail to collect anything!</span>")
|
||||
else
|
||||
if(istype(I, /obj/item/weapon/screwdriver))
|
||||
if(BB)
|
||||
if(initial(BB.name) == "bullet")
|
||||
var/tmp_label = ""
|
||||
var/label_text = sanitize(input(user, "Inscribe some text into \the [initial(BB.name)]","Inscription",tmp_label))
|
||||
if(length(label_text) > 20)
|
||||
to_chat(user, "<span class='warning''>The inscription can be at most 20 characters long.</span>")
|
||||
else
|
||||
if(label_text == "")
|
||||
to_chat(user, "<span class='notice'>You scratch the inscription off of [initial(BB)].</span>")
|
||||
BB.name = initial(BB.name)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You inscribe \"[label_text]\" into \the [initial(BB.name)].</span>")
|
||||
BB.name = "[initial(BB.name)] \"[label_text]\""
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can only inscribe a metal bullet.</span>")//because inscribing beanbags is silly
|
||||
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There is no bullet in the casing to inscribe anything into.</span>")
|
||||
..()
|
||||
|
||||
//Boxes of ammo
|
||||
/obj/item/ammo_box
|
||||
@@ -89,53 +87,78 @@
|
||||
item_state = "syringe_kit"
|
||||
materials = list(MAT_METAL=30000)
|
||||
throwforce = 2
|
||||
w_class = 1.0
|
||||
w_class = 1
|
||||
throw_speed = 4
|
||||
throw_range = 10
|
||||
var/list/stored_ammo = list()
|
||||
var/obj/item/ammo_casing/ammo_type
|
||||
var/ammo_type = /obj/item/ammo_casing
|
||||
var/max_ammo = 7
|
||||
var/multiple_sprites = 0
|
||||
var/caliber = ""
|
||||
var/caliber
|
||||
var/multiload = 1
|
||||
|
||||
/obj/item/ammo_box/New()
|
||||
for(var/i = 1, i <= max_ammo, i++)
|
||||
for(var/i in 1 to max_ammo)
|
||||
stored_ammo += new ammo_type(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/ammo_box/proc/get_round(var/keep = 0)
|
||||
if(!stored_ammo.len)
|
||||
/obj/item/ammo_box/Destroy()
|
||||
for(var/atom/A in stored_ammo)
|
||||
qdel(A)
|
||||
stored_ammo = null
|
||||
return ..()
|
||||
|
||||
/obj/item/ammo_box/proc/get_round(keep = 0)
|
||||
if (!stored_ammo.len)
|
||||
return null
|
||||
else
|
||||
var/b = stored_ammo[stored_ammo.len]
|
||||
stored_ammo -= b
|
||||
if(keep)
|
||||
if (keep)
|
||||
stored_ammo.Insert(1,b)
|
||||
return b
|
||||
|
||||
/obj/item/ammo_box/proc/give_round(var/obj/item/ammo_casing/r)
|
||||
var/obj/item/ammo_casing/rb = r
|
||||
if(rb)
|
||||
if(stored_ammo.len < max_ammo && rb.caliber == caliber)
|
||||
stored_ammo += rb
|
||||
rb.loc = src
|
||||
return 1
|
||||
/obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0)
|
||||
// Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type.
|
||||
if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
|
||||
return 0
|
||||
|
||||
if (stored_ammo.len < max_ammo)
|
||||
stored_ammo += R
|
||||
R.loc = src
|
||||
return 1
|
||||
//for accessibles magazines (e.g internal ones) when full, start replacing spent ammo
|
||||
else if(replace_spent)
|
||||
for(var/obj/item/ammo_casing/AC in stored_ammo)
|
||||
if(!AC.BB)//found a spent ammo
|
||||
stored_ammo -= AC
|
||||
AC.loc = get_turf(loc)
|
||||
|
||||
stored_ammo += R
|
||||
R.loc = src
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
/obj/item/ammo_box/attackby(var/obj/item/A as obj, mob/user as mob, var/silent = 0, params)
|
||||
/obj/item/ammo_box/proc/can_load(mob/user)
|
||||
return 1
|
||||
|
||||
/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = 0, replace_spent = 0)
|
||||
var/num_loaded = 0
|
||||
if(!can_load(user))
|
||||
return
|
||||
if(istype(A, /obj/item/ammo_box))
|
||||
var/obj/item/ammo_box/AM = A
|
||||
for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
|
||||
var/didload = give_round(AC)
|
||||
if(didload)
|
||||
var/did_load = give_round(AC, replace_spent)
|
||||
if(did_load)
|
||||
AM.stored_ammo -= AC
|
||||
num_loaded++
|
||||
if(!multiload || !didload)
|
||||
if(!multiload || !did_load)
|
||||
break
|
||||
if(istype(A, /obj/item/ammo_casing))
|
||||
var/obj/item/ammo_casing/AC = A
|
||||
if(give_round(AC))
|
||||
if(give_round(AC, replace_spent))
|
||||
user.drop_item()
|
||||
AC.loc = src
|
||||
num_loaded++
|
||||
@@ -145,6 +168,8 @@
|
||||
A.update_icon()
|
||||
update_icon()
|
||||
|
||||
return num_loaded
|
||||
|
||||
/obj/item/ammo_box/attack_self(mob/user as mob)
|
||||
var/obj/item/ammo_casing/A = get_round()
|
||||
if(A)
|
||||
|
||||
@@ -1,128 +1,146 @@
|
||||
/obj/item/ammo_casing/a357
|
||||
desc = "A .357 bullet casing."
|
||||
caliber = "357"
|
||||
projectile_type = "/obj/item/projectile/bullet"
|
||||
projectile_type = /obj/item/projectile/bullet
|
||||
|
||||
/obj/item/ammo_casing/a762
|
||||
desc = "A 7.62mm bullet casing."
|
||||
icon_state = "762-casing"
|
||||
caliber = "a762"
|
||||
projectile_type = /obj/item/projectile/bullet
|
||||
|
||||
/obj/item/ammo_casing/a762/enchanted
|
||||
projectile_type = /obj/item/projectile/bullet/weakbullet3
|
||||
|
||||
/obj/item/ammo_casing/a50
|
||||
desc = "A .50AE bullet casing."
|
||||
caliber = ".50"
|
||||
projectile_type = "/obj/item/projectile/bullet"
|
||||
projectile_type = /obj/item/projectile/bullet
|
||||
|
||||
/obj/item/ammo_casing/c38
|
||||
desc = "A .38 bullet casing."
|
||||
caliber = "38"
|
||||
projectile_type = "/obj/item/projectile/bullet/weakbullet2/rubber"
|
||||
|
||||
/obj/item/ammo_casing/cap
|
||||
desc = "A cap for children toys."
|
||||
caliber = "caps"
|
||||
projectile_type = "/obj/item/projectile/bullet/cap"
|
||||
|
||||
projectile_type = /obj/item/projectile/bullet/weakbullet2/rubber
|
||||
|
||||
/obj/item/ammo_casing/c10mm
|
||||
desc = "A 10mm bullet casing."
|
||||
caliber = "10mm"
|
||||
projectile_type = "/obj/item/projectile/bullet/midbullet3"
|
||||
|
||||
projectile_type = /obj/item/projectile/bullet/midbullet3
|
||||
|
||||
/obj/item/ammo_casing/c9mm
|
||||
desc = "A 9mm bullet casing."
|
||||
caliber = "9mm"
|
||||
projectile_type = "/obj/item/projectile/bullet/weakbullet3"
|
||||
projectile_type = /obj/item/projectile/bullet/weakbullet3
|
||||
|
||||
/obj/item/ammo_casing/c9mmap
|
||||
desc = "A 9mm bullet casing."
|
||||
caliber = "9mm"
|
||||
projectile_type = "/obj/item/projectile/bullet/armourpiercing"
|
||||
projectile_type = /obj/item/projectile/bullet/armourpiercing
|
||||
|
||||
/obj/item/ammo_casing/c9mmtox
|
||||
desc = "A 9mm bullet casing."
|
||||
caliber = "9mm"
|
||||
projectile_type = "/obj/item/projectile/bullet/toxinbullet"
|
||||
projectile_type = /obj/item/projectile/bullet/toxinbullet
|
||||
|
||||
/obj/item/ammo_casing/c9mminc
|
||||
desc = "A 9mm bullet casing."
|
||||
caliber = "9mm"
|
||||
projectile_type = "/obj/item/projectile/bullet/incendiary/firebullet"
|
||||
projectile_type = /obj/item/projectile/bullet/incendiary/firebullet
|
||||
|
||||
/obj/item/ammo_casing/c46x30mm
|
||||
desc = "A 4.6x30mm bullet casing."
|
||||
caliber = "4.6x30mm"
|
||||
projectile_type = "/obj/item/projectile/bullet/weakbullet3"
|
||||
projectile_type = /obj/item/projectile/bullet/weakbullet3
|
||||
|
||||
/obj/item/ammo_casing/c46x30mmap
|
||||
desc = "A 4.6x30mm bullet casing."
|
||||
caliber = "4.6x30mm"
|
||||
projectile_type = "/obj/item/projectile/bullet/armourpiercing"
|
||||
projectile_type = /obj/item/projectile/bullet/armourpiercing
|
||||
|
||||
/obj/item/ammo_casing/c46x30mmtox
|
||||
desc = "A 4.6x30mm bullet casing."
|
||||
caliber = "4.6x30mm"
|
||||
projectile_type = "/obj/item/projectile/bullet/toxinbullet"
|
||||
projectile_type = /obj/item/projectile/bullet/toxinbullet
|
||||
|
||||
/obj/item/ammo_casing/c46x30mminc
|
||||
desc = "A 4.6x30mm bullet casing."
|
||||
caliber = "4.6x30mm"
|
||||
projectile_type = "/obj/item/projectile/bullet/incendiary/firebullet"
|
||||
projectile_type = /obj/item/projectile/bullet/incendiary/firebullet
|
||||
|
||||
/obj/item/ammo_casing/c45
|
||||
desc = "A .45 bullet casing."
|
||||
caliber = ".45"
|
||||
projectile_type = "/obj/item/projectile/bullet/midbullet"
|
||||
projectile_type = /obj/item/projectile/bullet/midbullet
|
||||
|
||||
/obj/item/ammo_casing/c45nostamina
|
||||
desc = "A .45 bullet casing."
|
||||
caliber = ".45"
|
||||
projectile_type = /obj/item/projectile/bullet/midbullet3
|
||||
|
||||
/obj/item/ammo_casing/n762
|
||||
desc = "A 7.62x38mmR bullet casing."
|
||||
caliber = "n762"
|
||||
projectile_type = /obj/item/projectile/bullet
|
||||
|
||||
/obj/item/ammo_casing/caseless/magspear
|
||||
name = "magnetic spear"
|
||||
desc = "A reusable spear that is typically loaded into kinetic spearguns."
|
||||
projectile_type = /obj/item/projectile/bullet/reusable/magspear
|
||||
caliber = "speargun"
|
||||
icon_state = "magspear"
|
||||
throwforce = 15 //still deadly when thrown
|
||||
throw_speed = 3
|
||||
|
||||
/obj/item/ammo_casing/shotgun
|
||||
name = "shotgun slug"
|
||||
desc = "A 12 gauge lead slug."
|
||||
icon_state = "blshell"
|
||||
caliber = "shotgun"
|
||||
projectile_type = "/obj/item/projectile/bullet"
|
||||
projectile_type = /obj/item/projectile/bullet
|
||||
materials = list(MAT_METAL=4000)
|
||||
|
||||
|
||||
/obj/item/ammo_casing/shotgun/buckshot
|
||||
name = "buckshot shell"
|
||||
desc = "A 12 gauge buckshot shell."
|
||||
icon_state = "gshell"
|
||||
projectile_type = "/obj/item/projectile/bullet/pellet"
|
||||
projectile_type = /obj/item/projectile/bullet/pellet
|
||||
pellets = 6
|
||||
deviation = 30
|
||||
variance = 25
|
||||
|
||||
/obj/item/ammo_casing/shotgun/rubbershot
|
||||
name = "rubber shot"
|
||||
desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance."
|
||||
icon_state = "bshell"
|
||||
projectile_type = "/obj/item/projectile/bullet/rpellet"
|
||||
projectile_type = /obj/item/projectile/bullet/rpellet
|
||||
pellets = 6
|
||||
deviation = 30
|
||||
variance = 25
|
||||
materials = list(MAT_METAL=4000)
|
||||
|
||||
/obj/item/ammo_casing/shotgun/beanbag
|
||||
name = "beanbag slug"
|
||||
desc = "A weak beanbag slug for riot control."
|
||||
icon_state = "bshell"
|
||||
projectile_type = "/obj/item/projectile/bullet/weakbullet/rubber"
|
||||
projectile_type = /obj/item/projectile/bullet/weakbullet/rubber
|
||||
materials = list(MAT_METAL=250)
|
||||
|
||||
|
||||
/obj/item/ammo_casing/shotgun/improvised
|
||||
name = "improvised shell"
|
||||
desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards."
|
||||
icon_state = "gshell"
|
||||
projectile_type = "/obj/item/projectile/bullet/pellet/weak"
|
||||
projectile_type = /obj/item/projectile/bullet/pellet/weak
|
||||
materials = list(MAT_METAL=250)
|
||||
pellets = 5
|
||||
deviation = 30
|
||||
variance = 25
|
||||
|
||||
/obj/item/ammo_casing/shotgun/improvised/overload
|
||||
name = "overloaded improvised shell"
|
||||
desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards. This one has been packed with even more \
|
||||
propellant. It's like playing russian roulette, with a shotgun."
|
||||
icon_state = "improvshell"
|
||||
projectile_type = "/obj/item/projectile/bullet/pellet/random"
|
||||
projectile_type = /obj/item/projectile/bullet/pellet/overload
|
||||
materials = list(MAT_METAL=250)
|
||||
pellets = 5
|
||||
deviation = 30
|
||||
variance = 40
|
||||
|
||||
/obj/item/ammo_casing/shotgun/improvised/overload/New()
|
||||
..()
|
||||
@@ -132,15 +150,20 @@
|
||||
name = "taser slug"
|
||||
desc = "A stunning taser slug."
|
||||
icon_state = "stunshell"
|
||||
projectile_type = "/obj/item/projectile/bullet/stunshot"
|
||||
projectile_type = /obj/item/projectile/bullet/stunshot
|
||||
materials = list(MAT_METAL=250)
|
||||
|
||||
|
||||
/obj/item/ammo_casing/shotgun/meteorshot
|
||||
name = "meteorshot shell"
|
||||
desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired."
|
||||
icon_state = "mshell"
|
||||
projectile_type = "/obj/item/projectile/bullet/meteorshot"
|
||||
projectile_type = /obj/item/projectile/bullet/meteorshot
|
||||
|
||||
/obj/item/ammo_casing/shotgun/breaching
|
||||
name = "breaching shell"
|
||||
desc = "An economic version of the meteorshot, utilizing similar technologies. Great for busting down doors."
|
||||
icon_state = "mshell"
|
||||
projectile_type = /obj/item/projectile/bullet/meteorshot/weak
|
||||
|
||||
/obj/item/ammo_casing/shotgun/pulseslug
|
||||
name = "pulse slug"
|
||||
@@ -148,42 +171,42 @@
|
||||
energy blast. While the heat and power drain limit it to one use, it can still allow an operator to engage targets that ballistic ammunition \
|
||||
would have difficulty with."
|
||||
icon_state = "pshell"
|
||||
projectile_type = "/obj/item/projectile/beam/pulse/shot"
|
||||
projectile_type = /obj/item/projectile/beam/pulse/shot
|
||||
|
||||
/obj/item/ammo_casing/shotgun/incendiary
|
||||
name = "incendiary slug"
|
||||
desc = "An incendiary-coated shotgun slug."
|
||||
icon_state = "ishell"
|
||||
projectile_type = "/obj/item/projectile/bullet/incendiary/shell"
|
||||
projectile_type = /obj/item/projectile/bullet/incendiary/shell
|
||||
|
||||
/obj/item/ammo_casing/shotgun/frag12
|
||||
name = "FRAG-12 slug"
|
||||
desc = "A high explosive breaching round for a 12 gauge shotgun."
|
||||
icon_state = "heshell"
|
||||
projectile_type = "/obj/item/projectile/bullet/frag12"
|
||||
projectile_type = /obj/item/projectile/bullet/frag12
|
||||
|
||||
/obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
|
||||
name = "dragonsbreath shell"
|
||||
desc = "A shotgun shell which fires a spread of incendiary pellets."
|
||||
icon_state = "ishell2"
|
||||
projectile_type = "/obj/item/projectile/bullet/incendiary/shell/dragonsbreath"
|
||||
projectile_type = /obj/item/projectile/bullet/incendiary/shell/dragonsbreath
|
||||
pellets = 4
|
||||
deviation = 30
|
||||
variance = 35
|
||||
|
||||
/obj/item/ammo_casing/shotgun/ion
|
||||
name = "ion shell"
|
||||
desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \
|
||||
The unique properties of the crystal splot the pulse into a spread of individually weaker bolts."
|
||||
icon_state = "ionshell"
|
||||
projectile_type = "/obj/item/projectile/ion/weak"
|
||||
projectile_type = /obj/item/projectile/ion/weak
|
||||
pellets = 4
|
||||
deviation = 30
|
||||
variance = 35
|
||||
|
||||
/obj/item/ammo_casing/shotgun/laserslug
|
||||
name = "laser slug"
|
||||
desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a laser weapon in a ballistic package."
|
||||
icon_state = "lshell"
|
||||
projectile_type = "/obj/item/projectile/beam"
|
||||
projectile_type = /obj/item/projectile/beam
|
||||
|
||||
/obj/item/ammo_casing/shotgun/techshell
|
||||
name = "unloaded technological shell"
|
||||
@@ -195,7 +218,7 @@
|
||||
name = "shotgun dart"
|
||||
desc = "A dart for use in shotguns. Can be injected with up to 30 units of any chemical."
|
||||
icon_state = "cshell"
|
||||
projectile_type = "/obj/item/projectile/bullet/dart"
|
||||
projectile_type = /obj/item/projectile/bullet/dart
|
||||
|
||||
/obj/item/ammo_casing/shotgun/dart/New()
|
||||
..()
|
||||
@@ -206,93 +229,116 @@
|
||||
/obj/item/ammo_casing/shotgun/dart/attackby()
|
||||
return
|
||||
|
||||
/obj/item/ammo_casing/shotgun/dart/bioterror
|
||||
desc = "A shotgun dart filled with deadly toxins."
|
||||
|
||||
/obj/item/ammo_casing/shotgun/dart/bioterror/New()
|
||||
..()
|
||||
reagents.add_reagent("neurotoxin", 6)
|
||||
reagents.add_reagent("spores", 6)
|
||||
reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT
|
||||
reagents.add_reagent("coniine", 6)
|
||||
reagents.add_reagent("sodium_thiopental", 6)
|
||||
|
||||
/obj/item/ammo_casing/shotgun/tranquilizer
|
||||
name = "tranquilizer darts"
|
||||
desc = "A tranquilizer round used to subdue individuals utilizing stimulants."
|
||||
icon_state = "cshell"
|
||||
projectile_type = "/obj/item/projectile/bullet/dart/syringe/tranquilizer"
|
||||
projectile_type = /obj/item/projectile/bullet/dart/syringe/tranquilizer
|
||||
materials = list(MAT_METAL=250)
|
||||
|
||||
/obj/item/ammo_casing/syringegun
|
||||
name = "syringe gun spring"
|
||||
desc = "A high-power spring that throws syringes."
|
||||
projectile_type = null
|
||||
/obj/item/ammo_casing/a556
|
||||
desc = "A 5.56mm bullet casing."
|
||||
caliber = "a556"
|
||||
projectile_type = /obj/item/projectile/bullet/heavybullet
|
||||
|
||||
/obj/item/ammo_casing/shotgun/fakebeanbag
|
||||
name = "beanbag shell"
|
||||
desc = "A weak beanbag shell."
|
||||
icon_state = "bshell"
|
||||
projectile_type = "/obj/item/projectile/bullet/weakbullet/booze"
|
||||
|
||||
/obj/item/ammo_casing/a762
|
||||
desc = "A 7.62mm bullet casing."
|
||||
icon_state = "762-casing"
|
||||
caliber = "a762"
|
||||
projectile_type = "/obj/item/projectile/bullet"
|
||||
|
||||
/obj/item/ammo_casing/a556
|
||||
desc = "A 5.56mm bullet casing."
|
||||
caliber = "a556"
|
||||
projectile_type = "/obj/item/projectile/bullet/heavybullet"
|
||||
projectile_type = /obj/item/projectile/bullet/weakbullet/booze
|
||||
|
||||
/obj/item/ammo_casing/rocket
|
||||
name = "rocket shell"
|
||||
desc = "A high explosive designed to be fired from a launcher."
|
||||
icon_state = "rocketshell"
|
||||
projectile_type = "/obj/item/missile"
|
||||
projectile_type = /obj/item/missile
|
||||
caliber = "rocket"
|
||||
|
||||
/obj/item/ammo_casing/caseless
|
||||
desc = "A caseless bullet casing."
|
||||
|
||||
/obj/item/ammo_casing/caseless/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, distro, quiet)
|
||||
if (..())
|
||||
loc = null
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/ammo_casing/caseless/a75
|
||||
desc = "A .75 bullet casing."
|
||||
caliber = "75"
|
||||
projectile_type = "/obj/item/projectile/bullet/gyro"
|
||||
projectile_type = /obj/item/projectile/bullet/gyro
|
||||
|
||||
/obj/item/ammo_casing/a40mm
|
||||
name = "40mm HE shell"
|
||||
desc = "A cased high explosive grenade that can only be activated once fired out of a grenade launcher."
|
||||
caliber = "40mm"
|
||||
icon_state = "40mmHE"
|
||||
projectile_type = "/obj/item/projectile/bullet/a40mm"
|
||||
projectile_type = /obj/item/projectile/bullet/a40mm
|
||||
|
||||
//FOAM DARTS
|
||||
/obj/item/ammo_casing/caseless/foam_dart
|
||||
name = "foam dart"
|
||||
desc = "It's nerf or nothing! Ages 8 and up."
|
||||
projectile_type = "/obj/item/projectile/bullet/reusable/foam_dart"
|
||||
projectile_type = /obj/item/projectile/bullet/reusable/foam_dart
|
||||
caliber = "foam_force"
|
||||
icon = 'icons/obj/toyguns.dmi'
|
||||
icon = 'icons/obj/guns/toy.dmi'
|
||||
icon_state = "foamdart"
|
||||
var/modified = 0
|
||||
|
||||
/obj/item/ammo_casing/caseless/foam_dart/update_icon()
|
||||
if(modified)
|
||||
icon_state = "foamdart_empty"
|
||||
|
||||
/obj/item/ammo_casing/caseless/foam_dart/attackby(var/obj/item/weapon/A as obj, mob/user as mob, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/weapon/screwdriver) && !modified)
|
||||
modified = 1
|
||||
BB.damage_type = BRUTE
|
||||
if (modified)
|
||||
icon_state = "foamdart_empty"
|
||||
desc = "It's nerf or nothing! ...Although, this one doesn't look too safe."
|
||||
to_chat(user, "<span class='notice'>You pop the safety cap off of [src].</span>")
|
||||
else if((istype(A, /obj/item/weapon/pen)) && modified && !BB.contents.len)
|
||||
desc = "Its nerf or nothing! ... Although, this one doesn't look too safe."
|
||||
if(BB)
|
||||
BB.icon_state = "foamdart_empty"
|
||||
else
|
||||
icon_state = "foamdart"
|
||||
desc = "Its nerf or nothing! Ages 8 and up."
|
||||
if(BB)
|
||||
BB.icon_state = "foamdart_empty"
|
||||
|
||||
/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
|
||||
if (istype(A, /obj/item/weapon/screwdriver) && !modified)
|
||||
modified = 1
|
||||
FD.damage_type = BRUTE
|
||||
update_icon()
|
||||
else if ((istype(A, /obj/item/weapon/pen)) && modified && !FD.pen)
|
||||
if(!user.unEquip(A))
|
||||
return
|
||||
A.forceMove(BB)
|
||||
BB.damage = 5
|
||||
BB.nodamage = 0
|
||||
A.loc = FD
|
||||
FD.pen = A
|
||||
FD.damage = 5
|
||||
FD.nodamage = 0
|
||||
to_chat(user, "<span class='notice'>You insert [A] into [src].</span>")
|
||||
return
|
||||
|
||||
/obj/item/ammo_casing/caseless/foam_dart/attack_self(mob/living/user)
|
||||
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
|
||||
if(FD.pen)
|
||||
FD.damage = initial(FD.damage)
|
||||
FD.nodamage = initial(FD.nodamage)
|
||||
user.put_in_hands(FD.pen)
|
||||
to_chat(user, "<span class='notice'>You remove [FD.pen] from [src].</span>")
|
||||
FD.pen = null
|
||||
|
||||
/obj/item/ammo_casing/caseless/foam_dart/riot
|
||||
name = "riot foam dart"
|
||||
desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
|
||||
projectile_type = "/obj/item/projectile/bullet/reusable/foam_dart/riot"
|
||||
projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot
|
||||
icon_state = "foamdart_riot"
|
||||
|
||||
/obj/item/ammo_casing/shotgun/dart/assassination
|
||||
@@ -301,3 +347,8 @@
|
||||
/obj/item/ammo_casing/shotgun/dart/assassination/New()
|
||||
..()
|
||||
reagents.add_reagent("neurotoxin", 6)
|
||||
|
||||
/obj/item/ammo_casing/cap
|
||||
desc = "A cap for children toys."
|
||||
caliber = "caps"
|
||||
projectile_type = /obj/item/projectile/bullet/cap
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/item/ammo_box/a357
|
||||
name = "speed loader (.357)"
|
||||
desc = "Designed to quickly reload revolvers."
|
||||
icon_state = "357"
|
||||
ammo_type = /obj/item/ammo_casing/a357
|
||||
max_ammo = 7
|
||||
@@ -7,18 +8,12 @@
|
||||
|
||||
/obj/item/ammo_box/c38
|
||||
name = "speed loader (.38)"
|
||||
desc = "Designed to quickly reload revolvers."
|
||||
icon_state = "38"
|
||||
ammo_type = /obj/item/ammo_casing/c38
|
||||
max_ammo = 6
|
||||
multiple_sprites = 1
|
||||
|
||||
/obj/item/ammo_box/caps
|
||||
name = "speed loader (caps)"
|
||||
icon_state = "357"
|
||||
ammo_type = /obj/item/ammo_casing/cap
|
||||
max_ammo = 7
|
||||
multiple_sprites = 1
|
||||
|
||||
/obj/item/ammo_box/c9mm
|
||||
name = "ammo box (9mm)"
|
||||
icon_state = "9mmbox"
|
||||
@@ -55,6 +50,13 @@
|
||||
max_ammo = 5
|
||||
multiple_sprites = 1
|
||||
|
||||
/obj/item/ammo_box/n762
|
||||
name = "ammo box (7.62x38mmR)"
|
||||
icon_state = "10mmbox"
|
||||
origin_tech = "combat=2"
|
||||
ammo_type = /obj/item/ammo_casing/n762
|
||||
max_ammo = 14
|
||||
|
||||
/obj/item/ammo_box/shotgun
|
||||
name = "Ammunition Box (slug)"
|
||||
icon_state = "9mmbox"
|
||||
@@ -91,7 +93,7 @@
|
||||
//FOAM DARTS
|
||||
/obj/item/ammo_box/foambox
|
||||
name = "ammo box (Foam Darts)"
|
||||
icon = 'icons/obj/toyguns.dmi'
|
||||
icon = 'icons/obj/guns/toy.dmi'
|
||||
icon_state = "foambox"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/foam_dart
|
||||
max_ammo = 40
|
||||
@@ -99,3 +101,10 @@
|
||||
/obj/item/ammo_box/foambox/riot
|
||||
icon_state = "foambox_riot"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
|
||||
|
||||
/obj/item/ammo_box/caps
|
||||
name = "speed loader (caps)"
|
||||
icon_state = "357"
|
||||
ammo_type = /obj/item/ammo_casing/cap
|
||||
max_ammo = 7
|
||||
multiple_sprites = 1
|
||||
|
||||
@@ -0,0 +1,231 @@
|
||||
/obj/item/ammo_casing/energy
|
||||
name = "energy weapon lens"
|
||||
desc = "The part of the gun that makes the laser go pew"
|
||||
caliber = "energy"
|
||||
projectile_type = /obj/item/projectile/energy
|
||||
var/e_cost = 1000 //The amount of energy a cell needs to expend to create this shot.
|
||||
var/select_name = "energy"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
|
||||
/obj/item/ammo_casing/energy/laser
|
||||
projectile_type = /obj/item/projectile/beam/laser
|
||||
select_name = "kill"
|
||||
|
||||
/obj/item/ammo_casing/energy/lasergun
|
||||
projectile_type = /obj/item/projectile/beam/laser
|
||||
e_cost = 830
|
||||
select_name = "kill"
|
||||
|
||||
/obj/item/ammo_casing/energy/laser/hos //allows balancing of HoS and blueshit guns seperately from other energy weapons
|
||||
|
||||
/obj/item/ammo_casing/energy/laser/practice
|
||||
projectile_type = /obj/item/projectile/beam/practice
|
||||
select_name = "practice"
|
||||
|
||||
/obj/item/ammo_casing/energy/laser/scatter
|
||||
projectile_type = /obj/item/projectile/beam/scatter
|
||||
pellets = 5
|
||||
variance = 25
|
||||
select_name = "scatter"
|
||||
|
||||
/obj/item/ammo_casing/energy/laser/heavy
|
||||
projectile_type = /obj/item/projectile/beam/laser/heavylaser
|
||||
select_name = "anti-vehicle"
|
||||
fire_sound = 'sound/weapons/lasercannonfire.ogg'
|
||||
|
||||
/obj/item/ammo_casing/energy/laser/pulse
|
||||
projectile_type = /obj/item/projectile/beam/pulse
|
||||
e_cost = 200
|
||||
select_name = "DESTROY"
|
||||
fire_sound = 'sound/weapons/pulse.ogg'
|
||||
|
||||
/obj/item/ammo_casing/energy/laser/scatter/pulse
|
||||
projectile_type = /obj/item/projectile/beam/pulse
|
||||
e_cost = 2000
|
||||
select_name = "ANNIHILATE"
|
||||
fire_sound = 'sound/weapons/pulse.ogg'
|
||||
|
||||
/obj/item/ammo_casing/energy/laser/bluetag
|
||||
projectile_type = /obj/item/projectile/beam/lasertag/bluetag
|
||||
select_name = "bluetag"
|
||||
|
||||
/obj/item/ammo_casing/energy/laser/redtag
|
||||
projectile_type = /obj/item/projectile/beam/lasertag/redtag
|
||||
select_name = "redtag"
|
||||
|
||||
/obj/item/ammo_casing/energy/xray
|
||||
projectile_type = /obj/item/projectile/beam/xray
|
||||
e_cost = 500
|
||||
fire_sound = 'sound/weapons/laser3.ogg'
|
||||
|
||||
/obj/item/ammo_casing/energy/immolator
|
||||
projectile_type = /obj/item/projectile/beam/immolator
|
||||
fire_sound = 'sound/weapons/laser3.ogg'
|
||||
e_cost = 1250
|
||||
|
||||
/obj/item/ammo_casing/energy/electrode
|
||||
projectile_type = /obj/item/projectile/energy/electrode
|
||||
select_name = "stun"
|
||||
fire_sound = 'sound/weapons/taser.ogg'
|
||||
e_cost = 2000
|
||||
delay = 15
|
||||
|
||||
/obj/item/ammo_casing/energy/electrode/gun
|
||||
fire_sound = 'sound/weapons/gunshot.ogg'
|
||||
e_cost = 1000
|
||||
|
||||
/obj/item/ammo_casing/energy/electrode/hos //allows balancing of HoS and blueshit guns seperately from other energy weapons
|
||||
|
||||
/obj/item/ammo_casing/energy/ion
|
||||
projectile_type = /obj/item/projectile/ion
|
||||
select_name = "ion"
|
||||
fire_sound = 'sound/weapons/IonRifle.ogg'
|
||||
|
||||
/obj/item/ammo_casing/energy/declone
|
||||
projectile_type = /obj/item/projectile/energy/declone
|
||||
select_name = "declone"
|
||||
fire_sound = 'sound/weapons/pulse3.ogg'
|
||||
|
||||
/obj/item/ammo_casing/energy/mindflayer
|
||||
projectile_type = /obj/item/projectile/beam/mindflayer
|
||||
select_name = "MINDFUCK"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
|
||||
/obj/item/ammo_casing/energy/flora
|
||||
fire_sound = 'sound/effects/stealthoff.ogg'
|
||||
|
||||
/obj/item/ammo_casing/energy/flora/yield
|
||||
projectile_type = /obj/item/projectile/energy/florayield
|
||||
select_name = "yield"
|
||||
|
||||
/obj/item/ammo_casing/energy/flora/mut
|
||||
projectile_type = /obj/item/projectile/energy/floramut
|
||||
select_name = "mutation"
|
||||
|
||||
/obj/item/ammo_casing/energy/temp
|
||||
projectile_type = /obj/item/projectile/temp
|
||||
var/temperature = 300
|
||||
e_cost = 100
|
||||
fire_sound = 'sound/weapons/pulse3.ogg'
|
||||
|
||||
/obj/item/ammo_casing/energy/temp/newshot()
|
||||
..()
|
||||
var/obj/item/projectile/temp/T = BB
|
||||
T.temperature = temperature
|
||||
|
||||
/obj/item/ammo_casing/energy/meteor
|
||||
projectile_type = /obj/item/projectile/meteor
|
||||
select_name = "goddamn meteor"
|
||||
|
||||
/obj/item/ammo_casing/energy/kinetic
|
||||
projectile_type = /obj/item/projectile/kinetic
|
||||
select_name = "kinetic"
|
||||
e_cost = 5000
|
||||
fire_sound = 'sound/weapons/Kenetic_accel.ogg' // fine spelling there chap
|
||||
|
||||
/obj/item/ammo_casing/energy/kinetic/super
|
||||
projectile_type = /obj/item/projectile/kinetic/super
|
||||
|
||||
/obj/item/ammo_casing/energy/kinetic/hyper
|
||||
projectile_type = /obj/item/projectile/kinetic/hyper
|
||||
|
||||
/obj/item/ammo_casing/energy/disabler
|
||||
projectile_type = /obj/item/projectile/beam/disabler
|
||||
select_name = "disable"
|
||||
e_cost = 500
|
||||
fire_sound = "sound/weapons/taser2.ogg"
|
||||
|
||||
/obj/item/ammo_casing/energy/plasma
|
||||
projectile_type = /obj/item/projectile/plasma
|
||||
select_name = "plasma burst"
|
||||
fire_sound = 'sound/weapons/plasma_cutter.ogg'
|
||||
delay = 15
|
||||
e_cost = 250
|
||||
|
||||
/obj/item/ammo_casing/energy/plasma/adv
|
||||
projectile_type = /obj/item/projectile/plasma/adv
|
||||
delay = 10
|
||||
e_cost = 100
|
||||
|
||||
/obj/item/ammo_casing/energy/wormhole
|
||||
projectile_type = /obj/item/projectile/beam/wormhole
|
||||
e_cost = 0
|
||||
fire_sound = "sound/weapons/pulse3.ogg"
|
||||
var/obj/item/weapon/gun/energy/wormhole_projector/gun = null
|
||||
select_name = "blue"
|
||||
|
||||
/obj/item/ammo_casing/energy/wormhole/New(var/obj/item/weapon/gun/energy/wormhole_projector/wh)
|
||||
gun = wh
|
||||
|
||||
/obj/item/ammo_casing/energy/wormhole/orange
|
||||
projectile_type = /obj/item/projectile/beam/wormhole/orange
|
||||
select_name = "orange"
|
||||
|
||||
/obj/item/ammo_casing/energy/bolt
|
||||
projectile_type = /obj/item/projectile/energy/bolt
|
||||
select_name = "bolt"
|
||||
e_cost = 5000
|
||||
fire_sound = 'sound/weapons/Genhit.ogg'
|
||||
|
||||
/obj/item/ammo_casing/energy/bolt/large
|
||||
projectile_type = /obj/item/projectile/energy/bolt/large
|
||||
select_name = "heavy bolt"
|
||||
|
||||
/obj/item/ammo_casing/energy/dart
|
||||
projectile_type = /obj/item/projectile/energy/dart
|
||||
fire_sound = 'sound/weapons/Genhit.ogg'
|
||||
e_cost = 5000
|
||||
select_name = "toxic dart"
|
||||
|
||||
/obj/item/ammo_casing/energy/instakill
|
||||
projectile_type = /obj/item/projectile/beam/instakill
|
||||
e_cost = 0
|
||||
select_name = "DESTROY"
|
||||
|
||||
/obj/item/ammo_casing/energy/instakill/blue
|
||||
projectile_type = /obj/item/projectile/beam/instakill/blue
|
||||
|
||||
/obj/item/ammo_casing/energy/instakill/red
|
||||
projectile_type = /obj/item/projectile/beam/instakill/red
|
||||
|
||||
/obj/item/ammo_casing/energy/plasma
|
||||
projectile_type = /obj/item/projectile/plasma
|
||||
select_name = "plasma burst"
|
||||
fire_sound = 'sound/weapons/pulse.ogg'
|
||||
|
||||
/obj/item/ammo_casing/energy/plasma/adv
|
||||
projectile_type = /obj/item/projectile/plasma/adv
|
||||
|
||||
/obj/item/ammo_casing/energy/shock_revolver
|
||||
fire_sound = 'sound/magic/lightningbolt.ogg'
|
||||
e_cost = 2000
|
||||
select_name = "lightning beam"
|
||||
projectile_type = /obj/item/projectile/energy/shock_revolver
|
||||
|
||||
/obj/item/ammo_casing/energy/toxplasma
|
||||
projectile_type = /obj/item/projectile/energy/toxplasma
|
||||
fire_sound = "sound/weapons/taser2.ogg"
|
||||
select_name = "plasma dart"
|
||||
|
||||
/obj/item/ammo_casing/energy/clown
|
||||
projectile_type = /obj/item/projectile/clown
|
||||
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
|
||||
select_name = "clown"
|
||||
|
||||
/obj/item/ammo_casing/energy/sniper
|
||||
projectile_type = /obj/item/projectile/beam/sniper
|
||||
fire_sound = 'sound/weapons/marauder.ogg'
|
||||
delay = 50
|
||||
select_name = "snipe"
|
||||
|
||||
/obj/item/ammo_casing/energy/teleport
|
||||
projectile_type = /obj/item/projectile/energy/teleport
|
||||
fire_sound = 'sound/weapons/wave.ogg'
|
||||
e_cost = 1250
|
||||
select_name = "teleport beam"
|
||||
var/teleport_target
|
||||
|
||||
/obj/item/ammo_casing/energy/teleport/newshot()
|
||||
..()
|
||||
var/obj/item/projectile/energy/teleport/T = BB
|
||||
T.teleport_target = teleport_target
|
||||
@@ -1,113 +1,169 @@
|
||||
////////////////INTERNAL MAGAZINES//////////////////////
|
||||
/obj/item/ammo_box/magazine/internal
|
||||
desc = "Oh god, this shouldn't be here"
|
||||
|
||||
//internals magazines are accessible, so replace spent ammo if full when trying to put a live one in
|
||||
/obj/item/ammo_box/magazine/internal/give_round(obj/item/ammo_casing/R)
|
||||
return ..(R,1)
|
||||
|
||||
// Revolver internal mags
|
||||
/obj/item/ammo_box/magazine/internal/cylinder
|
||||
name = "revolver cylinder"
|
||||
desc = "Oh god, this shouldn't be here"
|
||||
ammo_type = "/obj/item/ammo_casing/a357"
|
||||
ammo_type = /obj/item/ammo_casing/a357
|
||||
caliber = "357"
|
||||
max_ammo = 7
|
||||
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/ammo_count(var/countempties = 1)
|
||||
if (!countempties)
|
||||
var/boolets = 0
|
||||
for (var/i = 1, i <= stored_ammo.len, i++)
|
||||
var/obj/item/ammo_casing/bullet = stored_ammo[i]
|
||||
if (bullet.BB)
|
||||
boolets++
|
||||
return boolets
|
||||
else
|
||||
return stored_ammo.len
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/ammo_count(countempties = 1)
|
||||
var/boolets = 0
|
||||
for(var/obj/item/ammo_casing/bullet in stored_ammo)
|
||||
if(bullet && (bullet.BB || countempties))
|
||||
boolets++
|
||||
return boolets
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/rus357
|
||||
name = "russian revolver cylinder"
|
||||
desc = "Oh god, this shouldn't be here"
|
||||
ammo_type = "/obj/item/ammo_casing/a357"
|
||||
caliber = "357"
|
||||
max_ammo = 6
|
||||
multiload = 0
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/get_round(keep = 0)
|
||||
rotate()
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/rus357/New()
|
||||
stored_ammo += new ammo_type(src)
|
||||
var/b = stored_ammo[1]
|
||||
if(!keep)
|
||||
stored_ammo[1] = null
|
||||
|
||||
return b
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/proc/rotate()
|
||||
var/b = stored_ammo[1]
|
||||
stored_ammo.Cut(1,2)
|
||||
stored_ammo.Insert(0, b)
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/proc/spin()
|
||||
for(var/i in 1 to rand(0, max_ammo*2))
|
||||
rotate()
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/give_round(obj/item/ammo_casing/R, replace_spent = 0)
|
||||
if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
|
||||
return 0
|
||||
|
||||
for(var/i in 1 to stored_ammo.len)
|
||||
var/obj/item/ammo_casing/bullet = stored_ammo[i]
|
||||
if(!bullet || !bullet.BB) // found a spent ammo
|
||||
stored_ammo[i] = R
|
||||
R.loc = src
|
||||
|
||||
if(bullet)
|
||||
bullet.loc = get_turf(loc)
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/rev38
|
||||
name = "d-tiv revolver cylinder"
|
||||
desc = "Oh god, this shouldn't be here"
|
||||
ammo_type = "/obj/item/ammo_casing/c38"
|
||||
name = "detective revolver cylinder"
|
||||
ammo_type = /obj/item/ammo_casing/c38
|
||||
caliber = "38"
|
||||
max_ammo = 6
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/rev762
|
||||
name = "nagant revolver cylinder"
|
||||
ammo_type = /obj/item/ammo_casing/n762
|
||||
caliber = "n762"
|
||||
max_ammo = 7
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/cap
|
||||
name = "cap gun revolver cylinder"
|
||||
desc = "Oh god, this shouldn't be here"
|
||||
ammo_type = "/obj/item/ammo_casing/cap"
|
||||
ammo_type = /obj/item/ammo_casing/cap
|
||||
caliber = "cap"
|
||||
max_ammo = 7
|
||||
|
||||
// Shotgun internal mags
|
||||
/obj/item/ammo_box/magazine/internal/shot
|
||||
name = "shotgun internal magazine"
|
||||
desc = "Oh god, this shouldn't be here"
|
||||
ammo_type = "/obj/item/ammo_casing/shotgun/beanbag"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/beanbag
|
||||
caliber = "shotgun"
|
||||
max_ammo = 4
|
||||
multiload = 0
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/shotcom
|
||||
/obj/item/ammo_box/magazine/internal/shot/ammo_count(countempties = 1)
|
||||
if (!countempties)
|
||||
var/boolets = 0
|
||||
for(var/obj/item/ammo_casing/bullet in stored_ammo)
|
||||
if(bullet.BB)
|
||||
boolets++
|
||||
return boolets
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/shot/tube
|
||||
name = "dual feed shotgun internal tube"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
|
||||
max_ammo = 4
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/shot/lethal
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/buckshot
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/shot/com
|
||||
name = "combat shotgun internal magazine"
|
||||
desc = "Oh god, this shouldn't be here"
|
||||
ammo_type = "/obj/item/ammo_casing/shotgun/buckshot"
|
||||
caliber = "shotgun"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/buckshot
|
||||
max_ammo = 6
|
||||
multiload = 0
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/dualshot
|
||||
/obj/item/ammo_box/magazine/internal/shot/dual
|
||||
name = "double-barrel shotgun internal magazine"
|
||||
desc = "This doesn't even exist"
|
||||
ammo_type = "/obj/item/ammo_casing/shotgun/beanbag"
|
||||
caliber = "shotgun"
|
||||
max_ammo = 2
|
||||
multiload = 0
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/improvised
|
||||
/obj/item/ammo_box/magazine/internal/shot/improvised
|
||||
name = "improvised shotgun internal magazine"
|
||||
desc = "This doesn't even exist"
|
||||
ammo_type = "/obj/item/ammo_casing/shotgun/improvised"
|
||||
caliber = "shotgun"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/improvised
|
||||
max_ammo = 1
|
||||
multiload = 0
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/shotriot
|
||||
/obj/item/ammo_box/magazine/internal/shot/riot
|
||||
name = "riot shotgun internal magazine"
|
||||
desc = "Oh god, this shouldn't be here"
|
||||
ammo_type = "/obj/item/ammo_casing/shotgun/rubbershot"
|
||||
caliber = "shotgun"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
|
||||
max_ammo = 6
|
||||
multiload = 0
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/grenadelauncher
|
||||
/obj/item/ammo_box/magazine/internal/grenadelauncher
|
||||
name = "grenade launcher internal magazine"
|
||||
ammo_type = "/obj/item/ammo_casing/a40mm"
|
||||
ammo_type = /obj/item/ammo_casing/a40mm
|
||||
caliber = "40mm"
|
||||
max_ammo = 1
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/grenadelauncher/multi
|
||||
ammo_type = "/obj/item/ammo_casing/a40mm"
|
||||
ammo_type = /obj/item/ammo_casing/a40mm
|
||||
max_ammo = 6
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/speargun
|
||||
name = "speargun internal magazine"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/magspear
|
||||
caliber = "speargun"
|
||||
max_ammo = 1
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/rus357
|
||||
name = "russian revolver cylinder"
|
||||
ammo_type = /obj/item/ammo_casing/a357
|
||||
caliber = "357"
|
||||
max_ammo = 6
|
||||
multiload = 0
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/rus357/New()
|
||||
stored_ammo += new ammo_type(src)
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/boltaction
|
||||
name = "bolt action rifle internal magazine"
|
||||
desc = "Oh god, this shouldn't be here"
|
||||
ammo_type = "/obj/item/ammo_casing/a762"
|
||||
ammo_type = /obj/item/ammo_casing/a762
|
||||
caliber = "a762"
|
||||
max_ammo = 5
|
||||
multiload = 1
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/boltaction/enchanted
|
||||
max_ammo =1
|
||||
ammo_type = /obj/item/ammo_casing/a762/enchanted
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/shot/toy
|
||||
ammo_type = "/obj/item/ammo_casing/caseless/foam_dart"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/foam_dart
|
||||
caliber = "foam_force"
|
||||
max_ammo = 4
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/shot/toy/crossbow
|
||||
max_ammo = 5
|
||||
max_ammo = 5
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/shot/toy/tommygun
|
||||
max_ammo = 10
|
||||
@@ -116,17 +172,18 @@
|
||||
|
||||
/obj/item/ammo_box/magazine/m10mm
|
||||
name = "pistol magazine (10mm)"
|
||||
desc = "A gun magazine."
|
||||
icon_state = "9x19p"
|
||||
origin_tech = "combat=2"
|
||||
ammo_type = "/obj/item/ammo_casing/c10mm"
|
||||
ammo_type = /obj/item/ammo_casing/c10mm
|
||||
caliber = "10mm"
|
||||
max_ammo = 8
|
||||
multiple_sprites = 2
|
||||
|
||||
/obj/item/ammo_box/magazine/m45
|
||||
name = "handgun magazine (.45)"
|
||||
icon_state = "45"
|
||||
ammo_type = "/obj/item/ammo_casing/c45"
|
||||
icon_state = "45-8"
|
||||
ammo_type = /obj/item/ammo_casing/c45
|
||||
caliber = ".45"
|
||||
max_ammo = 8
|
||||
|
||||
@@ -137,7 +194,7 @@
|
||||
/obj/item/ammo_box/magazine/wt550m9
|
||||
name = "wt550 magazine (4.6x30mm)"
|
||||
icon_state = "46x30mmt-20"
|
||||
ammo_type = "/obj/item/ammo_casing/c46x30mm"
|
||||
ammo_type = /obj/item/ammo_casing/c46x30mm
|
||||
caliber = "4.6x30mm"
|
||||
max_ammo = 20
|
||||
|
||||
@@ -147,20 +204,20 @@
|
||||
|
||||
/obj/item/ammo_box/magazine/wt550m9/wtap
|
||||
name = "wt550 magazine (Armour Piercing 4.6x30mm)"
|
||||
ammo_type = "/obj/item/ammo_casing/c46x30mmap"
|
||||
ammo_type = /obj/item/ammo_casing/c46x30mmap
|
||||
|
||||
/obj/item/ammo_box/magazine/wt550m9/wttx
|
||||
name = "wt550 magazine (Toxin Tipped 4.6x30mm)"
|
||||
ammo_type = "/obj/item/ammo_casing/c46x30mmtox"
|
||||
ammo_type = /obj/item/ammo_casing/c46x30mmtox
|
||||
|
||||
/obj/item/ammo_box/magazine/wt550m9/wtic
|
||||
name = "wt550 magazine (Incindiary 4.6x30mm)"
|
||||
ammo_type = "/obj/item/ammo_casing/c46x30mminc"
|
||||
ammo_type = /obj/item/ammo_casing/c46x30mminc
|
||||
|
||||
/obj/item/ammo_box/magazine/uzim9mm
|
||||
name = "uzi magazine (9mm)"
|
||||
icon_state = "uzi9mm-32"
|
||||
ammo_type = "/obj/item/ammo_casing/c9mm"
|
||||
ammo_type = /obj/item/ammo_casing/c9mm
|
||||
caliber = "9mm"
|
||||
max_ammo = 32
|
||||
|
||||
@@ -171,35 +228,46 @@
|
||||
/obj/item/ammo_box/magazine/smgm9mm
|
||||
name = "SMG magazine (9mm)"
|
||||
icon_state = "smg9mm"
|
||||
ammo_type = "/obj/item/ammo_casing/c9mm"
|
||||
ammo_type = /obj/item/ammo_casing/c9mm
|
||||
caliber = "9mm"
|
||||
max_ammo = 30
|
||||
max_ammo = 21
|
||||
materials = list(MAT_METAL = 2000)
|
||||
|
||||
/obj/item/ammo_box/magazine/smgm9mm/ap
|
||||
name = "SMG magazine (Armour Piercing 9mm)"
|
||||
ammo_type = "/obj/item/ammo_casing/c9mmap"
|
||||
ammo_type = /obj/item/ammo_casing/c9mmap
|
||||
materials = list(MAT_METAL = 3000)
|
||||
|
||||
/obj/item/ammo_box/magazine/smgm9mm/toxin
|
||||
name = "SMG magazine (Toxin Tipped 9mm)"
|
||||
ammo_type = "/obj/item/ammo_casing/c9mmtox"
|
||||
ammo_type = /obj/item/ammo_casing/c9mmtox
|
||||
materials = list(MAT_METAL = 3000)
|
||||
|
||||
/obj/item/ammo_box/magazine/smgm9mm/fire
|
||||
name = "SMG Magazine (Incendiary 9mm)"
|
||||
ammo_type = "/obj/item/ammo_casing/c9mminc"
|
||||
ammo_type = /obj/item/ammo_casing/c9mminc
|
||||
materials = list(MAT_METAL = 3000)
|
||||
|
||||
/obj/item/ammo_box/magazine/smgm9mm/update_icon()
|
||||
..()
|
||||
icon_state = "[initial(icon_state)]-[round(ammo_count(),6)]"
|
||||
|
||||
/obj/item/ammo_box/magazine/pistolm9mm
|
||||
name = "pistol magazine (9mm)"
|
||||
icon_state = "9x19p-8"
|
||||
ammo_type = /obj/item/ammo_casing/c9mm
|
||||
caliber = "9mm"
|
||||
max_ammo = 15
|
||||
|
||||
/obj/item/ammo_box/magazine/pistolm9mm/update_icon()
|
||||
..()
|
||||
icon_state = "9x19p-[ammo_count() ? "8" : "0"]"
|
||||
|
||||
/obj/item/ammo_box/magazine/smgm45
|
||||
name = "SMG magazine (.45)"
|
||||
icon_state = "c20r45"
|
||||
origin_tech = "combat=2"
|
||||
ammo_type = "/obj/item/ammo_casing/c45"
|
||||
ammo_type = /obj/item/ammo_casing/c45
|
||||
caliber = ".45"
|
||||
max_ammo = 20
|
||||
|
||||
@@ -210,7 +278,7 @@
|
||||
/obj/item/ammo_box/magazine/tommygunm45
|
||||
name = "drum magazine (.45)"
|
||||
icon_state = "drum45"
|
||||
ammo_type = "/obj/item/ammo_casing/c45"
|
||||
ammo_type = /obj/item/ammo_casing/c45
|
||||
caliber = ".45"
|
||||
max_ammo = 50
|
||||
|
||||
@@ -218,7 +286,7 @@
|
||||
name = "handgun magazine (.50ae)"
|
||||
icon_state = "50ae"
|
||||
origin_tech = "combat=2"
|
||||
ammo_type = "/obj/item/ammo_casing/a50"
|
||||
ammo_type = /obj/item/ammo_casing/a50
|
||||
caliber = ".50"
|
||||
max_ammo = 7
|
||||
multiple_sprites = 1
|
||||
@@ -226,7 +294,7 @@
|
||||
/obj/item/ammo_box/magazine/m75
|
||||
name = "specialized magazine (.75)"
|
||||
icon_state = "75"
|
||||
ammo_type = "/obj/item/ammo_casing/caseless/a75"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/a75
|
||||
caliber = "75"
|
||||
multiple_sprites = 2
|
||||
max_ammo = 8
|
||||
@@ -235,50 +303,16 @@
|
||||
name = "toploader magazine (5.56mm)"
|
||||
icon_state = "5.56m"
|
||||
origin_tech = "combat=5;syndicate=1"
|
||||
ammo_type = "/obj/item/ammo_casing/a556"
|
||||
ammo_type = /obj/item/ammo_casing/a556
|
||||
caliber = "a556"
|
||||
max_ammo = 30
|
||||
multiple_sprites = 2
|
||||
|
||||
/obj/item/ammo_box/magazine/m762
|
||||
name = "box magazine (7.62mm)"
|
||||
icon_state = "a762"
|
||||
origin_tech = "combat=2"
|
||||
ammo_type = "/obj/item/ammo_casing/a762"
|
||||
caliber = "a762"
|
||||
max_ammo = 50
|
||||
|
||||
/obj/item/ammo_box/magazine/m762/update_icon()
|
||||
..()
|
||||
icon_state = "[initial(icon_state)]-[round(ammo_count(),10)]"
|
||||
|
||||
/obj/item/ammo_box/magazine/m762/buckshot
|
||||
name = "box magazine (buckshot)"
|
||||
icon_state = "b762"
|
||||
caliber = "shotgun"
|
||||
ammo_type ="/obj/item/ammo_casing/shotgun/buckshot"
|
||||
max_ammo = 300 // Bluespace!
|
||||
|
||||
/obj/item/ammo_box/magazine/m762/buckshot/update_icon()
|
||||
..()
|
||||
icon_state = "[initial(icon_state)]-[round(ammo_count(),60)]"
|
||||
|
||||
/obj/item/ammo_box/magazine/m762/he // I am not a good person.
|
||||
name = "box magazine (40mm high explosive)"
|
||||
icon_state = "g762"
|
||||
caliber = "40mm"
|
||||
ammo_type ="/obj/item/ammo_casing/a40mm"
|
||||
max_ammo = 25
|
||||
|
||||
/obj/item/ammo_box/magazine/m762/he/update_icon()
|
||||
..()
|
||||
icon_state = "[initial(icon_state)]-[round(ammo_count(),5)]"
|
||||
|
||||
|
||||
/obj/item/ammo_box/magazine/m12g
|
||||
name = "shotgun magazine (12g slugs)"
|
||||
desc = "A drum magazine."
|
||||
icon_state = "m12gb"
|
||||
ammo_type = "/obj/item/ammo_casing/shotgun"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun
|
||||
origin_tech = "combat=3;syndicate=1"
|
||||
caliber = "shotgun"
|
||||
max_ammo = 8
|
||||
@@ -290,36 +324,45 @@
|
||||
/obj/item/ammo_box/magazine/m12g/buckshot
|
||||
name = "shotgun magazine (12g buckshot slugs)"
|
||||
icon_state = "m12gb"
|
||||
ammo_type = "/obj/item/ammo_casing/shotgun/buckshot"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/buckshot
|
||||
|
||||
/obj/item/ammo_box/magazine/m12g/stun
|
||||
name = "shotgun magazine (12g taser slugs)"
|
||||
icon_state = "m12gs"
|
||||
ammo_type = "/obj/item/ammo_casing/shotgun/stunslug"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/stunslug
|
||||
|
||||
|
||||
/obj/item/ammo_box/magazine/m12g/dragon
|
||||
name = "shotgun magazine (12g dragon's breath)"
|
||||
icon_state = "m12gf"
|
||||
ammo_type = "/obj/item/ammo_casing/shotgun/incendiary/dragonsbreath"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
|
||||
|
||||
/obj/item/ammo_box/magazine/m12g/bioterror
|
||||
name = "shotgun magazine (12g bioterror)"
|
||||
icon_state = "m12gt"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror
|
||||
|
||||
/obj/item/ammo_box/magazine/m12g/breach
|
||||
name = "shotgun magazine (12g breacher slugs)"
|
||||
icon_state = "m12gbc"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/breaching
|
||||
|
||||
//FOAM DARTS
|
||||
/obj/item/ammo_box/magazine/toy
|
||||
name = "foam force META magazine"
|
||||
ammo_type = "/obj/item/ammo_casing/caseless/foam_dart"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/foam_dart
|
||||
caliber = "foam_force"
|
||||
|
||||
/obj/item/ammo_box/magazine/toy/smg
|
||||
name = "foam force SMG magazine"
|
||||
icon_state = "smg9mm-30"
|
||||
max_ammo = 30
|
||||
max_ammo = 20
|
||||
|
||||
/obj/item/ammo_box/magazine/toy/smg/update_icon()
|
||||
..()
|
||||
icon_state = "smg9mm-[round(ammo_count(),6)]"
|
||||
icon_state = "smg9mm-[round(ammo_count(),5)]"
|
||||
|
||||
/obj/item/ammo_box/magazine/toy/smg/riot
|
||||
ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
|
||||
|
||||
/obj/item/ammo_box/magazine/toy/pistol
|
||||
name = "foam force pistol magazine"
|
||||
@@ -328,11 +371,11 @@
|
||||
multiple_sprites = 2
|
||||
|
||||
/obj/item/ammo_box/magazine/toy/pistol/riot
|
||||
ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
|
||||
|
||||
/obj/item/ammo_box/magazine/toy/smgm45
|
||||
name = "donksoft SMG magazine"
|
||||
ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
|
||||
max_ammo = 20
|
||||
|
||||
/obj/item/ammo_box/magazine/toy/smgm45/update_icon()
|
||||
@@ -341,7 +384,7 @@
|
||||
|
||||
/obj/item/ammo_box/magazine/toy/m762
|
||||
name = "donksoft box magazine"
|
||||
ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
|
||||
max_ammo = 50
|
||||
|
||||
/obj/item/ammo_box/magazine/toy/m762/update_icon()
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
/obj/item/ammo_casing/magic
|
||||
name = "magic casing"
|
||||
desc = "I didn't even know magic needed ammo..."
|
||||
projectile_type = /obj/item/projectile/magic
|
||||
|
||||
/obj/item/ammo_casing/magic/change
|
||||
projectile_type = /obj/item/projectile/magic/change
|
||||
|
||||
/obj/item/ammo_casing/magic/animate
|
||||
projectile_type = /obj/item/projectile/magic/animate
|
||||
|
||||
/obj/item/ammo_casing/magic/heal
|
||||
projectile_type = /obj/item/projectile/magic/resurrection
|
||||
|
||||
/obj/item/ammo_casing/magic/death
|
||||
projectile_type = /obj/item/projectile/magic/death
|
||||
|
||||
/obj/item/ammo_casing/magic/teleport
|
||||
projectile_type = /obj/item/projectile/magic/teleport
|
||||
|
||||
/obj/item/ammo_casing/magic/door
|
||||
projectile_type = /obj/item/projectile/magic/door
|
||||
|
||||
/obj/item/ammo_casing/magic/fireball
|
||||
projectile_type = /obj/item/projectile/magic/fireball
|
||||
|
||||
/obj/item/ammo_casing/magic/chaos
|
||||
projectile_type = /obj/item/projectile/magic
|
||||
|
||||
/obj/item/ammo_casing/magic/chaos/newshot()
|
||||
projectile_type = pick(typesof(/obj/item/projectile/magic))
|
||||
..()
|
||||
|
||||
/obj/item/ammo_casing/magic/honk
|
||||
projectile_type = /obj/item/projectile/bullet/honker
|
||||
|
||||
/obj/item/ammo_casing/forcebolt
|
||||
projectile_type = /obj/item/projectile/forcebolt
|
||||
|
||||
/obj/item/ammo_casing/syringegun
|
||||
name = "syringe gun spring"
|
||||
desc = "A high-power spring that throws syringes."
|
||||
projectile_type = null
|
||||
|
||||
/obj/item/ammo_casing/energy/c3dbullet
|
||||
projectile_type = /obj/item/projectile/bullet/midbullet3
|
||||
select_name = "spraydown"
|
||||
fire_sound = 'sound/weapons/gunshot_smg.ogg'
|
||||
e_cost = 200
|
||||
@@ -0,0 +1,95 @@
|
||||
/obj/item/ammo_casing/proc/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, distro, quiet, zone_override = "", spread)
|
||||
distro += variance
|
||||
for (var/i = max(1, pellets), i > 0, i--)
|
||||
var/targloc = get_turf(target)
|
||||
ready_proj(target, user, quiet, zone_override)
|
||||
if(distro) //We have to spread a pixel-precision bullet. throw_proj was called before so angles should exist by now...
|
||||
if(randomspread)
|
||||
spread = round((rand() - 0.5) * distro)
|
||||
else //Smart spread
|
||||
spread = round((i / pellets - 0.5) * distro)
|
||||
if(!throw_proj(target, targloc, user, params, spread))
|
||||
return 0
|
||||
if(i > 1)
|
||||
newshot()
|
||||
if(click_cooldown_override)
|
||||
user.changeNext_move(click_cooldown_override)
|
||||
else
|
||||
user.changeNext_move(CLICK_CD_RANGE)
|
||||
user.newtonian_move(get_dir(target, user))
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
/obj/item/ammo_casing/proc/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
|
||||
if (!BB)
|
||||
return
|
||||
BB.original = target
|
||||
BB.firer = user
|
||||
if (zone_override)
|
||||
BB.def_zone = zone_override
|
||||
else
|
||||
BB.def_zone = user.zone_sel.selecting
|
||||
BB.suppressed = quiet
|
||||
|
||||
if(reagents && BB.reagents)
|
||||
reagents.trans_to(BB, reagents.total_volume) //For chemical darts/bullets
|
||||
qdel(reagents)
|
||||
|
||||
/obj/item/ammo_casing/proc/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread)
|
||||
var/turf/curloc = get_turf(user)
|
||||
if (!istype(targloc) || !istype(curloc) || !BB)
|
||||
return 0
|
||||
BB.ammo_casing = src
|
||||
if(targloc == curloc)
|
||||
if(target) //if the target is right on our location we go straight to bullet_act()
|
||||
target.bullet_act(BB, BB.def_zone)
|
||||
qdel(BB)
|
||||
BB = null
|
||||
return 1
|
||||
|
||||
BB.preparePixelProjectile(target, targloc, user, params, spread)
|
||||
if(BB)
|
||||
BB.fire()
|
||||
BB = null
|
||||
return 1
|
||||
|
||||
/obj/item/ammo_casing/proc/spread(turf/target, turf/current, distro)
|
||||
var/dx = abs(target.x - current.x)
|
||||
var/dy = abs(target.y - current.y)
|
||||
return locate(target.x + round(gaussian(0, distro) * (dy+2)/8, 1), target.y + round(gaussian(0, distro) * (dx+2)/8, 1), target.z)
|
||||
|
||||
/obj/item/projectile/proc/preparePixelProjectile(atom/target, var/turf/targloc, mob/living/user, params, spread)
|
||||
var/turf/curloc = get_turf(user)
|
||||
loc = get_turf(user)
|
||||
starting = get_turf(user)
|
||||
current = curloc
|
||||
yo = targloc.y - curloc.y
|
||||
xo = targloc.x - curloc.x
|
||||
|
||||
if(params)
|
||||
var/list/mouse_control = params2list(params)
|
||||
if(mouse_control["icon-x"])
|
||||
p_x = text2num(mouse_control["icon-x"])
|
||||
if(mouse_control["icon-y"])
|
||||
p_y = text2num(mouse_control["icon-y"])
|
||||
if(mouse_control["screen-loc"])
|
||||
//Split screen-loc up into X+Pixel_X and Y+Pixel_Y
|
||||
var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",")
|
||||
|
||||
//Split X+Pixel_X up into list(X, Pixel_X)
|
||||
var/list/screen_loc_X = splittext(screen_loc_params[1],":")
|
||||
|
||||
//Split Y+Pixel_Y up into list(Y, Pixel_Y)
|
||||
var/list/screen_loc_Y = splittext(screen_loc_params[2],":")
|
||||
var/x = text2num(screen_loc_X[1]) * world.icon_size + text2num(screen_loc_X[2]) - world.icon_size + (user.client ? user.client.pixel_x : 0)
|
||||
var/y = text2num(screen_loc_Y[1]) * world.icon_size + text2num(screen_loc_Y[2]) - world.icon_size + (user.client ? user.client.pixel_y : 0)
|
||||
|
||||
//Calculate the "resolution" of screen based on client's view and world's icon size. This will work if the user can view more tiles than average.
|
||||
var/screenview = (user.client.view * 2 + 1) * world.icon_size //Refer to http://www.byond.com/docs/ref/info.html#/client/var/view for mad maths
|
||||
|
||||
var/ox = round(screenview/2) //"origin" x
|
||||
var/oy = round(screenview/2) //"origin" y
|
||||
var/angle = Atan2(y - oy, x - ox)
|
||||
Angle = angle
|
||||
if(spread)
|
||||
Angle += spread
|
||||
+268
-302
@@ -1,54 +1,59 @@
|
||||
#define SAWN_INTACT 0
|
||||
#define SAWN_OFF 1
|
||||
#define SAWN_SAWING -1
|
||||
|
||||
/obj/item/weapon/gun
|
||||
name = "gun"
|
||||
desc = "Its a gun. It's pretty terrible, though."
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
desc = "It's a gun. It's pretty terrible, though."
|
||||
icon = 'icons/obj/guns/projectile.dmi'
|
||||
icon_state = "detective"
|
||||
item_state = "gun"
|
||||
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
materials = list(MAT_METAL=2000)
|
||||
w_class = 3.0
|
||||
w_class = 3
|
||||
throwforce = 5
|
||||
throw_speed = 4
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
force = 5.0
|
||||
force = 5
|
||||
origin_tech = "combat=1"
|
||||
needs_permit = 1
|
||||
attack_verb = list("struck", "hit", "bashed")
|
||||
|
||||
var/fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
var/obj/item/projectile/in_chamber = null
|
||||
var/silenced = 0
|
||||
var/ghettomodded = 0
|
||||
var/recoil = 0
|
||||
var/fire_sound = "gunshot"
|
||||
var/fire_sound_text = "gunshot" //the fire sound that shows in chat messages: laser blast, gunshot, etc.
|
||||
var/suppressed = 0 //whether or not a message is displayed when fired
|
||||
var/can_suppress = 0
|
||||
var/can_unsuppress = 1
|
||||
var/recoil = 0 //boom boom shake the room
|
||||
var/clumsy_check = 1
|
||||
var/sawn_desc = null
|
||||
var/obj/item/ammo_casing/chambered = null
|
||||
var/trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers
|
||||
var/sawn_desc = null //description change if weapon is sawn-off
|
||||
var/sawn_state = SAWN_INTACT
|
||||
var/obj/item/ammo_casing/chambered = null // The round (not bullet) that is in the chamber. THIS MISPLACED ITEM BROUGHT TO YOU BY HACKY BUCKSHOT.
|
||||
var/tmp/list/mob/living/target //List of who yer targeting.
|
||||
var/tmp/lock_time = -100
|
||||
var/tmp/mouthshoot = 0 ///To stop people from suiciding twice... >.>
|
||||
var/automatic = 0 //Used to determine if you can target multiple people.
|
||||
var/tmp/mob/living/last_moved_mob //Used to fire faster at more than one person.
|
||||
var/tmp/told_cant_shoot = 0 //So that it doesn't spam them with the fact they cannot hit them.
|
||||
var/firerate = 1 // 0 for one bullet after tarrget moves and aim is lowered,
|
||||
//1 for keep shooting until aim is lowered
|
||||
var/fire_delay = 0
|
||||
var/last_fired = 0
|
||||
var/burst_size = 1 //how large a burst is
|
||||
var/fire_delay = 0 //rate of fire for burst firing and semi auto
|
||||
var/firing_burst = 0 //Prevent the weapon from firing again while already firing
|
||||
var/semicd = 0 //cooldown handler
|
||||
var/weapon_weight = WEAPON_LIGHT
|
||||
var/list/restricted_species
|
||||
|
||||
var/spread = 0
|
||||
var/randomspread = 1
|
||||
|
||||
var/unique_rename = 0 //allows renaming with a pen
|
||||
var/unique_reskin = 0 //allows one-time reskinning
|
||||
var/current_skin = null //the skin choice if we had a reskin
|
||||
var/list/options = list()
|
||||
|
||||
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
|
||||
|
||||
var/obj/item/device/flashlight/F = null
|
||||
var/can_flashlight = 0
|
||||
var/heavy_weapon = 0
|
||||
var/randomspread = 0
|
||||
|
||||
var/burst_size = 1
|
||||
var/list/upgrades = list()
|
||||
|
||||
var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite
|
||||
var/ammo_y_offset = 0
|
||||
var/flight_x_offset = 0
|
||||
var/flight_y_offset = 0
|
||||
|
||||
//Zooming
|
||||
var/zoomable = FALSE //whether the gun generates a Zoom action on creation
|
||||
@@ -56,312 +61,200 @@
|
||||
var/zoom_amt = 3 //Distance in TURFs to move the user's screen forward (the "zoom" effect)
|
||||
var/datum/action/toggle_scope_zoom/azoom
|
||||
|
||||
proc/ready_to_fire()
|
||||
if(world.time >= last_fired + fire_delay)
|
||||
last_fired = world.time
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
proc/process_chambered()
|
||||
return 0
|
||||
|
||||
|
||||
proc/special_check(var/mob/M) //Placeholder for any special checks, like detective's revolver.
|
||||
if(!M.IsAdvancedToolUser())
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
proc/shoot_with_empty_chamber(mob/living/user as mob|obj)
|
||||
to_chat(user, "<span class='warning'>*click*</span>")
|
||||
playsound(user, 'sound/weapons/emptyclick.ogg', 40, 1)
|
||||
return
|
||||
|
||||
emp_act(severity)
|
||||
for(var/obj/O in contents)
|
||||
O.emp_act(severity)
|
||||
|
||||
proc/prepare_shot(var/obj/item/projectile/proj) //Transfer properties from the gun to the bullet
|
||||
proj.shot_from = src
|
||||
proj.silenced = silenced
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/New()
|
||||
..()
|
||||
if(F)
|
||||
verbs += /obj/item/weapon/gun/proc/toggle_gunlight
|
||||
build_zooming()
|
||||
|
||||
/obj/item/weapon/gun/examine(mob/user)
|
||||
..()
|
||||
if(unique_reskin && !current_skin)
|
||||
to_chat(user, "<span class='notice'>Alt-click it to reskin it.</span>")
|
||||
if(unique_rename)
|
||||
to_chat(user, "<span class='notice'>Use a pen on it to rename it.</span>")
|
||||
|
||||
/obj/item/weapon/gun/pickup(mob/user)
|
||||
/obj/item/weapon/gun/proc/process_chamber()
|
||||
return 0
|
||||
|
||||
if(azoom)
|
||||
azoom.Grant(user)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/dropped(mob/user)
|
||||
|
||||
zoom(user,FALSE)
|
||||
if(azoom)
|
||||
azoom.Remove(user)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params)
|
||||
if(flag) return //we're placing gun on a table or in backpack
|
||||
if(istype(target, /obj/machinery/recharger) && istype(src, /obj/item/weapon/gun/energy)) return//Shouldnt flag take care of this?
|
||||
Fire(A,user,params) //Otherwise, fire normally.
|
||||
|
||||
/obj/item/weapon/gun/proc/isHandgun()
|
||||
//check if there's enough ammo/energy/whatever to shoot one time
|
||||
//i.e if clicking would make it shoot
|
||||
/obj/item/weapon/gun/proc/can_shoot()
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/gun/proc/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0)//TODO: go over this
|
||||
/obj/item/weapon/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj)
|
||||
to_chat(user, "<span class='danger'>*click*</span>")
|
||||
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
|
||||
|
||||
/obj/item/weapon/gun/proc/shoot_live_shot(mob/living/user as mob|obj, pointblank = 0, mob/pbtarget = null, message = 1)
|
||||
if(recoil)
|
||||
shake_camera(user, recoil + 1, recoil)
|
||||
|
||||
if(suppressed)
|
||||
playsound(user, fire_sound, 10, 1)
|
||||
else
|
||||
playsound(user, fire_sound, 50, 1)
|
||||
if(!message)
|
||||
return
|
||||
if(pointblank)
|
||||
user.visible_message("<span class='danger'>[user] fires [src] point blank at [pbtarget]!</span>", "<span class='danger'>You fire [src] point blank at [pbtarget]!</span>", "<span class='italics'>You hear \a [fire_sound_text]!</span>")
|
||||
else
|
||||
user.visible_message("<span class='danger'>[user] fires [src]!</span>", "<span class='danger'>You fire [src]!</span>", "You hear \a [fire_sound_text]!")
|
||||
|
||||
if(weapon_weight >= WEAPON_MEDIUM)
|
||||
if(user.get_inactive_hand())
|
||||
if(prob(15))
|
||||
if(user.drop_item())
|
||||
user.visible_message("<span class='danger'>[src] flies out of [user]'s hands!</span>", "<span class='userdanger'>[src] kicks out of your grip!</span>")
|
||||
|
||||
/obj/item/weapon/gun/emp_act(severity)
|
||||
for(var/obj/O in contents)
|
||||
O.emp_act(severity)
|
||||
|
||||
/obj/item/weapon/gun/afterattack(atom/target, mob/living/user, flag, params)
|
||||
if(firing_burst)
|
||||
return
|
||||
if(flag) //It's adjacent, is the user, or is on the user's person
|
||||
if(target in user.contents) //can't shoot stuff inside us.
|
||||
return
|
||||
if(!ismob(target) || user.a_intent == "harm") //melee attack
|
||||
return
|
||||
if(target == user && user.zone_sel.selecting != "mouth") //so we can't shoot ourselves (unless mouth selected)
|
||||
return
|
||||
|
||||
if(istype(user))//Check if the user can use the gun, if the user isn't alive(turrets) assume it can.
|
||||
var/mob/living/L = user
|
||||
if(!can_trigger_gun(L))
|
||||
return
|
||||
|
||||
if(!can_shoot()) //Just because you can pull the trigger doesn't mean it can't shoot.
|
||||
shoot_with_empty_chamber(user)
|
||||
return
|
||||
|
||||
if(flag)
|
||||
if(user.zone_sel.selecting == "mouth")
|
||||
handle_suicide(user, target, params)
|
||||
return
|
||||
|
||||
|
||||
//Exclude lasertag guns from the CLUMSY check.
|
||||
if(clumsy_check)
|
||||
if(istype(user, /mob/living))
|
||||
var/mob/living/M = user
|
||||
if ((CLUMSY in M.mutations) && prob(50))
|
||||
to_chat(M, "<span class='danger'>[src] blows up in your face.</span>")
|
||||
M.take_organ_damage(0,20)
|
||||
M.drop_item()
|
||||
qdel(src)
|
||||
if(istype(user))
|
||||
if (user.disabilities & CLUMSY && prob(40))
|
||||
to_chat(user, "<span class='userdanger'>You shoot yourself in the foot with \the [src]!</span>")
|
||||
var/shot_leg = pick("l_foot", "r_foot")
|
||||
process_fire(user, user, 0, params, zone_override = shot_leg)
|
||||
user.drop_item()
|
||||
return
|
||||
|
||||
if (!user.IsAdvancedToolUser() || istype(user, /mob/living/simple_animal/diona))
|
||||
to_chat(user, "<span class='danger'>You don't have the dexterity to do this!</span>")
|
||||
if(weapon_weight == WEAPON_HEAVY && user.get_inactive_hand())
|
||||
to_chat(user, "<span class='userdanger'>You need both hands free to fire \the [src]!</span>")
|
||||
return
|
||||
if(istype(user, /mob/living))
|
||||
var/mob/living/M = user
|
||||
if (HULK in M.mutations)
|
||||
to_chat(M, "<span class='danger'>Your meaty finger is much too large for the trigger guard!</span>")
|
||||
return
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.species.flags & NOGUNS)
|
||||
to_chat(user, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
|
||||
return
|
||||
if(H.martial_art && H.martial_art.name == "The Sleeping Carp") //great dishonor to famiry
|
||||
to_chat(user, "<span class='danger'>Use of ranged weaponry would bring dishonor to the clan.</span>")
|
||||
return
|
||||
|
||||
process_fire(target,user,1,params)
|
||||
|
||||
/obj/item/weapon/gun/proc/can_trigger_gun(var/mob/living/user)
|
||||
if(!user.can_use_guns(src))
|
||||
return 0
|
||||
if(restricted_species && restricted_species.len && !(user.get_species() in restricted_species))
|
||||
to_chat(user, "<span class='danger'>[src] is incompatible with your biology!</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
obj/item/weapon/gun/proc/newshot()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override)
|
||||
add_fingerprint(user)
|
||||
|
||||
if(!special_check(user))
|
||||
if(semicd)
|
||||
return
|
||||
|
||||
if (!ready_to_fire())
|
||||
if (world.time % 3) //to prevent spam
|
||||
to_chat(user, "<span class='warning'>[src] is not ready to fire again!")
|
||||
return
|
||||
|
||||
if(heavy_weapon)
|
||||
if(weapon_weight)
|
||||
if(user.get_inactive_hand())
|
||||
recoil = 4 //one-handed kick
|
||||
else
|
||||
recoil = initial(recoil)
|
||||
|
||||
if (istype(in_chamber, /obj/item/projectile/bullet/blank)) // A hacky way of making blank shotgun shells work again. Honk.
|
||||
in_chamber.delete()
|
||||
in_chamber = null
|
||||
return
|
||||
|
||||
user.changeNext_move(CLICK_CD_RANGE)
|
||||
|
||||
var/spread = 0
|
||||
var/turf/targloc = get_turf(target)
|
||||
for(var/f = 1 to burst_size)
|
||||
if(!process_chambered()) //CHECK
|
||||
return click_empty(user)
|
||||
|
||||
if(chambered)
|
||||
for (var/i = max(1, chambered.pellets), i > 0, i--) //Previous way of doing it fucked up math for spreading. This way, even the first projectile is part of the spread code.
|
||||
if(i != max(1, chambered.pellets)) //Have we fired the initial chambered bullet yet?
|
||||
in_chamber = new chambered.projectile_type()
|
||||
ready_projectile(target, user)
|
||||
prepare_shot(in_chamber)
|
||||
if(chambered.deviation)
|
||||
if(randomspread) //Random spread
|
||||
spread = (rand() - 0.5) * chambered.deviation
|
||||
else //Smart spread
|
||||
spread = (i / chambered.pellets - 0.5) * chambered.deviation
|
||||
if(!process_projectile(targloc, user, params, spread))
|
||||
return 0
|
||||
else
|
||||
ready_projectile(target, user)
|
||||
prepare_shot(in_chamber)
|
||||
if(!process_projectile(targloc, user, params, spread))
|
||||
return 0
|
||||
|
||||
if(recoil)
|
||||
spawn()
|
||||
shake_camera(user, recoil + 1, recoil)
|
||||
|
||||
if(silenced)
|
||||
playsound(user, fire_sound, 10, 1)
|
||||
else
|
||||
playsound(user, fire_sound, 50, 1)
|
||||
if(f == 1) // Only print this once
|
||||
user.visible_message("<span class='warning'>[user] fires [src][reflex ? " by reflex":""]!</span>", \
|
||||
"<span class='warning'>You fire [src][reflex ? "by reflex":""]!</span>", \
|
||||
"You hear a [istype(in_chamber, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!")
|
||||
|
||||
if(heavy_weapon)
|
||||
if(user.get_inactive_hand())
|
||||
if(prob(15))
|
||||
user.visible_message("<span class='danger'>[src] flies out of [user]'s hands!</span>", "<span class='userdanger'>[src] kicks out of your grip!</span>")
|
||||
user.drop_item()
|
||||
if(burst_size > 1)
|
||||
firing_burst = 1
|
||||
for(var/i = 1 to burst_size)
|
||||
if(!user)
|
||||
break
|
||||
if(!issilicon(user))
|
||||
if( i>1 && !(src in get_both_hands(user))) //for burst firing
|
||||
break
|
||||
|
||||
user.newtonian_move(get_dir(target, user))
|
||||
if(chambered)
|
||||
var/sprd = 0
|
||||
if(randomspread)
|
||||
sprd = round((rand() - 0.5) * spread)
|
||||
else
|
||||
sprd = round((i / burst_size - 0.5) * spread)
|
||||
if(!chambered.fire(target, user, params, ,suppressed, zone_override, sprd))
|
||||
shoot_with_empty_chamber(user)
|
||||
break
|
||||
else
|
||||
if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot
|
||||
shoot_live_shot(user, 1, target, message)
|
||||
else
|
||||
shoot_live_shot(user, 0, target, message)
|
||||
else
|
||||
shoot_with_empty_chamber(user)
|
||||
break
|
||||
process_chamber()
|
||||
update_icon()
|
||||
sleep(fire_delay)
|
||||
firing_burst = 0
|
||||
else
|
||||
if(chambered)
|
||||
if(!chambered.fire(target, user, params, , suppressed, zone_override, spread))
|
||||
shoot_with_empty_chamber(user)
|
||||
return
|
||||
else
|
||||
if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot
|
||||
shoot_live_shot(user, 1, target, message)
|
||||
else
|
||||
shoot_live_shot(user, 0, target, message)
|
||||
else
|
||||
shoot_with_empty_chamber(user)
|
||||
return
|
||||
process_chamber()
|
||||
update_icon()
|
||||
semicd = 1
|
||||
spawn(fire_delay)
|
||||
semicd = 0
|
||||
|
||||
if(user)
|
||||
if(user.hand)
|
||||
user.update_inv_l_hand()
|
||||
else
|
||||
user.update_inv_r_hand()
|
||||
sleep(fire_delay)
|
||||
feedback_add_details("gun_fired","[type]")
|
||||
|
||||
/obj/item/weapon/gun/proc/ready_projectile(atom/target as mob|obj|turf, mob/living/user)
|
||||
in_chamber.firer = user
|
||||
in_chamber.def_zone = user.zone_sel.selecting
|
||||
in_chamber.original = target
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/proc/process_projectile(var/turf/targloc, mob/living/user as mob|obj, params, spread)
|
||||
var/turf/curloc = user.loc
|
||||
if (!istype(targloc) || !istype(curloc) || !in_chamber)
|
||||
return 0
|
||||
if(targloc == curloc) //Fire the projectile
|
||||
user.bullet_act(in_chamber)
|
||||
del(in_chamber)
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
in_chamber.loc = get_turf(user)
|
||||
in_chamber.starting = get_turf(user)
|
||||
in_chamber.current = curloc
|
||||
in_chamber.OnFired()
|
||||
in_chamber.yo = targloc.y - curloc.y
|
||||
in_chamber.xo = targloc.x - curloc.x
|
||||
if(params)
|
||||
var/list/mouse_control = params2list(params)
|
||||
if(mouse_control["icon-x"])
|
||||
in_chamber.p_x = text2num(mouse_control["icon-x"])
|
||||
if(mouse_control["icon-y"])
|
||||
in_chamber.p_y = text2num(mouse_control["icon-y"])
|
||||
if(mouse_control["screen-loc"])
|
||||
//Split screen-loc up into X+Pixel_X and Y+Pixel_Y
|
||||
var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",")
|
||||
|
||||
//Split X+Pixel_X up into list(X, Pixel_X)
|
||||
var/list/screen_loc_X = splittext(screen_loc_params[1],":")
|
||||
|
||||
//Split Y+Pixel_Y up into list(Y, Pixel_Y)
|
||||
var/list/screen_loc_Y = splittext(screen_loc_params[2],":")
|
||||
|
||||
var/x = text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32
|
||||
var/y = text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32
|
||||
var/ox = round(480/2) //"origin" x - Basically center of the screen. This is a bad way of doing it because if you are able to view MORE than 17 tiles at a time your aim will get fucked.
|
||||
var/oy = round(480/2) //"origin" y - Basically center of the screen.
|
||||
|
||||
var/angle = Atan2(y - oy, x - ox)
|
||||
|
||||
in_chamber.Angle = angle
|
||||
|
||||
if(istype(user, /mob/living/carbon)) //Increase spread based on shock
|
||||
var/mob/living/carbon/mob = user
|
||||
if(mob.shock_stage > 120)
|
||||
spread += rand(-5,5)
|
||||
else if(mob.shock_stage > 70)
|
||||
spread += rand(-2,2)
|
||||
|
||||
if(spread)
|
||||
in_chamber.Angle += spread
|
||||
if(in_chamber)
|
||||
in_chamber.process()
|
||||
in_chamber = null
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/gun/proc/can_fire()
|
||||
return process_chambered()
|
||||
|
||||
/obj/item/weapon/gun/proc/can_hit(var/mob/living/target as mob, var/mob/living/user as mob)
|
||||
return in_chamber.check_fire(target,user)
|
||||
|
||||
/obj/item/weapon/gun/proc/click_empty(mob/user = null)
|
||||
if (user)
|
||||
user.visible_message("*click click*", "\red <b>*click*</b>")
|
||||
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
|
||||
/obj/item/weapon/gun/attack(mob/M as mob, mob/user)
|
||||
if(user.a_intent == "harm") //Flogging
|
||||
..()
|
||||
else
|
||||
src.visible_message("*click click*")
|
||||
playsound(src.loc, 'sound/weapons/empty.ogg', 100, 1)
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/attack(mob/living/M as mob, mob/living/user as mob, def_zone)
|
||||
//Suicide handling.
|
||||
if (M == user && user.zone_sel.selecting == "mouth" && !mouthshoot)
|
||||
mouthshoot = 1
|
||||
M.visible_message("<span class='warning'> [user] sticks their gun in their mouth, ready to pull the trigger...</span>")
|
||||
if(!do_after(user, 40, target = M))
|
||||
M.visible_message("<span class='warning'> [user] decided life was worth living</span>")
|
||||
mouthshoot = 0
|
||||
return
|
||||
if (process_chambered())
|
||||
user.visible_message("<span class='warning'>[user] pulls the trigger.</span>")
|
||||
if(silenced)
|
||||
playsound(user, fire_sound, 10, 1)
|
||||
else
|
||||
playsound(user, fire_sound, 50, 1)
|
||||
if(istype(in_chamber, /obj/item/projectile/lasertag) || istype(in_chamber, /obj/item/projectile/bullet/reusable/foam_dart))
|
||||
user.show_message("<span class='warning'>You feel rather silly, trying to commit suicide with a toy.</span>")
|
||||
mouthshoot = 0
|
||||
return
|
||||
in_chamber.on_hit(M)
|
||||
if (in_chamber.damage_type != STAMINA)
|
||||
user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1)
|
||||
user.death()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Ow...</span>")
|
||||
user.apply_effect(110,STAMINA,0)
|
||||
del(in_chamber)
|
||||
mouthshoot = 0
|
||||
return
|
||||
else
|
||||
click_empty(user)
|
||||
mouthshoot = 0
|
||||
return
|
||||
|
||||
if (src.process_chambered())
|
||||
//Point blank shooting if on harm intent or target we were targeting.
|
||||
if(user.a_intent == I_HARM)
|
||||
user.visible_message("\red <b> \The [user] fires \the [src] point blank at [M]!</b>")
|
||||
if(istype(in_chamber)) in_chamber.damage *= 1.3
|
||||
Fire(M,user,0,0,1)
|
||||
return
|
||||
else if(target && M in target)
|
||||
Fire(M,user,0,0,1) ///Otherwise, shoot!
|
||||
return
|
||||
else
|
||||
return ..() //Pistolwhippin'
|
||||
|
||||
|
||||
/obj/item/weapon/gun/attackby(var/obj/item/A as obj, mob/user as mob, params)
|
||||
if(istype(A, /obj/item/device/flashlight/seclite))
|
||||
var/obj/item/device/flashlight/seclite/S = A
|
||||
/obj/item/weapon/gun/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/device/flashlight/seclite))
|
||||
var/obj/item/device/flashlight/seclite/S = I
|
||||
if(can_flashlight)
|
||||
if(!F)
|
||||
if(user.l_hand != src && user.r_hand != src)
|
||||
to_chat(user, "<span class='notice'>You'll need [src] in your hands to do that.</span>")
|
||||
if(!user.unEquip(I))
|
||||
return
|
||||
user.drop_item()
|
||||
to_chat(user, "<span class='notice'>You click [S] into place on [src].</span>")
|
||||
if(S.on)
|
||||
set_light(0)
|
||||
F = S
|
||||
A.loc = src
|
||||
I.loc = src
|
||||
update_icon()
|
||||
update_gunlight(user)
|
||||
verbs += /obj/item/weapon/gun/proc/toggle_gunlight
|
||||
if(istype(A, /obj/item/weapon/screwdriver))
|
||||
if(F)
|
||||
if(user.l_hand != src && user.r_hand != src)
|
||||
to_chat(user, "<span class='notice'>You'll need [src] in your hands to do that.</span>")
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/weapon/screwdriver))
|
||||
if(F && can_flashlight)
|
||||
for(var/obj/item/device/flashlight/seclite/S in src)
|
||||
to_chat(user, "<span class='notice'>You unscrew the seclite from [src].</span>")
|
||||
F = null
|
||||
@@ -370,8 +263,11 @@
|
||||
S.update_brightness(user)
|
||||
update_icon()
|
||||
verbs -= /obj/item/weapon/gun/proc/toggle_gunlight
|
||||
|
||||
if(unique_rename)
|
||||
if(istype(I, /obj/item/weapon/pen))
|
||||
rename_gun(user)
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/proc/toggle_gunlight()
|
||||
set name = "Toggle Gunlight"
|
||||
@@ -383,15 +279,14 @@
|
||||
|
||||
var/mob/living/carbon/human/user = usr
|
||||
if(!isturf(user.loc))
|
||||
to_chat(user, "You cannot turn the light on while in this [user.loc].")
|
||||
to_chat(user, "<span class='warning'>You cannot turn the light on while in this [user.loc]!</span>")
|
||||
F.on = !F.on
|
||||
to_chat(user, "<span class='notice'>You toggle the gunlight [F.on ? "on":"off"].</span>")
|
||||
|
||||
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
|
||||
update_gunlight(user)
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/proc/update_gunlight(var/mob/user = null)
|
||||
/obj/item/weapon/gun/proc/update_gunlight(mob/user = null)
|
||||
if(F)
|
||||
if(F.on)
|
||||
set_light(F.brightness_on)
|
||||
@@ -400,7 +295,80 @@
|
||||
update_icon()
|
||||
else
|
||||
set_light(0)
|
||||
|
||||
/obj/item/weapon/gun/pickup(mob/user)
|
||||
..()
|
||||
if(azoom)
|
||||
azoom.Grant(user)
|
||||
|
||||
/obj/item/weapon/gun/dropped(mob/user)
|
||||
..()
|
||||
zoom(user,FALSE)
|
||||
if(azoom)
|
||||
azoom.Remove(user)
|
||||
|
||||
/obj/item/weapon/gun/AltClick(mob/user)
|
||||
..()
|
||||
if(user.incapacitated())
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
if(unique_reskin && !current_skin && loc == user)
|
||||
reskin_gun(user)
|
||||
|
||||
/obj/item/weapon/gun/proc/reskin_gun(mob/M)
|
||||
var/choice = input(M,"Warning, you can only reskin your weapon once!","Reskin Gun") in options
|
||||
|
||||
if(src && choice && !current_skin && !M.incapacitated() && in_range(M,src))
|
||||
if(options[choice] == null)
|
||||
return
|
||||
current_skin = options[choice]
|
||||
to_chat(M, "Your gun is now skinned as [choice]. Say hello to your new friend.")
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/gun/proc/rename_gun(mob/M)
|
||||
var/input = stripped_input(M,"What do you want to name the gun?", ,"", MAX_NAME_LEN)
|
||||
|
||||
if(src && input && !M.stat && in_range(M,src) && !M.restrained() && M.canmove)
|
||||
name = input
|
||||
to_chat(M, "You name the gun [input]. Say hello to your new friend.")
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params)
|
||||
if(!ishuman(user) || !ishuman(target))
|
||||
return
|
||||
|
||||
if(semicd)
|
||||
return
|
||||
|
||||
if(user == target)
|
||||
target.visible_message("<span class='warning'>[user] sticks [src] in their mouth, ready to pull the trigger...</span>", \
|
||||
"<span class='userdanger'>You stick [src] in your mouth, ready to pull the trigger...</span>")
|
||||
else
|
||||
target.visible_message("<span class='warning'>[user] points [src] at [target]'s head, ready to pull the trigger...</span>", \
|
||||
"<span class='userdanger'>[user] points [src] at your head, ready to pull the trigger...</span>")
|
||||
|
||||
semicd = 1
|
||||
|
||||
if(!do_mob(user, target, 120) || user.zone_sel.selecting != "mouth")
|
||||
if(user)
|
||||
if(user == target)
|
||||
user.visible_message("<span class='notice'>[user] decided life was worth living.</span>")
|
||||
else if(target && target.Adjacent(user))
|
||||
target.visible_message("<span class='notice'>[user] has decided to spare [target]'s life.</span>", "<span class='notice'>[user] has decided to spare your life!</span>")
|
||||
semicd = 0
|
||||
return
|
||||
|
||||
semicd = 0
|
||||
|
||||
target.visible_message("<span class='warning'>[user] pulls the trigger!</span>", "<span class='userdanger'>[user] pulls the trigger!</span>")
|
||||
|
||||
if(chambered && chambered.BB)
|
||||
chambered.BB.damage *= 5
|
||||
|
||||
process_fire(target, user, 1, params)
|
||||
|
||||
/obj/item/weapon/gun/proc/isHandgun()
|
||||
return 1
|
||||
|
||||
/////////////
|
||||
// ZOOMING //
|
||||
@@ -424,8 +392,6 @@
|
||||
gun.zoom(L, FALSE)
|
||||
..()
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/gun/proc/zoom(mob/living/user, forced_zoom)
|
||||
if(!user || !user.client)
|
||||
return
|
||||
|
||||
@@ -1,108 +1,100 @@
|
||||
//Vox pinning weapon.
|
||||
/obj/item/weapon/gun/launcher/spikethrower
|
||||
|
||||
name = "Vox spike thrower"
|
||||
/obj/item/weapon/gun/projectile/automatic/spikethrower
|
||||
name = "\improper Vox spike thrower"
|
||||
desc = "A vicious alien projectile weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive."
|
||||
|
||||
var/last_regen = 0
|
||||
var/spike_gen_time = 100
|
||||
var/max_spikes = 3
|
||||
var/spikes = 3
|
||||
release_force = 30
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "spikethrower3"
|
||||
icon_state = "spikethrower"
|
||||
item_state = "spikethrower"
|
||||
w_class = 2
|
||||
fire_sound_text = "a strange noise"
|
||||
fire_sound = 'sound/weapons/bladeslice.ogg'
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/spikethrower
|
||||
burst_size = 2
|
||||
fire_delay = 3
|
||||
can_suppress = 0
|
||||
var/charge_tick = 0
|
||||
var/charge_delay = 15
|
||||
restricted_species = list("Vox", "Vox Armalis")
|
||||
|
||||
/obj/item/weapon/gun/launcher/spikethrower/New()
|
||||
/obj/item/weapon/gun/projectile/automatic/spikethrower/New()
|
||||
..()
|
||||
processing_objects.Add(src)
|
||||
last_regen = world.time
|
||||
|
||||
/obj/item/weapon/gun/launcher/spikethrower/Destroy()
|
||||
/obj/item/weapon/gun/projectile/automatic/spikethrower/Destroy()
|
||||
processing_objects.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/gun/launcher/spikethrower/process()
|
||||
|
||||
if(spikes < max_spikes && world.time > last_regen + spike_gen_time)
|
||||
spikes++
|
||||
last_regen = world.time
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/gun/launcher/spikethrower/examine(mob/user)
|
||||
..(user)
|
||||
to_chat(user, "It has [spikes] [spikes == 1 ? "spike" : "spikes"] remaining.")
|
||||
|
||||
/obj/item/weapon/gun/launcher/spikethrower/update_icon()
|
||||
icon_state = "spikethrower[spikes]"
|
||||
|
||||
/obj/item/weapon/gun/launcher/spikethrower/emp_act(severity)
|
||||
/obj/item/weapon/gun/projectile/automatic/spikethrower/update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/launcher/spikethrower/special_check(user)
|
||||
if(istype(user,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.species && H.species.name != "Vox" && H.species.name != "Vox Armalis")
|
||||
to_chat(user, "\red \The [src] does not respond to you!")
|
||||
return 0
|
||||
/obj/item/weapon/gun/projectile/automatic/spikethrower/process()
|
||||
charge_tick++
|
||||
if(charge_tick < charge_delay || !magazine)
|
||||
return
|
||||
charge_tick = 0
|
||||
var/obj/item/ammo_casing/caseless/spike/S = new(get_turf(src))
|
||||
magazine.give_round(S)
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/gun/launcher/spikethrower/update_release_force()
|
||||
/obj/item/weapon/gun/projectile/automatic/spikethrower/attack_self()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/launcher/spikethrower/chamber_round()
|
||||
if(in_chamber) return 1
|
||||
if(spikes < 1) return 0
|
||||
/obj/item/weapon/gun/projectile/automatic/spikethrower/process_chamber(eject_casing = 0, empty_chamber = 1)
|
||||
..()
|
||||
|
||||
spikes--
|
||||
in_chamber = new /obj/item/weapon/spike(src)
|
||||
return 1
|
||||
/obj/item/ammo_box/magazine/internal/spikethrower
|
||||
name = "\improper Vox spikethrower internal magazine"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/spike
|
||||
caliber = "spike"
|
||||
max_ammo = 10
|
||||
|
||||
/obj/item/weapon/gun/launcher/spikethrower/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0)
|
||||
if(..()) update_icon()
|
||||
/obj/item/ammo_casing/caseless/spike
|
||||
name = "alloy spike"
|
||||
desc = "A broadhead spike made out of a weird silvery metal."
|
||||
projectile_type = /obj/item/projectile/bullet/spike
|
||||
sharp = 1
|
||||
edge = 0
|
||||
throwforce = 5
|
||||
w_class = 3
|
||||
caliber = "spike"
|
||||
icon_state = "bolt"
|
||||
fire_sound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/obj/item/projectile/bullet/spike
|
||||
name = "alloy spike"
|
||||
desc = "It's about a foot of weird silvery metal with a wicked point."
|
||||
damage = 25
|
||||
stun = 1
|
||||
armour_penetration = 30
|
||||
icon_state = "magspear"
|
||||
|
||||
/obj/item/projectile/bullet/spike/on_hit(atom/target, blocked = 0)
|
||||
if((blocked != 100) && istype(target, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = target
|
||||
H.drip(500)
|
||||
..()
|
||||
|
||||
//This gun only functions for armalis. The on-sprite is too huge to render properly on other sprites.
|
||||
/obj/item/weapon/gun/energy/noisecannon
|
||||
|
||||
name = "alien heavy cannon"
|
||||
desc = "It's some kind of enormous alien weapon, as long as a man is tall."
|
||||
|
||||
icon = 'icons/obj/gun.dmi' //Actual on-sprite is handled by icon_override.
|
||||
icon_state = "noisecannon"
|
||||
item_state = "noisecannon"
|
||||
recoil = 1
|
||||
|
||||
force = 10
|
||||
projectile_type = "/obj/item/projectile/energy/sonic"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/sonic)
|
||||
cell_type = "/obj/item/weapon/stock_parts/cell/super"
|
||||
fire_delay = 40
|
||||
fire_sound = 'sound/effects/basscannon.ogg'
|
||||
|
||||
var/mode = 1
|
||||
|
||||
/obj/item/weapon/gun/energy/noisecannon/attack_hand(mob/user as mob)
|
||||
if(loc != user)
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(H))
|
||||
if(H.species.name == "Vox Armalis")
|
||||
..()
|
||||
return
|
||||
to_chat(user, "\red \The [src] is far too large for you to pick up.")
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/energy/noisecannon/process_chambered() //Does not have ammo.
|
||||
in_chamber = new projectile_type(src)
|
||||
return 1
|
||||
restricted_species = list("Vox Armalis")
|
||||
|
||||
/obj/item/weapon/gun/energy/noisecannon/update_icon()
|
||||
return
|
||||
|
||||
//Casing
|
||||
/obj/item/ammo_casing/energy/sonic
|
||||
projectile_type = /obj/item/projectile/energy/sonic
|
||||
fire_sound = 'sound/effects/basscannon.ogg'
|
||||
delay = 40
|
||||
|
||||
//Projectile.
|
||||
/obj/item/projectile/energy/sonic
|
||||
name = "distortion"
|
||||
icon = 'icons/obj/machines/particle_accelerator.dmi'
|
||||
icon_state = "particle"
|
||||
damage = 60
|
||||
damage_type = BRUTE
|
||||
@@ -112,7 +104,3 @@
|
||||
embed = 0
|
||||
weaken = 5
|
||||
stun = 5
|
||||
|
||||
/obj/item/projectile/energy/sonic/proc/split()
|
||||
//TODO: create two more projectiles to either side of this one, fire at targets to the side of target turf.
|
||||
return
|
||||
@@ -33,9 +33,8 @@
|
||||
var/list/starting_chems = null
|
||||
|
||||
/obj/item/weapon/gun/dartgun/update_icon()
|
||||
|
||||
if(!cartridge)
|
||||
icon_state = "dartgun-empty"
|
||||
icon_state = "dartgun-e"
|
||||
return 1
|
||||
|
||||
if(!cartridge.darts)
|
||||
@@ -47,7 +46,6 @@
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/gun/dartgun/New()
|
||||
|
||||
..()
|
||||
if(starting_chems)
|
||||
for(var/chem in starting_chems)
|
||||
@@ -104,7 +102,7 @@
|
||||
to_chat(user, "<span class='notice>You slot [B] into [src].</span>")
|
||||
src.updateUsrDialog()
|
||||
|
||||
/obj/item/weapon/gun/dartgun/can_fire()
|
||||
/obj/item/weapon/gun/dartgun/can_shoot()
|
||||
if(!cartridge)
|
||||
return 0
|
||||
else
|
||||
@@ -205,15 +203,12 @@
|
||||
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/dartgun/afterattack(obj/target, mob/user , flag)
|
||||
if(!isturf(target.loc) || target == user) return
|
||||
/obj/item/weapon/gun/dartgun/afterattack(atom/target, mob/living/user, flag, params)
|
||||
if(!isturf(target.loc) || target == user)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/dartgun/can_hit(var/mob/living/target as mob, var/mob/living/user as mob)
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/gun/dartgun/attack_self(mob/user)
|
||||
|
||||
user.set_machine(src)
|
||||
var/dat = "<b>[src] mixing control:</b><br><br>"
|
||||
|
||||
@@ -280,9 +275,10 @@
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/dartgun/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0)
|
||||
/obj/item/weapon/gun/dartgun/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override)
|
||||
if(cartridge)
|
||||
spawn(0) fire_dart(target,user)
|
||||
spawn(0)
|
||||
fire_dart(target,user)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>[src] is empty.</span>")
|
||||
|
||||
@@ -305,7 +301,7 @@
|
||||
anchored = 1
|
||||
density = 0
|
||||
|
||||
New()
|
||||
var/datum/reagents/R = new/datum/reagents(15)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
/obj/effect/syringe_gun_dummy/New()
|
||||
var/datum/reagents/R = new/datum/reagents(15)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user