Merge remote-tracking branch 'upstream/master' into chaplain-things

This commit is contained in:
Fox-McCloud
2016-06-09 01:05:43 -04:00
297 changed files with 5151 additions and 4478 deletions
+8
View File
@@ -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
+4
View File
@@ -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
View File
@@ -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
View File
@@ -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
+26 -1
View File
@@ -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
+15 -1
View File
@@ -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
+1 -2
View File
@@ -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
+4 -1
View File
@@ -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)
+3 -3
View File
@@ -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"
+3 -3
View File
@@ -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
+88
View File
@@ -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',
+1 -1
View File
@@ -331,4 +331,4 @@
/atom/movable/CanPass(atom/movable/mover, turf/target, height=1.5)
if(buckled_mob == mover)
return 1
return ..()
return ..()
+2 -1
View File
@@ -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
+2 -2
View File
@@ -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
+3 -3
View File
@@ -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")
+3 -3
View File
@@ -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)
+3 -3
View File
@@ -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
+4
View File
@@ -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)
+18 -4
View File
@@ -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)
+9 -16
View File
@@ -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
+2 -1
View File
@@ -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)
+4 -5
View File
@@ -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
+1 -1
View File
@@ -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
+219 -283
View File
@@ -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>&nbsp;[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>&nbsp;[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
+4 -4
View File
@@ -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)
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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), \
+14 -10
View File
@@ -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)
..()
+1 -1
View File
@@ -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
+98 -13
View File
@@ -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)
+7 -7
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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")
+6 -6
View File
@@ -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()
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+1
View File
@@ -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
+2 -1
View File
@@ -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)
+2
View File
@@ -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
+27 -3
View File
@@ -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
+3 -3
View File
@@ -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()
+3 -3
View File
@@ -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()
..()
+20 -2
View File
@@ -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)
+10
View File
@@ -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 ////////////
+1 -6
View File
@@ -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*
//*******
+2 -2
View File
@@ -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
+12 -17
View File
@@ -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)
+1 -1
View File
@@ -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
+3 -16
View File
@@ -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
+18 -1
View File
@@ -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
+1 -1
View File
@@ -465,4 +465,4 @@
else
healths.icon_state = "health6"
else
healths.icon_state = "health7"
healths.icon_state = "health7"
+6 -6
View File
@@ -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
+6
View File
@@ -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)
+4 -1
View File
@@ -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()
+13 -2
View File
@@ -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"
-4
View File
@@ -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.
+1 -1
View File
@@ -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"
+5 -21
View File
@@ -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)
+1 -1
View File
@@ -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)
+94 -69
View File
@@ -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
+17 -8
View File
@@ -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
+161 -118
View File
@@ -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
+95
View File
@@ -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
View File
@@ -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
+62 -74
View File
@@ -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