mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-20 10:37:17 +01:00
Merge remote-tracking branch 'refs/remotes/ParadiseSS13/master' into DatumEmotesMK2
This commit is contained in:
@@ -53,3 +53,11 @@
|
||||
#define AI_ON 1
|
||||
#define AI_IDLE 2
|
||||
#define AI_OFF 3
|
||||
|
||||
//Gun Stuff
|
||||
#define SAWN_INTACT 0
|
||||
#define SAWN_OFF 1
|
||||
|
||||
#define WEAPON_LIGHT 0
|
||||
#define WEAPON_MEDIUM 1
|
||||
#define WEAPON_HEAVY 2
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
#define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere To successfully stop you taking all pressure damage you must have both a suit and head item with this flag.
|
||||
#define NODROP 2 // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted.
|
||||
#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message with the default handler
|
||||
#define AIRTIGHT 8 // mask allows internals
|
||||
//#define USEDELAY 16 // 1 second extra delay on use (Can be used once every 2s)
|
||||
#define AIRTIGHT 8 // mask allows internals
|
||||
#define HANDSLOW 16 // If an item has this flag, it will slow you to carry it
|
||||
#define NOSHIELD 32 // weapon not affected by shield
|
||||
#define CONDUCT 64 // conducts electricity (metal etc.)
|
||||
#define ABSTRACT 128 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way
|
||||
|
||||
@@ -239,6 +239,7 @@
|
||||
#define REGION_ENGINEERING 5
|
||||
#define REGION_SUPPLY 6
|
||||
#define REGION_COMMAND 7
|
||||
#define REGION_CENTCOMM 8
|
||||
|
||||
//Matricies
|
||||
#define MATRIX_DEFAULT list(1, 0, 0, 0,\
|
||||
@@ -249,4 +250,8 @@
|
||||
#define MATRIX_GREYSCALE list(0.3, 0.3, 0.3, 0,\
|
||||
0.3, 0.3, 0.3, 0,\
|
||||
0.3, 0.3, 0.3, 0,\
|
||||
0, 0, 0, 1)
|
||||
0, 0, 0, 1)
|
||||
//Gun trigger guards
|
||||
#define TRIGGER_GUARD_ALLOW_ALL -1
|
||||
#define TRIGGER_GUARD_NONE 0
|
||||
#define TRIGGER_GUARD_NORMAL 1
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#define ROLE_HOG_GOD "hand of god: god" // We're prolly gonna port this one day or another
|
||||
#define ROLE_HOG_CULTIST "hand of god: cultist"
|
||||
#define ROLE_RAIDER "vox raider"
|
||||
#define ROLE_TRADER "trader"
|
||||
#define ROLE_VAMPIRE "vampire"
|
||||
#define ROLE_MUTINEER "mutineer"
|
||||
// Role tags for EVERYONE!
|
||||
@@ -71,4 +72,5 @@ var/global/list/special_roles = list(
|
||||
ROLE_REVENANT,
|
||||
ROLE_GUARDIAN,
|
||||
ROLE_MORPH,
|
||||
ROLE_TRADER,
|
||||
)
|
||||
|
||||
@@ -64,12 +64,6 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
//Empties the list by setting the length to 0. Hopefully the elements get garbage collected
|
||||
/proc/clearlist(list/list)
|
||||
if(istype(list))
|
||||
list.len = 0
|
||||
return
|
||||
|
||||
//Removes any null entries from the list
|
||||
/proc/listclearnulls(list/list)
|
||||
if(istype(list))
|
||||
|
||||
+1
-1
@@ -45,7 +45,7 @@
|
||||
if(modifiers["middle"])
|
||||
MiddleClickOn(A)
|
||||
if(controlled_mech) //Are we piloting a mech? Placed here so the modifiers are not overridden.
|
||||
controlled_mech.click_action(A, src) //Override AI normal click behavior.
|
||||
controlled_mech.click_action(A, src, params) //Override AI normal click behavior.
|
||||
return
|
||||
if(modifiers["shift"])
|
||||
ShiftClickOn(A)
|
||||
|
||||
+5
-59
@@ -74,7 +74,7 @@
|
||||
if(!locate(/turf) in list(A,A.loc)) // Prevents inventory from being drilled
|
||||
return
|
||||
var/obj/mecha/M = loc
|
||||
return M.click_action(A,src)
|
||||
return M.click_action(A, src, params)
|
||||
|
||||
if(restrained())
|
||||
changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow
|
||||
@@ -167,9 +167,8 @@
|
||||
animals lunging, etc.
|
||||
*/
|
||||
/mob/proc/RangedAttack(var/atom/A, var/params)
|
||||
if(ishuman(src) && (istype(src:gloves, /obj/item/clothing/gloves/color/yellow/power)) && a_intent == I_HARM)
|
||||
PowerGlove(A)
|
||||
if(!mutations.len) return
|
||||
if(!mutations.len)
|
||||
return
|
||||
if((LASER in mutations) && a_intent == I_HARM)
|
||||
LaserEyes(A) // moved into a proc below
|
||||
return
|
||||
@@ -319,61 +318,8 @@
|
||||
LE.current = T
|
||||
LE.yo = U.y - T.y
|
||||
LE.xo = U.x - T.x
|
||||
spawn(1)
|
||||
LE.process()
|
||||
LE.fire()
|
||||
|
||||
/mob/proc/PowerGlove(atom/A)
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/PowerGlove(atom/A)
|
||||
var/obj/item/clothing/gloves/color/yellow/power/G = src:gloves
|
||||
var/time = 100
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/U = get_turf(A)
|
||||
var/obj/structure/cable/cable = locate() in T
|
||||
if(!cable || !istype(cable))
|
||||
to_chat(src, "<span class='warning'>There is no cable here to power the gloves.</span>")
|
||||
return
|
||||
if(world.time < G.next_shock)
|
||||
to_chat(src, "<span class='warning'>[G] aren't ready to shock again!</span>")
|
||||
return
|
||||
src.visible_message("<span class='warning'>[name] fires an arc of electricity!</span>", \
|
||||
"<span class='warning'>You fire an arc of electricity!</span>", \
|
||||
"You hear the loud crackle of electricity!")
|
||||
var/datum/powernet/PN = cable.get_powernet()
|
||||
var/available = 0
|
||||
var/obj/item/projectile/beam/lightning/L = new /obj/item/projectile/beam/lightning/(get_turf(src))
|
||||
if(PN)
|
||||
available = PN.avail
|
||||
L.damage = PN.get_electrocute_damage()
|
||||
if(available >= 5000000)
|
||||
L.damage = 205
|
||||
if(L.damage >= 200)
|
||||
time = 200
|
||||
else if(L.damage >= 100)
|
||||
time = 150
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
if(L.damage <= 0)
|
||||
qdel(L)
|
||||
if(L)
|
||||
playsound(get_turf(src), 'sound/effects/eleczap.ogg', 75, 1)
|
||||
L.tang = L.adjustAngle(get_angle(U,T))
|
||||
L.icon = midicon
|
||||
L.icon_state = "[L.tang]"
|
||||
L.firer = usr
|
||||
L.def_zone = get_organ_target()
|
||||
L.original = src
|
||||
L.current = U
|
||||
L.starting = U
|
||||
L.yo = U.y - T.y
|
||||
L.xo = U.x - T.x
|
||||
spawn( 1 )
|
||||
L.process()
|
||||
|
||||
next_move = world.time + 12
|
||||
G.next_shock = world.time + time
|
||||
// Simple helper to face what you clicked on, in case it should be needed in more than one place
|
||||
/mob/proc/face_atom(var/atom/A)
|
||||
|
||||
@@ -419,4 +365,4 @@
|
||||
else
|
||||
var/turf/T = screen_loc2turf(modifiers["screen-loc"], get_turf(usr))
|
||||
T.Click(location, control, params)
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -40,4 +40,29 @@
|
||||
newObject.loc = get_turf(A)
|
||||
to_chat(user, "<span class='notice'>You release the power you had stored up, summoning \a [newObject.name]! </span>")
|
||||
usr.loc.visible_message("<span class='notice'>[user] waves \his hand and summons \a [newObject.name]</span>")
|
||||
..()
|
||||
..()
|
||||
|
||||
/datum/middleClickOverride/power_gloves
|
||||
var/last_shocked = 0
|
||||
var/shock_delay = 120
|
||||
|
||||
/datum/middleClickOverride/power_gloves/onClick(var/atom/A, var/mob/living/user)
|
||||
if(user.incapacitated())
|
||||
return
|
||||
if(world.time < last_shocked + shock_delay)
|
||||
to_chat(user, "<span class='warning'>The gloves are still recharging.</span>")
|
||||
return
|
||||
if(!isliving(A))
|
||||
to_chat(user, "<span class='warning'>Shocking an inanimate object would be pointless.</span>")
|
||||
return
|
||||
var/mob/living/L = A
|
||||
var/turf/T = get_turf(user)
|
||||
var/obj/structure/cable/C = locate() in T
|
||||
if(!C || !istype(C))
|
||||
to_chat(user, "<span class='warning'>There is no cable here to power the gloves.</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user.name] fires an arc of electricity at [L]!</span>", "<span class='warning'>You fire an arc of electricity at [L]!</span>", "You hear the loud crackle of electricity!")
|
||||
var/datum/powernet/PN = C.get_powernet()
|
||||
user.Beam(L,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5)
|
||||
electrocute_mob(L, PN, user)
|
||||
last_shocked = world.time
|
||||
|
||||
@@ -217,11 +217,25 @@
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_ALIVE|AB_CHECK_INSIDE
|
||||
|
||||
/datum/action/item_action/CheckRemoval(mob/living/user)
|
||||
return !(target in user)
|
||||
return get(target, /mob/living) != user
|
||||
|
||||
/datum/action/item_action/hands_free
|
||||
check_flags = AB_CHECK_ALIVE|AB_CHECK_INSIDE
|
||||
|
||||
// for clothing accessories like holsters
|
||||
/datum/action/item_action/accessory
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_ALIVE
|
||||
|
||||
/datum/action/item_action/accessory/Checks()
|
||||
. = ..()
|
||||
if(!.)
|
||||
return 0
|
||||
if(target.loc == owner)
|
||||
return 1
|
||||
if(istype(target.loc, /obj/item/clothing/under) && target.loc.loc == owner)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
///prset for organ actions
|
||||
/datum/action/item_action/organ_action
|
||||
check_flags = AB_CHECK_ALIVE
|
||||
|
||||
@@ -369,8 +369,7 @@
|
||||
A.current = T
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
spawn( 1 )
|
||||
A.process()
|
||||
A.fire()
|
||||
|
||||
usr.next_move = world.time + 6
|
||||
return
|
||||
|
||||
@@ -79,8 +79,11 @@
|
||||
qdel(trail)
|
||||
|
||||
current_loc = projectile.loc
|
||||
var/matrix/M = new
|
||||
M.Turn(dir2angle(projectile.dir))
|
||||
projectile.transform = M
|
||||
|
||||
sleep(proj_step_delay)
|
||||
|
||||
if(projectile)
|
||||
qdel(projectile)
|
||||
qdel(projectile)
|
||||
|
||||
@@ -234,9 +234,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
|
||||
/datum/supply_packs/security/taser
|
||||
name = "Stun Guns Crate"
|
||||
contains = list(/obj/item/weapon/gun/energy/advtaser,
|
||||
/obj/item/weapon/gun/energy/advtaser,
|
||||
/obj/item/weapon/gun/energy/advtaser)
|
||||
contains = list(/obj/item/weapon/gun/energy/gun/advtaser,
|
||||
/obj/item/weapon/gun/energy/gun/advtaser,
|
||||
/obj/item/weapon/gun/energy/gun/advtaser)
|
||||
cost = 15
|
||||
containername = "stun gun crate"
|
||||
|
||||
|
||||
@@ -308,7 +308,7 @@ var/list/uplink_items = list()
|
||||
reference = "AIRJ"
|
||||
item = /obj/item/clothing/under/contortionist
|
||||
cost = 6
|
||||
job = list("Atmospheric Technician")
|
||||
job = list("Life Support Specialist")
|
||||
|
||||
//Stimulants
|
||||
|
||||
@@ -410,6 +410,13 @@ var/list/uplink_items = list()
|
||||
item = /obj/item/weapon/twohanded/chainsaw
|
||||
cost = 13
|
||||
|
||||
/datum/uplink_item/dangerous/batterer
|
||||
name = "Mind Batterer"
|
||||
desc = "A device that has a chance of knocking down people around you for a long amount of time. 50% chance per person. The user is unaffected. Has 5 charges."
|
||||
reference = "BTR"
|
||||
item = /obj/item/device/batterer
|
||||
cost = 5
|
||||
|
||||
/datum/uplink_item/dangerous/manhacks
|
||||
name = "Viscerator Delivery Grenade"
|
||||
desc = "A unique grenade that deploys a swarm of viscerators upon activation, which will chase down and shred any non-operatives in the area."
|
||||
@@ -605,10 +612,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
|
||||
@@ -1016,7 +1023,7 @@ var/list/uplink_items = list()
|
||||
|
||||
/datum/uplink_item/implants/uplink
|
||||
name = "Uplink Implant"
|
||||
desc = "An implant injected into the body, and later activated using a bodily gesture to open an uplink with 5 telecrystals. The ability for an agent to open an uplink after their possessions have been stripped from them makes this implant excellent for escaping confinement."
|
||||
desc = "An implant injected into the body, and later activated using a bodily gesture to open an uplink with 10 telecrystals. The ability for an agent to open an uplink after their possessions have been stripped from them makes this implant excellent for escaping confinement."
|
||||
reference = "UI"
|
||||
item = /obj/item/weapon/implanter/uplink
|
||||
cost = 14
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -438,6 +438,14 @@ var/list/ghostteleportlocs = list()
|
||||
name = "Syndicate Infiltrator"
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/trade
|
||||
name = "Trade Shuttle"
|
||||
icon_state = "shuttle"
|
||||
requires_power = 0
|
||||
|
||||
/area/shuttle/trade/sol
|
||||
name = "Sol Freighter"
|
||||
|
||||
/area/airtunnel1/ // referenced in airtunnel.dm:759
|
||||
|
||||
/area/dummy/ // Referenced in engine.dm:261
|
||||
@@ -675,6 +683,14 @@ var/list/ghostteleportlocs = list()
|
||||
icon_state = "southeast"
|
||||
requires_power = 0
|
||||
|
||||
/area/trader_station
|
||||
name = "Trade Base"
|
||||
icon_state = "yellow"
|
||||
requires_power = 0
|
||||
|
||||
/area/trader_station/sol
|
||||
name = "Jupiter Station 6"
|
||||
|
||||
/area/vox_station/mining
|
||||
name = "\improper Nearby Mining Asteroid"
|
||||
icon_state = "north"
|
||||
|
||||
@@ -331,4 +331,4 @@
|
||||
/atom/movable/CanPass(atom/movable/mover, turf/target, height=1.5)
|
||||
if(buckled_mob == mover)
|
||||
return 1
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -91,6 +91,8 @@
|
||||
loc.visible_message("<span class='warning'>The corpse of [H.name] suddenly rises!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobspore/death()
|
||||
..()
|
||||
|
||||
// On death, create a small smoke of harmful gas (s-Acid)
|
||||
var/datum/effect/system/chem_smoke_spread/S = new
|
||||
var/turf/location = get_turf(src)
|
||||
@@ -108,7 +110,6 @@
|
||||
S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud
|
||||
S.start()
|
||||
|
||||
ghostize()
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobspore/Destroy()
|
||||
|
||||
@@ -14,9 +14,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
||||
required_enemies = 1
|
||||
recommended_enemies = 4
|
||||
|
||||
uplink_welcome = "Syndicate Uplink Console:"
|
||||
uplink_uses = 20
|
||||
|
||||
var/const/prob_int_murder_target = 50 // intercept names the assassination target half the time
|
||||
var/const/prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target
|
||||
var/const/prob_right_murder_target_h = 50 // upper bound on probability of naimg the right assassination target
|
||||
|
||||
@@ -73,6 +73,12 @@
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/changeling/proc/transfer_changeling_powers(var/mob/living/carbon/user, var/mob/living/carbon/target)
|
||||
if(istype(target, /mob/living/carbon)) // so we don't runtime, I don't even know why it's necessary as it needs a grab
|
||||
var/datum/changeling/c = user.mind.changeling
|
||||
var/datum/changeling/t = target.mind.changeling
|
||||
c.purchasedpowers = t.purchasedpowers
|
||||
|
||||
//used in /mob/Stat()
|
||||
/obj/effect/proc_holder/changeling/proc/can_be_used_by(var/mob/user)
|
||||
if(!ishuman(user))
|
||||
|
||||
@@ -50,6 +50,8 @@
|
||||
user.key = ghost.key
|
||||
|
||||
user.Paralyse(2)
|
||||
user.remove_language("Changeling")
|
||||
target.add_language("Changeling")
|
||||
user.remove_language("Changeling")
|
||||
transfer_changeling_powers(user, target)
|
||||
|
||||
to_chat(target, "<span class='warning'>Our genes cry out as we swap our [user] form for [target].</span>")
|
||||
|
||||
@@ -34,9 +34,6 @@
|
||||
required_enemies = 3
|
||||
recommended_enemies = 4
|
||||
|
||||
uplink_welcome = "Nar-Sie Uplink Console:"
|
||||
uplink_uses = 20
|
||||
|
||||
var/datum/mind/sacrifice_target = null
|
||||
var/finished = 0
|
||||
|
||||
|
||||
@@ -3,9 +3,6 @@
|
||||
config_tag = "extended"
|
||||
required_players = 0
|
||||
|
||||
uplink_welcome = "Syndicate Uplink Console:"
|
||||
uplink_uses = 20
|
||||
|
||||
/datum/game_mode/announce()
|
||||
to_chat(world, "<B>The current game mode is - Extended Role-Playing!</B>")
|
||||
to_chat(world, "<B>Just have fun and role-play!</B>")
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
var/newscaster_announcements = null
|
||||
var/ert_disabled = 0
|
||||
var/uplink_welcome = "Syndicate Uplink Console:"
|
||||
var/uplink_uses = 10
|
||||
var/uplink_uses = 20
|
||||
|
||||
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
|
||||
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -8,9 +8,6 @@
|
||||
required_enemies = 1
|
||||
recommended_enemies = 1
|
||||
|
||||
uplink_welcome = "Crazy AI Uplink Console:"
|
||||
uplink_uses = 10
|
||||
|
||||
var/AI_win_timeleft = 1500 //started at 1500, in case I change this for testing round end.
|
||||
var/malf_mode_declared = 0
|
||||
var/station_captured = 0
|
||||
|
||||
@@ -5,9 +5,6 @@
|
||||
var/wave = 1
|
||||
required_players = 35
|
||||
|
||||
uplink_welcome = "EVIL METEOR Uplink Console:"
|
||||
uplink_uses = 10
|
||||
|
||||
|
||||
/datum/game_mode/meteor/announce()
|
||||
to_chat(world, "<B>The current game mode is - Meteor!</B>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -19,9 +19,6 @@ datum/game_mode/mutiny
|
||||
required_players = 20
|
||||
ert_disabled = 1
|
||||
|
||||
uplink_welcome = "Mutineers Uplink Console:"
|
||||
uplink_uses = 0
|
||||
|
||||
New()
|
||||
fluff = new(src)
|
||||
|
||||
|
||||
@@ -11,9 +11,6 @@ proc/issyndicate(mob/living/M as mob)
|
||||
required_enemies = 5
|
||||
recommended_enemies = 5
|
||||
|
||||
uplink_welcome = "Corporate Backed Uplink Console:"
|
||||
uplink_uses = 120
|
||||
|
||||
var/const/agents_possible = 5 //If we ever need more syndicate agents.
|
||||
|
||||
var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer!
|
||||
|
||||
@@ -247,6 +247,7 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/objective/protect/mindslave //subytpe for mindslave implants
|
||||
|
||||
/datum/objective/hijack
|
||||
martyr_compatible = 0 //Technically you won't get both anyway.
|
||||
@@ -804,4 +805,50 @@ var/global/vox_kills = 0 //Used to check the Inviolate.
|
||||
explanation_text = "Follow the Inviolate. Minimise death and loss of resources."
|
||||
check_completion()
|
||||
if(vox_kills > MAX_VOX_KILLS) return 0
|
||||
return 1
|
||||
return 1
|
||||
|
||||
// Traders
|
||||
|
||||
/datum/objective/trade // Yes, I know there's no check_completion. The objectives exist only to tell the traders what to get.
|
||||
/datum/objective/trade/proc/choose_target(var/station)
|
||||
return
|
||||
|
||||
/datum/objective/trade/stock // Stock or spare parts.
|
||||
var/target_rating = 1
|
||||
/datum/objective/trade/stock/choose_target(var/station)
|
||||
var/itemname
|
||||
switch(rand(1,8))
|
||||
if(1)
|
||||
target = /obj/item/weapon/stock_parts/cell
|
||||
target_amount = 10
|
||||
target_rating = 3
|
||||
itemname = "ten high-capacity power cells"
|
||||
if(2)
|
||||
target = /obj/item/weapon/stock_parts/manipulator
|
||||
target_amount = 20
|
||||
itemname = "twenty micro manipulators"
|
||||
if(3)
|
||||
target = /obj/item/weapon/stock_parts/matter_bin
|
||||
target_amount = 20
|
||||
itemname = "twenty matter bins"
|
||||
if(4)
|
||||
target = /obj/item/weapon/stock_parts/micro_laser
|
||||
target_amount = 15
|
||||
itemname = "fifteen micro-lasers"
|
||||
if(5)
|
||||
target = /obj/item/weapon/stock_parts/capacitor
|
||||
target_amount = 15
|
||||
itemname = "fifteen capacitors"
|
||||
if(6)
|
||||
target = /obj/item/weapon/stock_parts/subspace/filter
|
||||
target_amount = 4
|
||||
itemname = "four hyperwave filters"
|
||||
if(7)
|
||||
target = /obj/item/solar_assembly
|
||||
target_amount = 10
|
||||
itemname = "ten solar panel assemblies"
|
||||
if(8)
|
||||
target = /obj/item/device/flash
|
||||
target_amount = 6
|
||||
itemname = "six flashes"
|
||||
explanation_text = "We are running low on spare parts. Trade for [itemname]."
|
||||
@@ -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
|
||||
|
||||
@@ -16,10 +16,6 @@
|
||||
required_enemies = 1
|
||||
recommended_enemies = 4
|
||||
|
||||
|
||||
uplink_welcome = "Syndicate Uplink Console:"
|
||||
uplink_uses = 20
|
||||
|
||||
var/traitors_possible = 4 //hard limit on traitors if scaling is turned off
|
||||
var/const/traitor_scaling_coeff = 5.0 //how much does the amount of players get divided by to determine traitors
|
||||
|
||||
@@ -370,10 +366,11 @@
|
||||
traitor_mind.special_role = null
|
||||
traitor_mind.som = null
|
||||
slaved.leave_serv_hud(traitor_mind)
|
||||
for(var/datum/objective/protect/mindslave/MS in traitor_mind.objectives)
|
||||
traitor_mind.objectives -= MS
|
||||
|
||||
update_traitor_icons_removed(traitor_mind)
|
||||
// to_chat(world, "Removed [traitor_mind.current.name] from traitor shit")
|
||||
to_chat(traitor_mind.current, "\red <FONT size = 3><B>The fog clouding your mind clears. You remember nothing from the moment you were implanted until now.(You don't remember who implanted you)</B></FONT>")
|
||||
to_chat(traitor_mind.current, "<span class='userdanger'>You are no longer a mindslave; you have complete and free control of your own faculties, once more!</span>")
|
||||
|
||||
/datum/game_mode/proc/assign_exchange_role(var/datum/mind/owner)
|
||||
//set faction
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
var/list/datum/mind/vampires = list()
|
||||
var/list/datum/mind/vampire_enthralled = list() //those controlled by a vampire
|
||||
var/list/vampire_thralls = list() //vammpires controlling somebody
|
||||
|
||||
/datum/game_mode/vampire
|
||||
name = "vampire"
|
||||
config_tag = "vampire"
|
||||
@@ -14,9 +15,6 @@
|
||||
required_enemies = 1
|
||||
recommended_enemies = 4
|
||||
|
||||
uplink_welcome = "Syndicate Uplink Console:"
|
||||
uplink_uses = 20
|
||||
|
||||
var/const/prob_int_murder_target = 50 // intercept names the assassination target half the time
|
||||
var/const/prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target
|
||||
var/const/prob_right_murder_target_h = 50 // upper bound on probability of naimg the right assassination target
|
||||
@@ -353,8 +351,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
|
||||
vampire_mind.som = null
|
||||
slaved.leave_serv_hud(vampire_mind)
|
||||
update_vampire_icons_removed(vampire_mind)
|
||||
// to_chat(world, "Removed [vampire_mind.current.name] from vampire shit")
|
||||
to_chat(vampire_mind.current, "\red <FONT size = 3><B>The fog clouding your mind clears. You remember nothing from the moment you were enthralled until now.</B></FONT>")
|
||||
vampire_mind.current.visible_message("<span class='userdanger'>[vampire_mind.current] looks as though a burden has been lifted!</span>", "<span class='userdanger'>The dark fog in your mind clears as you regain control of your own faculties, you are no longer a vampire thrall!</span>")
|
||||
if(vampire_mind.current.hud_used)
|
||||
vampire_mind.current.hud_used.remove_vampire_hud()
|
||||
|
||||
|
||||
@@ -267,6 +267,10 @@
|
||||
W.destroy()
|
||||
playsound(usr.loc, 'sound/effects/creepyshriek.ogg', 100, 1)
|
||||
|
||||
|
||||
/proc/isvampirethrall(mob/living/M as mob)
|
||||
return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.vampire_enthralled)
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/targetted/enthrall
|
||||
name = "Enthrall (300)"
|
||||
desc = "You use a large portion of your power to sway those loyal to none to be loyal to you only."
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -8,9 +8,6 @@
|
||||
required_enemies = 1
|
||||
recommended_enemies = 1
|
||||
|
||||
uplink_welcome = "Wizardly Uplink Console:"
|
||||
uplink_uses = 20
|
||||
|
||||
var/use_huds = 0
|
||||
var/finished = 0
|
||||
var/but_wait_theres_more = 0
|
||||
|
||||
@@ -98,6 +98,10 @@
|
||||
/var/const/access_syndicate_leader = 151//Nuke Op Leader Access
|
||||
/var/const/access_vox = 152//Vox Access
|
||||
|
||||
//Trade Stations
|
||||
|
||||
var/const/access_trade_sol = 160
|
||||
|
||||
//MONEY
|
||||
/var/const/access_crate_cash = 200
|
||||
|
||||
@@ -267,6 +271,8 @@
|
||||
return list(access_mailsorting, access_mining, access_mining_station, access_mineral_storeroom, access_cargo, access_qm)
|
||||
if(REGION_COMMAND) //command
|
||||
return list(access_heads, access_RC_announce, access_keycard_auth, access_change_ids, access_ai_upload, access_teleporter, access_eva, access_tcomsat, access_gateway, access_all_personal_lockers, access_heads_vault, access_blueshield, access_ntrep, access_hop, access_captain)
|
||||
if(REGION_CENTCOMM) //because why the heck not
|
||||
return get_all_centcom_access() + get_all_accesses()
|
||||
|
||||
/proc/get_region_accesses_name(code)
|
||||
switch(code)
|
||||
@@ -286,6 +292,8 @@
|
||||
return "Supply"
|
||||
if(REGION_COMMAND) //command
|
||||
return "Command"
|
||||
if(REGION_CENTCOMM) //CC
|
||||
return "CentComm"
|
||||
|
||||
|
||||
/proc/get_access_desc(A)
|
||||
@@ -600,4 +608,3 @@ proc/get_all_job_icons() //For all existing HUD icons
|
||||
return
|
||||
|
||||
return "Unknown" //Return unknown if none of the above apply
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
|
||||
// H.equip_or_collect(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk
|
||||
H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_s_store)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
|
||||
if(H.backbag == 1)
|
||||
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
|
||||
H.equip_or_collect(new /obj/item/weapon/restraints/handcuffs(H), slot_l_hand)
|
||||
@@ -175,7 +175,7 @@
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head)
|
||||
H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda)
|
||||
H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_s_store)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
|
||||
H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
|
||||
if(H.backbag == 1)
|
||||
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
|
||||
@@ -249,7 +249,7 @@
|
||||
H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
|
||||
H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda)
|
||||
H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_s_store)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
|
||||
H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
|
||||
if(H.backbag == 1)
|
||||
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
|
||||
|
||||
@@ -174,10 +174,10 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
|
||||
if(H.backbag == 1)
|
||||
H.equip_or_collect(new /obj/item/weapon/storage/box/deathimp(H), slot_r_hand)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/blueshield(H), slot_l_hand)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/blueshield(H), slot_l_hand)
|
||||
else
|
||||
H.equip_or_collect(new /obj/item/weapon/storage/box/deathimp(H.back), slot_in_backpack)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/blueshield(H.back), slot_in_backpack)
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/blueshield(H.back), slot_in_backpack)
|
||||
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
|
||||
L.imp_in = H
|
||||
L.implanted = 1
|
||||
@@ -263,4 +263,4 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
L.imp_in = H
|
||||
L.implanted = 1
|
||||
H.sec_hud_set_implants()
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -244,6 +244,10 @@
|
||||
H.equip_or_collect(new /obj/item/toy/crayon/rainbow(H), slot_in_backpack)
|
||||
H.equip_or_collect(new /obj/item/weapon/storage/fancy/crayons(H), slot_in_backpack)
|
||||
H.equip_or_collect(new /obj/item/weapon/reagent_containers/spray/waterflower(H), slot_in_backpack)
|
||||
if(H.get_species() == "Machine")
|
||||
var/obj/item/organ/internal/cyberimp/brain/clown_voice/implant
|
||||
implant = new
|
||||
implant.insert(H)
|
||||
H.mutations.Add(CLUMSY)
|
||||
H.dna.SetSEState(COMICBLOCK,1,1)
|
||||
genemutcheck(H,COMICBLOCK,null,MUTCHK_FORCED)
|
||||
|
||||
@@ -184,7 +184,10 @@
|
||||
data["dialysis"] = connected.filtering
|
||||
if (connected.beaker)
|
||||
data["isBeakerLoaded"] = 1
|
||||
data["beakerFreeSpace"] = round(connected.beaker.reagents.maximum_volume - connected.beaker.reagents.total_volume)
|
||||
if(connected.beaker.reagents)
|
||||
data["beakerFreeSpace"] = round(connected.beaker.reagents.maximum_volume - connected.beaker.reagents.total_volume)
|
||||
else
|
||||
data["beakerFreeSpace"] = 0
|
||||
|
||||
var/chemicals[0]
|
||||
for (var/re in connected.injection_chems)
|
||||
|
||||
@@ -151,6 +151,9 @@
|
||||
qdel(src)
|
||||
return
|
||||
else if(istype(W, /obj/item/device/analyzer) && panel_open) //XRay
|
||||
if(!user.unEquip(W))
|
||||
to_chat(user, "<span class='warning'>[W] is stuck!</span>")
|
||||
return
|
||||
if(!isXRay())
|
||||
upgradeXRay()
|
||||
qdel(W)
|
||||
@@ -158,14 +161,19 @@
|
||||
else
|
||||
to_chat(user, "[msg2]")
|
||||
|
||||
else if(istype(W, /obj/item/stack/sheet/mineral/plasma) && panel_open)
|
||||
else if(istype(W, /obj/item/stack/sheet/mineral/plasma) && panel_open)
|
||||
if(!user.unEquip(W))
|
||||
to_chat(user, "<span class='warning'>[W] is stuck!</span>")
|
||||
return
|
||||
if(!isEmpProof())
|
||||
upgradeEmpProof()
|
||||
to_chat(user, "[msg]")
|
||||
qdel(W)
|
||||
else
|
||||
to_chat(user, "[msg2]")
|
||||
else if(istype(W, /obj/item/device/assembly/prox_sensor) && panel_open)
|
||||
else if(istype(W, /obj/item/device/assembly/prox_sensor) && panel_open)
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
if(!isMotion())
|
||||
upgradeMotion()
|
||||
to_chat(user, "[msg]")
|
||||
|
||||
@@ -20,10 +20,9 @@
|
||||
4 = Screwdriver panel closed and is fully built (you cannot attach upgrades)
|
||||
*/
|
||||
|
||||
/obj/item/weapon/camera_assembly/attackby(obj/item/W as obj, mob/living/user as mob, params)
|
||||
/obj/item/weapon/camera_assembly/attackby(obj/item/W, mob/living/user, params)
|
||||
|
||||
switch(state)
|
||||
|
||||
if(0)
|
||||
// State 0
|
||||
if(iswrench(W) && isturf(src.loc))
|
||||
@@ -116,7 +115,6 @@
|
||||
return
|
||||
|
||||
else if(iswirecutter(W))
|
||||
|
||||
new/obj/item/stack/cable_coil(get_turf(src), 2)
|
||||
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
|
||||
to_chat(user, "You cut the wires from the circuits.")
|
||||
@@ -125,9 +123,12 @@
|
||||
|
||||
// Upgrades!
|
||||
if(is_type_in_list(W, possible_upgrades) && !is_type_in_list(W, upgrades)) // Is a possible upgrade and isn't in the camera already.
|
||||
if(!user.unEquip(W))
|
||||
to_chat(user, "<span class='warning'>[W] is stuck!</span>")
|
||||
return
|
||||
to_chat(user, "You attach \the [W] into the assembly inner circuits.")
|
||||
upgrades += W
|
||||
user.drop_item(W)
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
return
|
||||
|
||||
|
||||
@@ -273,6 +273,17 @@
|
||||
src.emagged = 0
|
||||
setMenuState(usr,COMM_SCREEN_MAIN)
|
||||
|
||||
if("AcceptDocking")
|
||||
to_chat(usr, "Docking request accepted!")
|
||||
trade_dock_timelimit = world.time + 1200
|
||||
trade_dockrequest_timelimit = 0
|
||||
command_announcement.Announce("Docking request for trading ship approved, please dock at port bay 4.", "Docking Request")
|
||||
if("DenyDocking")
|
||||
to_chat(usr, "Docking requeset denied!")
|
||||
trade_dock_timelimit = 0
|
||||
trade_dockrequest_timelimit = 0
|
||||
command_announcement.Announce("Docking request for trading ship denied.", "Docking request")
|
||||
|
||||
nanomanager.update_uis(src)
|
||||
return 1
|
||||
|
||||
@@ -358,6 +369,11 @@
|
||||
|
||||
data["shuttle"] = shuttle
|
||||
|
||||
if(trade_dockrequest_timelimit > world.time)
|
||||
data["dock_request"] = 1
|
||||
else
|
||||
data["dock_request"] = 0
|
||||
|
||||
// update the ui if it exists, returns null if no ui is passed/found
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
|
||||
if (!ui)
|
||||
|
||||
@@ -17,17 +17,20 @@
|
||||
var/data[0]
|
||||
var/list/pods[0]
|
||||
for(var/obj/item/device/spacepod_equipment/misc/tracker/TR in world)
|
||||
var/obj/spacepod/myPod = TR.my_atom
|
||||
var/obj/spacepod/my_pod = TR.my_atom
|
||||
var/enabled = TR.enabled
|
||||
if(myPod && enabled)
|
||||
var/podname = capitalize(sanitize(myPod.name))
|
||||
var/occupant = "None"
|
||||
var/occupant2 = "None"
|
||||
if(myPod.occupant)
|
||||
occupant = myPod.occupant.name
|
||||
if(myPod.occupant2)
|
||||
occupant2 = myPod.occupant2.name
|
||||
pods.Add(list(list("pod" = "\ref[myPod]", "name" = podname, "occupant" = occupant, "occupant2" = occupant2, "x" = myPod.x, "y" = myPod.y, "z" = myPod.z)))
|
||||
if(my_pod && enabled)
|
||||
var/podname = capitalize(sanitize(my_pod.name))
|
||||
var/list/chairs = list()
|
||||
if(my_pod.pilot || my_pod.passengers)
|
||||
if(my_pod.pilot)
|
||||
chairs += list("pilot" = my_pod.pilot.name)
|
||||
var/i = 1
|
||||
for(var/mob/M in my_pod.passengers)
|
||||
chairs += list("passenger [i]" = M.name)
|
||||
i++
|
||||
|
||||
pods.Add(list(list("pod" = "\ref[my_pod]", "name" = podname) + chairs + list("x" = my_pod.x, "y" = my_pod.y, "z" = my_pod.z)))
|
||||
|
||||
data["pods"] = pods
|
||||
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
var/doorDeni = 'sound/machines/DeniedBeep.ogg' // i'm thinkin' Deni's
|
||||
var/boltUp = 'sound/machines/BoltsUp.ogg'
|
||||
var/boltDown = 'sound/machines/BoltsDown.ogg'
|
||||
var/is_special = 0
|
||||
|
||||
/obj/machinery/door/airlock/command
|
||||
name = "Airlock"
|
||||
@@ -126,6 +127,7 @@
|
||||
hackProof = 1
|
||||
aiControlDisabled = 1
|
||||
unacidable = 1
|
||||
is_special = 1
|
||||
|
||||
/obj/machinery/door/airlock/maintenance_hatch
|
||||
name = "Maintenance Hatch"
|
||||
@@ -304,6 +306,7 @@
|
||||
desc = "A mysterious alien airlock with a complicated opening mechanism."
|
||||
hackProof = 1
|
||||
icon = 'icons/obj/doors/Doorplasma.dmi'
|
||||
is_special = 1
|
||||
|
||||
/obj/machinery/door/airlock/alien/bumpopen(mob/living/user as mob)
|
||||
if(istype(user,/mob/living/carbon/alien) || isrobot(user) || isAI(user))
|
||||
@@ -799,7 +802,6 @@ About the new airlock wires panel:
|
||||
else
|
||||
return
|
||||
else if(istype(C, /obj/item/weapon/screwdriver))
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, 1)
|
||||
src.p_open = !( src.p_open )
|
||||
src.update_icon()
|
||||
else if(istype(C, /obj/item/weapon/wirecutters))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -58,6 +58,9 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>There is already ID card inside.</span>")
|
||||
|
||||
/obj/machinery/computer/guestpass/proc/get_changeable_accesses()
|
||||
return giver.access
|
||||
|
||||
/obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
@@ -84,7 +87,7 @@
|
||||
dat += "Duration (minutes): <a href='?src=\ref[src];choice=duration'>[duration] m</a><br>"
|
||||
dat += "Access to areas:<br>"
|
||||
if (giver && giver.access)
|
||||
for (var/A in giver.access)
|
||||
for (var/A in get_changeable_accesses())
|
||||
var/area = get_access_desc(A)
|
||||
if (A in accesses)
|
||||
area = "<b>[area]</b>"
|
||||
@@ -124,7 +127,7 @@
|
||||
if (A in accesses)
|
||||
accesses.Remove(A)
|
||||
else
|
||||
if(giver && giver.access && (A in giver.access))
|
||||
if(giver && giver.access && (A in get_changeable_accesses()))
|
||||
accesses.Add(A)
|
||||
if (href_list["action"])
|
||||
switch(href_list["action"])
|
||||
@@ -179,4 +182,12 @@
|
||||
else
|
||||
to_chat(usr, "\red Cannot issue pass without issuing ID.")
|
||||
updateUsrDialog()
|
||||
return
|
||||
return
|
||||
|
||||
/obj/machinery/computer/guestpass/hop
|
||||
name = "\improper HoP guest pass terminal"
|
||||
|
||||
/obj/machinery/computer/guestpass/hop/get_changeable_accesses()
|
||||
. = ..()
|
||||
if(. && access_change_ids in .)
|
||||
return get_all_accesses()
|
||||
|
||||
@@ -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)
|
||||
@@ -519,7 +518,7 @@ var/list/turret_icons
|
||||
assess_and_assign(ME.occupant, targets, secondarytargets)
|
||||
|
||||
for(var/obj/spacepod/SP in view(7,src))
|
||||
assess_and_assign(SP.occupant, targets, secondarytargets)
|
||||
assess_and_assign(SP.pilot, targets, secondarytargets)
|
||||
|
||||
for(var/obj/vehicle/T in view(7,src))
|
||||
assess_and_assign(T.buckled_mob, targets, secondarytargets)
|
||||
@@ -561,9 +560,6 @@ var/list/turret_icons
|
||||
if(get_dist(src, L) > 7) //if it's too far away, why bother?
|
||||
return TURRET_NOT_TARGET
|
||||
|
||||
if(!check_trajectory(L, src)) //check if we have true line of sight
|
||||
return TURRET_NOT_TARGET
|
||||
|
||||
if(emagged) // If emagged not even the dead get a rest
|
||||
return L.stat ? TURRET_SECONDARY_TARGET : TURRET_PRIORITY_TARGET
|
||||
|
||||
@@ -670,6 +666,8 @@ var/list/turret_icons
|
||||
return
|
||||
|
||||
/obj/machinery/porta_turret/proc/shootAt(var/mob/living/target)
|
||||
if(!raised) //the turret has to be raised in order to fire - makes sense, right?
|
||||
return
|
||||
//any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power!
|
||||
if(!emagged) //if it hasn't been emagged, it has to obey a cooldown rate
|
||||
if(last_fired || !raised) //prevents rapid-fire shooting, unless it's been emagged
|
||||
@@ -684,10 +682,6 @@ var/list/turret_icons
|
||||
if(!istype(T) || !istype(U))
|
||||
return
|
||||
|
||||
if(!raised) //the turret has to be raised in order to fire - makes sense, right?
|
||||
return
|
||||
|
||||
|
||||
update_icon()
|
||||
var/obj/item/projectile/A
|
||||
if(emagged || lethal)
|
||||
@@ -698,18 +692,17 @@ var/list/turret_icons
|
||||
if(projectile)
|
||||
A = new projectile(loc)
|
||||
playsound(loc, shot_sound, 75, 1)
|
||||
A.original = target
|
||||
|
||||
// Lethal/emagged turrets use twice the power due to higher energy beams
|
||||
// Emagged turrets again use twice as much power due to higher firing rates
|
||||
use_power(reqpower * (2 * (emagged || lethal)) * (2 * emagged))
|
||||
|
||||
//Shooting Code:
|
||||
A.original = target
|
||||
A.current = T
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
spawn(1)
|
||||
A.process()
|
||||
A.fire()
|
||||
return A
|
||||
|
||||
/datum/turret_checks
|
||||
var/enabled
|
||||
|
||||
@@ -203,7 +203,8 @@
|
||||
if(istype(O,/obj/item/weapon/gun/energy/disabler/cyborg))
|
||||
var/obj/item/weapon/gun/energy/disabler/cyborg/D = O
|
||||
if(D.power_supply.charge < D.power_supply.maxcharge)
|
||||
D.power_supply.give(D.charge_cost)
|
||||
var/obj/item/ammo_casing/energy/E = D.ammo_type[D.select]
|
||||
D.power_supply.give(E.e_cost)
|
||||
D.update_icon()
|
||||
else
|
||||
D.charge_tick = 0
|
||||
|
||||
@@ -387,7 +387,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
|
||||
src.receive_information(signal, src)
|
||||
|
||||
// Try sending it!
|
||||
var/list/try_send = list("/obj/machinery/telecomms/server", "/obj/machinery/telecomms/hub", "/obj/machinery/telecomms/broadcaster", "/obj/machinery/telecomms/bus")
|
||||
var/list/try_send = list("/obj/machinery/telecomms/server", "/obj/machinery/telecomms/hub", "/obj/machinery/telecomms/broadcaster")
|
||||
var/i = 0
|
||||
for(var/send in try_send)
|
||||
if(i)
|
||||
|
||||
@@ -436,6 +436,15 @@
|
||||
else
|
||||
icon_state = "tele0"
|
||||
|
||||
/obj/machinery/teleport/perma/attackby(obj/item/W, mob/user, params)
|
||||
if(default_deconstruction_screwdriver(user, "tele-o", "tele0", W))
|
||||
return
|
||||
|
||||
if(exchange_parts(user, W))
|
||||
return
|
||||
|
||||
default_deconstruction_crowbar(W)
|
||||
|
||||
/obj/machinery/teleport/station
|
||||
name = "station"
|
||||
desc = "The power control station for a bluespace teleporter."
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
turretTargets |= Mech
|
||||
else if( istype(O, /obj/spacepod) )
|
||||
var/obj/spacepod/Pod = O
|
||||
if( Pod.occupant || Pod.occupant2 )
|
||||
if( Pod.pilot )
|
||||
turretTargets |= Pod
|
||||
else if(istype(O,/mob/living/simple_animal))
|
||||
turretTargets |= O
|
||||
@@ -139,7 +139,7 @@
|
||||
return 1
|
||||
else if( istype(T, /obj/spacepod) )
|
||||
var/obj/spacepod/SP = T
|
||||
if( SP.occupant || SP.occupant2 )
|
||||
if( SP.pilot )
|
||||
return 1
|
||||
else if(istype(T,/mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/A = T
|
||||
@@ -159,8 +159,8 @@
|
||||
if(M.occupant)
|
||||
new_targets += M
|
||||
for(var/obj/spacepod/M in protected_area.turretTargets)
|
||||
if(M.occupant)
|
||||
new_targets += M
|
||||
if(M.pilot)
|
||||
new_targets += M.pilot
|
||||
for(var/mob/living/simple_animal/M in protected_area.turretTargets)
|
||||
if(!M.stat)
|
||||
new_targets += M
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -488,7 +487,7 @@
|
||||
return 1
|
||||
else if(istype(target, /obj/spacepod))
|
||||
var/obj/spacepod/S = target
|
||||
if(S.occupant || S.occupant2)
|
||||
if(S.pilot)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -522,14 +521,12 @@
|
||||
continue //Don't shoot at empty mechs.
|
||||
pos_targets += M
|
||||
for(var/obj/spacepod/M in oview(scan_range, src))
|
||||
if(M.occupant)
|
||||
if(faction in M.occupant.faction)
|
||||
if(M.pilot)
|
||||
var/mob/P = M.pilot
|
||||
if(faction in P.faction)
|
||||
continue
|
||||
if(M.occupant2)
|
||||
if(faction in M.occupant2.faction)
|
||||
continue
|
||||
if(!M.occupant && !M.occupant2)
|
||||
continue //Don't shoot at empty mechs.
|
||||
if(!M.pilot)
|
||||
continue //Don't shoot at empty pods.
|
||||
pos_targets += M
|
||||
if(pos_targets.len)
|
||||
target = pick(pos_targets)
|
||||
|
||||
@@ -849,7 +849,7 @@
|
||||
product_ads = "Float like an astronaut, sting like a bullet!;Express your second amendment today!;Guns don't kill people, but you can!;Who needs responsibilities when you have guns?"
|
||||
vend_reply = "Remember the name: Liberation Station!"
|
||||
products = list(/obj/item/weapon/gun/projectile/automatic/pistol/deagle/gold = 2,/obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo = 2,
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol/m2411 = 2,/obj/item/weapon/gun/projectile/automatic/proto = 2,
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol/m1911 = 2,/obj/item/weapon/gun/projectile/automatic/proto = 2,
|
||||
/obj/item/weapon/gun/projectile/shotgun/automatic/combat = 2,/obj/item/weapon/gun/projectile/automatic/gyropistol = 1,
|
||||
/obj/item/weapon/gun/projectile/shotgun = 2,/obj/item/weapon/gun/projectile/automatic/ar = 2)
|
||||
premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2,/obj/item/ammo_box/magazine/m50 = 4,/obj/item/ammo_box/magazine/m45 = 2,/obj/item/ammo_box/magazine/m75 = 2)
|
||||
|
||||
@@ -384,7 +384,7 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
|
||||
name = "Syringe Gun"
|
||||
desc = "Exosuit-mounted chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur. (Can be attached to: Medical Exosuits)"
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon = 'icons/obj/guns/projectile.dmi'
|
||||
icon_state = "syringegun"
|
||||
item_state = "syringegun"
|
||||
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
|
||||
@@ -666,4 +666,4 @@
|
||||
for(var/reagent in S.processed_reagents)
|
||||
S.reagents.add_reagent(reagent,amount)
|
||||
S.chassis.use_power(energy_drain)
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
var/projectile
|
||||
var/fire_sound
|
||||
var/size=0
|
||||
var/projectiles_per_shot = 1
|
||||
var/variance = 0
|
||||
var/randomspread = 0 //use random spread for machineguns, instead of shotgun scatter
|
||||
var/projectile_delay = 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(var/obj/mecha/combat/M as obj)
|
||||
if(..())
|
||||
@@ -16,32 +20,51 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/proc/get_shot_amount()
|
||||
return projectiles_per_shot
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy
|
||||
name = "General Energy Weapon"
|
||||
size = 2
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
var/turf/curloc = chassis.loc
|
||||
var/atom/targloc = get_turf(target)
|
||||
if (!targloc || !istype(targloc, /turf) || !curloc)
|
||||
return
|
||||
if (targloc == curloc)
|
||||
return
|
||||
set_ready_state(0)
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/action(target, params)
|
||||
if(!action_checks(target))
|
||||
return 0
|
||||
|
||||
var/turf/curloc = get_turf(chassis)
|
||||
var/turf/targloc = get_turf(target)
|
||||
if (!targloc || !istype(targloc) || !curloc)
|
||||
return 0
|
||||
if (targloc == curloc)
|
||||
return 0
|
||||
|
||||
set_ready_state(0)
|
||||
for(var/i=1 to get_shot_amount())
|
||||
var/obj/item/projectile/A = new projectile(curloc)
|
||||
A.firer = chassis.occupant
|
||||
A.original = target
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
chassis.use_power(energy_drain)
|
||||
A.process()
|
||||
chassis.log_message("Fired from [src.name], targeting [target].")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
var/spread = 0
|
||||
if(variance)
|
||||
if(randomspread)
|
||||
spread = round((rand() - 0.5) * variance)
|
||||
else
|
||||
spread = round((i / projectiles_per_shot - 0.5) * variance)
|
||||
A.preparePixelProjectile(target, targloc, chassis.occupant, params, spread)
|
||||
|
||||
chassis.use_power(energy_drain)
|
||||
A.fire()
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
|
||||
sleep(max(0, projectile_delay))
|
||||
set_ready_state(0)
|
||||
log_message("Fired from [name], targeting [target].")
|
||||
var/turf/T = get_turf(src)
|
||||
msg_admin_attack("[key_name_admin(chassis.occupant)] fired a [src] in ([T.x], [T.y], [T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
|
||||
log_game("[key_name(chassis.occupant)] fired a [src] in [T.x], [T.y], [T.z]")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy
|
||||
name = "General Energy Weapon"
|
||||
size = 2
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
|
||||
equip_cooldown = 8
|
||||
@@ -56,7 +79,7 @@
|
||||
name = "CH-LC \"Solaris\" Laser Cannon"
|
||||
icon_state = "mecha_laser"
|
||||
energy_drain = 40
|
||||
projectile = /obj/item/projectile/beam/heavylaser
|
||||
projectile = /obj/item/projectile/beam/laser/heavylaser
|
||||
fire_sound = 'sound/weapons/lasercannonfire.ogg'
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion
|
||||
@@ -82,25 +105,25 @@
|
||||
icon_state = "pulse1_bl"
|
||||
var/life = 20
|
||||
|
||||
Bump(atom/A)
|
||||
A.bullet_act(src, def_zone)
|
||||
src.life -= 10
|
||||
if(ismob(A))
|
||||
var/mob/M = A
|
||||
if(istype(firer, /mob))
|
||||
M.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
|
||||
firer.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
|
||||
log_attack("<font color='red'>[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src]</font>")
|
||||
if(!iscarbon(firer))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = firer
|
||||
/obj/item/projectile/beam/pulse/heavy/Bump(atom/A)
|
||||
A.bullet_act(src, def_zone)
|
||||
life -= 10
|
||||
if(ismob(A))
|
||||
var/mob/M = A
|
||||
if(istype(firer, /mob))
|
||||
M.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
|
||||
firer.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
|
||||
log_attack("<font color='red'>[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src]</font>")
|
||||
if(!iscarbon(firer))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.attack_log += "\[[time_stamp()]\] <b>UNKNOWN SUBJECT (No longer exists)</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
|
||||
log_attack("<font color='red'>UNKNOWN shot [M] ([M.ckey]) with a [src]</font>")
|
||||
if(life <= 0)
|
||||
qdel(src)
|
||||
return
|
||||
M.LAssailant = firer
|
||||
else
|
||||
M.attack_log += "\[[time_stamp()]\] <b>UNKNOWN SUBJECT (No longer exists)</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
|
||||
log_attack("<font color='red'>UNKNOWN shot [M] ([M.ckey]) with a [src]</font>")
|
||||
if(life <= 0)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser
|
||||
@@ -119,89 +142,89 @@
|
||||
equip_cooldown = 150
|
||||
range = MELEE|RANGED
|
||||
|
||||
can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/honker/can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/honker/action(target, params)
|
||||
if(!chassis)
|
||||
return 0
|
||||
if(energy_drain && chassis.get_charge() < energy_drain)
|
||||
return 0
|
||||
if(!equip_ready)
|
||||
return 0
|
||||
|
||||
action(target)
|
||||
if(!chassis)
|
||||
return 0
|
||||
if(energy_drain && chassis.get_charge() < energy_drain)
|
||||
return 0
|
||||
if(!equip_ready)
|
||||
return 0
|
||||
playsound(chassis, 'sound/items/AirHorn.ogg', 100, 1)
|
||||
chassis.occupant_message("<font color='red' size='5'>HONK</font>")
|
||||
for(var/mob/living/carbon/M in ohearers(6, chassis))
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs))
|
||||
continue
|
||||
to_chat(M, "<font color='red' size='7'>HONK</font>")
|
||||
M.sleeping = 0
|
||||
M.stuttering = 20
|
||||
M.ear_deaf = 30
|
||||
M.Weaken(3)
|
||||
if(prob(30))
|
||||
M.Stun(10)
|
||||
M.Paralyse(4)
|
||||
else
|
||||
M.Jitter(500)
|
||||
///else the mousetraps are useless
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(isobj(H.shoes))
|
||||
var/thingy = H.shoes
|
||||
H.unEquip(H.shoes)
|
||||
walk_away(thingy,chassis,15,2)
|
||||
spawn(20)
|
||||
if(thingy)
|
||||
walk(thingy,0)
|
||||
for(var/obj/mecha/combat/recitence/R in oview(6, chassis))
|
||||
R.occupant_message("\The [R] has protected you from [chassis]'s HONK at the cost of some power.")
|
||||
R.use_power(R.get_charge() / 4)
|
||||
|
||||
playsound(chassis, 'sound/items/AirHorn.ogg', 100, 1)
|
||||
chassis.occupant_message("<font color='red' size='5'>HONK</font>")
|
||||
for(var/mob/living/carbon/M in ohearers(6, chassis))
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs))
|
||||
continue
|
||||
to_chat(M, "<font color='red' size='7'>HONK</font>")
|
||||
M.sleeping = 0
|
||||
M.stuttering = 20
|
||||
M.ear_deaf = 30
|
||||
M.Weaken(3)
|
||||
if(prob(30))
|
||||
M.Stun(10)
|
||||
M.Paralyse(4)
|
||||
else
|
||||
M.Jitter(500)
|
||||
///else the mousetraps are useless
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(isobj(H.shoes))
|
||||
var/thingy = H.shoes
|
||||
H.unEquip(H.shoes)
|
||||
walk_away(thingy,chassis,15,2)
|
||||
spawn(20)
|
||||
if(thingy)
|
||||
walk(thingy,0)
|
||||
for(var/obj/mecha/combat/recitence/R in oview(6, chassis))
|
||||
R.occupant_message("\The [R] has protected you from [chassis]'s HONK at the cost of some power.")
|
||||
R.use_power(R.get_charge() / 4)
|
||||
|
||||
chassis.use_power(energy_drain)
|
||||
log_message("Honked from [src.name]. HONK!")
|
||||
var/turf/T = get_turf(src)
|
||||
msg_admin_attack("[key_name_admin(chassis.occupant)] used a Mecha Honker in ([T.x], [T.y], [T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
|
||||
log_game("[key_name(chassis.occupant)] used a Mecha Honker in [T.x], [T.y], [T.z]")
|
||||
do_after_cooldown()
|
||||
return
|
||||
chassis.use_power(energy_drain)
|
||||
log_message("Honked from [name]. HONK!")
|
||||
var/turf/T = get_turf(src)
|
||||
msg_admin_attack("[key_name_admin(chassis.occupant)] used a Mecha Honker in ([T.x], [T.y], [T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
|
||||
log_game("[key_name(chassis.occupant)] used a Mecha Honker in [T.x], [T.y], [T.z]")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic
|
||||
name = "General Ballisic Weapon"
|
||||
var/projectiles
|
||||
var/projectile_energy_cost
|
||||
size = 2
|
||||
action_checks(atom/target)
|
||||
if(..())
|
||||
if(projectiles > 0)
|
||||
return 1
|
||||
return 0
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action_checks(atom/target)
|
||||
if(..())
|
||||
if(projectiles > 0)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
get_equip_info()
|
||||
return "[..()]\[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - <a href='?src=\ref[src];rearm=1'>Rearm</a>":null]"
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_equip_info()
|
||||
return "[..()]\[[projectiles]\][(projectiles < initial(projectiles))?" - <a href='?src=\ref[src];rearm=1'>Rearm</a>":null]"
|
||||
|
||||
proc/rearm()
|
||||
if(projectiles < initial(projectiles))
|
||||
var/projectiles_to_add = initial(projectiles) - projectiles
|
||||
while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add)
|
||||
projectiles++
|
||||
projectiles_to_add--
|
||||
chassis.use_power(projectile_energy_cost)
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
log_message("Rearmed [src.name].")
|
||||
return
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/proc/rearm()
|
||||
if(projectiles < initial(projectiles))
|
||||
var/projectiles_to_add = initial(projectiles) - projectiles
|
||||
while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add)
|
||||
projectiles++
|
||||
projectiles_to_add--
|
||||
chassis.use_power(projectile_energy_cost)
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",get_equip_info())
|
||||
log_message("Rearmed [name].")
|
||||
return
|
||||
|
||||
Topic(href, href_list)
|
||||
..()
|
||||
if (href_list["rearm"])
|
||||
src.rearm()
|
||||
return
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/Topic(href, href_list)
|
||||
..()
|
||||
if (href_list["rearm"])
|
||||
rearm()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine
|
||||
name = "FNX-66 Carbine"
|
||||
@@ -211,41 +234,6 @@
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
projectiles = 24
|
||||
projectile_energy_cost = 15
|
||||
var/projectiles_per_shot = 1
|
||||
var/deviation = 0.0
|
||||
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
var/turf/targloc = get_turf(target)
|
||||
var/target_x = targloc.x
|
||||
var/target_y = targloc.y
|
||||
var/target_z = targloc.z
|
||||
targloc = null
|
||||
spawn for(var/i=1 to min(projectiles, projectiles_per_shot))
|
||||
if(!chassis) break
|
||||
var/turf/curloc = get_turf(chassis)
|
||||
targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z)
|
||||
if (!targloc || !curloc)
|
||||
continue
|
||||
if (targloc == curloc)
|
||||
continue
|
||||
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
var/obj/item/projectile/A = new projectile(curloc)
|
||||
src.projectiles--
|
||||
A.original = target
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
A.process()
|
||||
sleep(2)
|
||||
set_ready_state(0)
|
||||
log_message("Fired from [src.name], targeting [target].")
|
||||
var/turf/T = get_turf(src)
|
||||
msg_admin_attack("[key_name_admin(chassis.occupant)] fired a [src] in ([T.x], [T.y], [T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
|
||||
log_game("[key_name(chassis.occupant)] fired a [src] in [T.x], [T.y], [T.z]")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine/silenced
|
||||
name = "\improper S.H.H. \"Quietus\" Carbine"
|
||||
@@ -270,36 +258,8 @@
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
projectiles = 40
|
||||
projectile_energy_cost = 25
|
||||
var/projectiles_per_shot = 4
|
||||
var/deviation = 0.7
|
||||
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
var/turf/curloc = get_turf(chassis)
|
||||
var/turf/targloc = get_turf(target)
|
||||
if(!curloc || !targloc) return
|
||||
var/target_x = targloc.x
|
||||
var/target_y = targloc.y
|
||||
var/target_z = targloc.z
|
||||
targloc = null
|
||||
for(var/i=1 to min(projectiles, projectiles_per_shot))
|
||||
targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z)
|
||||
if(!targloc || targloc == curloc)
|
||||
break
|
||||
playsound(chassis, fire_sound, 80, 1)
|
||||
var/obj/item/projectile/A = new projectile(curloc)
|
||||
src.projectiles--
|
||||
A.original = target
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
set_ready_state(0)
|
||||
A.process()
|
||||
log_message("Fired from [src.name], targeting [target].")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
|
||||
projectiles_per_shot = 4
|
||||
variance = 25
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
|
||||
name = "Ultra AC 2"
|
||||
@@ -309,38 +269,9 @@
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
projectiles = 300
|
||||
projectile_energy_cost = 20
|
||||
var/projectiles_per_shot = 3
|
||||
var/deviation = 0.3
|
||||
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
var/turf/targloc = get_turf(target)
|
||||
var/target_x = targloc.x
|
||||
var/target_y = targloc.y
|
||||
var/target_z = targloc.z
|
||||
targloc = null
|
||||
spawn for(var/i=1 to min(projectiles, projectiles_per_shot))
|
||||
if(!chassis) break
|
||||
var/turf/curloc = get_turf(chassis)
|
||||
targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z)
|
||||
if (!targloc || !curloc)
|
||||
continue
|
||||
if (targloc == curloc)
|
||||
continue
|
||||
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
var/obj/item/projectile/A = new projectile(curloc)
|
||||
src.projectiles--
|
||||
A.original = target
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
A.process()
|
||||
sleep(2)
|
||||
set_ready_state(0)
|
||||
log_message("Fired from [src.name], targeting [target].")
|
||||
do_after_cooldown()
|
||||
return
|
||||
projectiles_per_shot = 3
|
||||
variance = 6
|
||||
projectile_delay = 2
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
|
||||
name = "SRM-8 Missile Rack"
|
||||
@@ -353,20 +284,21 @@
|
||||
var/missile_speed = 2
|
||||
var/missile_range = 30
|
||||
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
set_ready_state(0)
|
||||
var/obj/item/missile/M = new projectile(chassis.loc)
|
||||
M.primed = 1
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
M.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Fired from [src.name], targeting [target].")
|
||||
var/turf/T = get_turf(src)
|
||||
msg_admin_attack("[key_name_admin(chassis.occupant)] fired a [src] in ([T.x], [T.y], [T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
|
||||
log_game("[key_name(chassis.occupant)] fired a [src] in [T.x], [T.y], [T.z]")
|
||||
do_after_cooldown()
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/action(target, params)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
set_ready_state(0)
|
||||
var/obj/item/missile/M = new projectile(chassis.loc)
|
||||
M.primed = 1
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
M.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Fired from [name], targeting [target].")
|
||||
var/turf/T = get_turf(src)
|
||||
msg_admin_attack("[key_name_admin(chassis.occupant)] fired a [src] in ([T.x], [T.y], [T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
|
||||
log_game("[key_name(chassis.occupant)] fired a [src] in [T.x], [T.y], [T.z]")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/missile
|
||||
@@ -375,13 +307,13 @@
|
||||
var/primed = null
|
||||
throwforce = 15
|
||||
|
||||
throw_impact(atom/hit_atom)
|
||||
if(primed)
|
||||
explosion(hit_atom, 0, 0, 2, 4, 0)
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
return
|
||||
/obj/item/missile/throw_impact(atom/hit_atom)
|
||||
if(primed)
|
||||
explosion(hit_atom, 0, 0, 2, 4, 0)
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
|
||||
name = "SGL-6 Grenade Launcher"
|
||||
@@ -394,18 +326,19 @@
|
||||
equip_cooldown = 60
|
||||
var/det_time = 20
|
||||
size=1
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
set_ready_state(0)
|
||||
var/obj/item/weapon/grenade/flashbang/F = new projectile(chassis.loc)
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
F.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Fired from [src.name], targeting [target].")
|
||||
spawn(det_time)
|
||||
F.prime()
|
||||
do_after_cooldown()
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/action(target, params)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
set_ready_state(0)
|
||||
var/obj/item/weapon/grenade/flashbang/F = new projectile(chassis.loc)
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
F.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Fired from [name], targeting [target].")
|
||||
spawn(det_time)
|
||||
F.prime()
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang//Because I am a heartless bastard -Sieve
|
||||
name = "SOB-3 Grenade Launcher"
|
||||
@@ -417,7 +350,7 @@
|
||||
size=1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/get_equip_info()//Limited version of the clusterbang launcher that can't reload
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [chassis.selected==src?"<b>":"<a href='?src=\ref[chassis];select_equip=\ref[src]'>"][src.name][chassis.selected==src?"</b>":"</a>"]\[[src.projectiles]\]"
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [chassis.selected==src?"<b>":"<a href='?src=\ref[chassis];select_equip=\ref[src]'>"][name][chassis.selected==src?"</b>":"</a>"]\[[projectiles]\]"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/rearm()
|
||||
return//Extra bit of security
|
||||
@@ -432,22 +365,23 @@
|
||||
projectile_energy_cost = 100
|
||||
equip_cooldown = 20
|
||||
|
||||
can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar/can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
set_ready_state(0)
|
||||
var/obj/item/weapon/bananapeel/B = new projectile(chassis.loc)
|
||||
playsound(chassis, fire_sound, 60, 1)
|
||||
B.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Bananed from [src.name], targeting [target]. HONK!")
|
||||
do_after_cooldown()
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar/action(target, params)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
set_ready_state(0)
|
||||
var/obj/item/weapon/bananapeel/B = new projectile(chassis.loc)
|
||||
playsound(chassis, fire_sound, 60, 1)
|
||||
B.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Bananed from [name], targeting [target]. HONK!")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar
|
||||
@@ -460,23 +394,24 @@
|
||||
projectile_energy_cost = 100
|
||||
equip_cooldown = 10
|
||||
|
||||
can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar/can_attach(obj/mecha/combat/honker/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
set_ready_state(0)
|
||||
var/obj/item/device/assembly/mousetrap/M = new projectile(chassis.loc)
|
||||
M.secured = 1
|
||||
playsound(chassis, fire_sound, 60, 1)
|
||||
M.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Launched a mouse-trap from [src.name], targeting [target]. HONK!")
|
||||
do_after_cooldown()
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar/action(target, params)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
set_ready_state(0)
|
||||
var/obj/item/device/assembly/mousetrap/M = new projectile(chassis.loc)
|
||||
M.secured = 1
|
||||
playsound(chassis, fire_sound, 60, 1)
|
||||
M.throw_at(target, missile_range, missile_speed, chassis)
|
||||
projectiles--
|
||||
log_message("Launched a mouse-trap from [name], targeting [target]. HONK!")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas
|
||||
name = "PCMK-6 Bolas Launcher"
|
||||
@@ -489,23 +424,24 @@
|
||||
projectile_energy_cost = 50
|
||||
equip_cooldown = 10
|
||||
|
||||
can_attach(obj/mecha/combat/gygax/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas/can_attach(obj/mecha/combat/gygax/M as obj)
|
||||
if(..())
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
action(target)
|
||||
if(!action_checks(target)) return
|
||||
set_ready_state(0)
|
||||
var/obj/item/weapon/legcuffs/bolas/M = new projectile(chassis.loc)
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
M.thrown_from = src
|
||||
M.throw_at(target, missile_range, missile_speed)
|
||||
projectiles--
|
||||
log_message("Fired from [src.name], targeting [target].")
|
||||
do_after_cooldown()
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas/action(target, params)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
set_ready_state(0)
|
||||
var/obj/item/weapon/legcuffs/bolas/M = new projectile(chassis.loc)
|
||||
playsound(chassis, fire_sound, 50, 1)
|
||||
M.thrown_from = src
|
||||
M.throw_at(target, missile_range, missile_speed)
|
||||
projectiles--
|
||||
log_message("Fired from [name], targeting [target].")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma
|
||||
equip_cooldown = 20
|
||||
|
||||
@@ -219,7 +219,7 @@
|
||||
// return ..()
|
||||
*/
|
||||
|
||||
/obj/mecha/proc/click_action(atom/target,mob/user)
|
||||
/obj/mecha/proc/click_action(atom/target, mob/user, params)
|
||||
if(!src.occupant || src.occupant != user ) return
|
||||
if(user.stat || !user.canmove)
|
||||
return
|
||||
@@ -239,9 +239,9 @@
|
||||
return
|
||||
if(!target.Adjacent(src))
|
||||
if(selected && selected.is_ranged())
|
||||
selected.action(target)
|
||||
selected.action(target, params)
|
||||
else if(selected && selected.is_melee())
|
||||
selected.action(target)
|
||||
selected.action(target, params)
|
||||
else
|
||||
if(internal_damage&MECHA_INT_CONTROL_LOST)
|
||||
target = safepick(oview(1,src))
|
||||
@@ -1991,4 +1991,4 @@
|
||||
|
||||
|
||||
/obj/mecha/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
|
||||
flick_overlay(image('icons/mob/talk.dmi', bubble_loc, bubble_state,MOB_LAYER+1), bubble_recipients, 30)
|
||||
flick_overlay(image('icons/mob/talk.dmi', bubble_loc, bubble_state,MOB_LAYER+1), bubble_recipients, 30)
|
||||
|
||||
@@ -118,3 +118,41 @@
|
||||
/obj/item/weapon/relic = 3,
|
||||
"" = 11
|
||||
)
|
||||
|
||||
/obj/effect/spawner/lootdrop/trade_sol_rare
|
||||
name = "trader rare item spawner"
|
||||
lootdoubles = 0
|
||||
color = "#00FFFF"
|
||||
|
||||
loot = list(
|
||||
/obj/item/weapon/card/emag_broken = 2,
|
||||
/obj/item/weapon/defibrillator/compact/loaded = 2,
|
||||
/obj/item/weapon/gun/energy/laser/retro = 2,
|
||||
/obj/item/weapon/rcd/combat = 1,
|
||||
/obj/item/weapon/rcd = 2,
|
||||
)
|
||||
|
||||
/obj/effect/spawner/lootdrop/trade_sol_common
|
||||
name = "trader common item spawner"
|
||||
lootdoubles = 0
|
||||
color = "#00FFFF"
|
||||
|
||||
loot = list(
|
||||
/obj/item/weapon/tank/anesthetic = 2,
|
||||
/obj/item/weapon/weldingtool/hugetank = 2,
|
||||
/obj/item/weapon/pickaxe/diamond = 1,
|
||||
/obj/item/device/spacepod_equipment/weaponry/mining_laser = 1,
|
||||
/obj/item/device/paicard = 2,
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol = 2,
|
||||
/obj/item/device/megaphone = 2,
|
||||
/obj/item/weapon/stock_parts/capacitor = 1,
|
||||
/obj/item/weapon/stock_parts/cell/high = 1,
|
||||
/obj/item/weapon/stock_parts/manipulator = 1,
|
||||
/obj/item/weapon/stock_parts/matter_bin = 1,
|
||||
/obj/item/weapon/stock_parts/micro_laser = 1,
|
||||
/obj/item/weapon/stock_parts/scanning_module = 1,
|
||||
/obj/item/weapon/spacecash/c200 = 1,
|
||||
/obj/item/weapon/airlock_electronics = 1,
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/super = 1,
|
||||
/obj/item/pizzabox = 3,
|
||||
)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -31,6 +31,9 @@
|
||||
/obj/item/weapon/door_remote/afterattack(obj/machinery/door/airlock/D, mob/user)
|
||||
if(!istype(D))
|
||||
return
|
||||
if(D.is_special)
|
||||
to_chat(user, "<span class='danger'>[src] cannot access this kind of door!</span>")
|
||||
return
|
||||
if(!(D.arePowerSystemsOn()))
|
||||
to_chat(user, "<span class='danger'>[D] has no power!</span>")
|
||||
return
|
||||
@@ -99,6 +102,12 @@
|
||||
icon_state = "gangtool-white"
|
||||
region_access = REGION_GENERAL
|
||||
|
||||
/obj/item/weapon/door_remote/centcomm
|
||||
name = "centcomm door remote"
|
||||
desc = "High-ranking NT officials only."
|
||||
icon_state = "gangtool-blue"
|
||||
region_access = REGION_CENTCOMM
|
||||
|
||||
#undef WAND_OPEN
|
||||
#undef WAND_BOLT
|
||||
#undef WAND_EMERGENCY
|
||||
#undef WAND_EMERGENCY
|
||||
|
||||
@@ -27,35 +27,34 @@ effective or pretty fucking useless.
|
||||
origin_tech = "magnets=3;combat=3;syndicate=3"
|
||||
|
||||
var/times_used = 0 //Number of times it's been used.
|
||||
var/max_uses = 2
|
||||
var/max_uses = 5
|
||||
|
||||
|
||||
/obj/item/device/batterer/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0)
|
||||
if(!user) return
|
||||
/obj/item/device/batterer/examine(mob/user)
|
||||
..(user)
|
||||
if(times_used >= max_uses)
|
||||
to_chat(user, "\red The mind batterer has been burnt out!")
|
||||
to_chat(user, "<span class='notice'>[src] is out of charge.</span>")
|
||||
if(times_used < max_uses)
|
||||
to_chat(user, "<span class='notice'>[src] has [max_uses-times_used] charges left.</span>")
|
||||
|
||||
/obj/item/device/batterer/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
|
||||
if(!user)
|
||||
return
|
||||
if(times_used >= max_uses)
|
||||
to_chat(user, "<span class='danger'>The mind batterer has been burnt out!</span>")
|
||||
return
|
||||
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used [src] to knock down people in the area.</font>")
|
||||
|
||||
for(var/mob/living/carbon/human/M in orange(10, user))
|
||||
spawn()
|
||||
if(prob(50))
|
||||
for(var/mob/living/carbon/human/M in oview(7, user))
|
||||
if(prob(50))
|
||||
M.Weaken(rand(4,7))
|
||||
add_logs(M, user, "stunned", src)
|
||||
to_chat(M, "<span class='danger'>You feel a tremendous, paralyzing wave flood your mind.</span>")
|
||||
else
|
||||
to_chat(M, "<span class='danger'>You feel a sudden, electric jolt travel through your head.</span>")
|
||||
|
||||
M.Weaken(rand(10,20))
|
||||
if(prob(25))
|
||||
M.Stun(rand(5,10))
|
||||
to_chat(M, "\red <b>You feel a tremendous, paralyzing wave flood your mind.</b>")
|
||||
if(!iscarbon(user))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = user
|
||||
else
|
||||
to_chat(M, "\red <b>You feel a sudden, electric jolt travel through your head.</b>")
|
||||
|
||||
playsound(src.loc, 'sound/misc/interference.ogg', 50, 1)
|
||||
to_chat(user, "\blue You trigger [src].")
|
||||
times_used += 1
|
||||
playsound(loc, 'sound/misc/interference.ogg', 50, 1)
|
||||
times_used++
|
||||
to_chat(user, "<span class='notice'>You trigger [src]. It has [max_uses-times_used] charges left.</span>")
|
||||
if(times_used >= max_uses)
|
||||
icon_state = "battererburnt"
|
||||
|
||||
|
||||
@@ -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)]")
|
||||
|
||||
@@ -147,17 +147,14 @@ var/list/tape_roll_applications = list()
|
||||
tape_roll_applications[F] |= direction
|
||||
return
|
||||
|
||||
/obj/item/tape/Bumped(M as mob)
|
||||
if(src.allowed(M))
|
||||
var/turf/T = get_turf(src)
|
||||
M:loc = T
|
||||
|
||||
/obj/item/tape/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(!density) return 1
|
||||
if(air_group || (height==0)) return 1
|
||||
|
||||
if ((mover.pass_flags & PASSTABLE || istype(mover, /obj/effect/meteor) || mover.throwing == 1) )
|
||||
return 1
|
||||
else if(ismob(mover) && allowed(mover))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
|
||||
@@ -125,13 +125,13 @@
|
||||
to_chat(usr, "This robot has had its disabler removed!")
|
||||
return 0
|
||||
|
||||
if(T.recharge_time <= 2)
|
||||
if(T.charge_delay <= 2)
|
||||
to_chat(R, "Maximum cooling achieved for this hardpoint!")
|
||||
to_chat(usr, "There's no room for another cooling unit!")
|
||||
return 0
|
||||
|
||||
else
|
||||
T.recharge_time = max(2 , T.recharge_time - 4)
|
||||
T.charge_delay = max(2 , T.charge_delay - 4)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -214,4 +214,4 @@
|
||||
return 0
|
||||
|
||||
R.emagged = 1
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
bmark.pixel_x--
|
||||
bmark.pixel_y--
|
||||
|
||||
if(Proj.damage >= 20 || istype(Proj, /obj/item/projectile/practice))
|
||||
if(Proj.damage >= 20 || istype(Proj, /obj/item/projectile/beam/practice))
|
||||
bmark.icon_state = "scorch"
|
||||
bmark.dir = pick(NORTH,SOUTH,EAST,WEST) // random scorch design
|
||||
|
||||
@@ -178,4 +178,4 @@
|
||||
b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4)
|
||||
b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4)
|
||||
|
||||
Target.bulletholes.Add(src)
|
||||
Target.bulletholes.Add(src)
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
return
|
||||
to_chat(usr, "\blue Assembling grille...")
|
||||
|
||||
if (!do_after(usr, 10, target = src))
|
||||
if (!do_after(usr, 10, target = user))
|
||||
return
|
||||
|
||||
var /obj/structure/grille/F = new /obj/structure/grille/ ( usr.loc )
|
||||
|
||||
@@ -140,7 +140,6 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \
|
||||
new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("bookcase", /obj/structure/bookcase, 5, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40), \
|
||||
new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0), \
|
||||
new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("easel", /obj/structure/easel, 3, one_per_turf = 1, on_floor = 1), \
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
return
|
||||
if (R.time)
|
||||
to_chat(usr, "\blue Building [R.title] ...")
|
||||
if (!do_after(usr, R.time, target = src))
|
||||
if (!do_after(usr, R.time, target = usr))
|
||||
return
|
||||
if (src.amount < R.req_amount*multiplier)
|
||||
return
|
||||
@@ -194,20 +194,24 @@
|
||||
/obj/item/stack/proc/get_max_amount()
|
||||
return max_amount
|
||||
|
||||
/obj/item/stack/proc/split(mob/user, amt)
|
||||
var/obj/item/stack/F = new type(user, amt)
|
||||
F.copy_evidences(src)
|
||||
if(isliving(user))
|
||||
add_fingerprint(user)
|
||||
F.add_fingerprint(user)
|
||||
use(amt)
|
||||
return F
|
||||
|
||||
/obj/item/stack/attack_hand(mob/user as mob)
|
||||
if (user.get_inactive_hand() == src)
|
||||
var/obj/item/stack/F = new src.type( user, 1)
|
||||
F.copy_evidences(src)
|
||||
var/obj/item/stack/F = split(user, 1)
|
||||
user.put_in_hands(F)
|
||||
src.add_fingerprint(user)
|
||||
F.add_fingerprint(user)
|
||||
use(1)
|
||||
if (src && usr.machine==src)
|
||||
spawn(0) src.interact(usr)
|
||||
if(src && usr.machine == src)
|
||||
spawn(0)
|
||||
interact(usr)
|
||||
else
|
||||
..()
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/stack/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
..()
|
||||
|
||||
@@ -1318,7 +1318,7 @@ obj/item/toy/cards/deck/syndicate/black
|
||||
/obj/item/toy/russian_revolver
|
||||
name = "russian revolver"
|
||||
desc = "for fun and games!"
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon = 'icons/obj/guns/projectile.dmi'
|
||||
icon_state = "detective_gold"
|
||||
item_state = "gun"
|
||||
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
|
||||
|
||||
@@ -107,6 +107,8 @@
|
||||
var/icon/side
|
||||
var/dat
|
||||
var/stamped = 0
|
||||
|
||||
var/obj/item/weapon/card/id/guest/guest_pass = null // Guest pass attached to the ID
|
||||
|
||||
/obj/item/weapon/card/id/New()
|
||||
..()
|
||||
@@ -120,6 +122,16 @@
|
||||
show(usr)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>It is too far away.</span>")
|
||||
if(guest_pass)
|
||||
to_chat(user, "<span class='notice'>There is a guest pass attached to this ID card</span>")
|
||||
if (world.time < guest_pass.expiration_time)
|
||||
to_chat(user, "<span class='notice'>It expires at [worldtime2text(guest_pass.expiration_time)].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>It expired at [worldtime2text(guest_pass.expiration_time)].</span>")
|
||||
to_chat(user, "<span class='notice'>It grants access to following areas:</span>")
|
||||
for (var/A in guest_pass.temp_access)
|
||||
to_chat(user, "<span class='notice'>[get_access_desc(A)].</span>")
|
||||
to_chat(user, "<span class='notice'>Issuing reason: [guest_pass.reason].</span>")
|
||||
|
||||
/obj/item/weapon/card/id/proc/show(mob/user as mob)
|
||||
var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper)
|
||||
@@ -170,7 +182,9 @@
|
||||
<img src=side.png height=80 width=80 border=4></td></tr></table>"
|
||||
|
||||
/obj/item/weapon/card/id/GetAccess()
|
||||
return access
|
||||
if(!guest_pass)
|
||||
return access
|
||||
return access | guest_pass.GetAccess()
|
||||
|
||||
/obj/item/weapon/card/id/GetID()
|
||||
return src
|
||||
@@ -204,9 +218,42 @@
|
||||
if(!stamped)
|
||||
dat+="<img src=large_[W.icon_state].png>"
|
||||
stamped = 1
|
||||
to_chat(usr, "You stamp the ID card!")
|
||||
to_chat(user, "You stamp the ID card!")
|
||||
else
|
||||
to_chat(usr, "This ID has already been stamped!")
|
||||
to_chat(user, "This ID has already been stamped!")
|
||||
|
||||
else if(istype(W, /obj/item/weapon/card/id/guest))
|
||||
if(istype(src, /obj/item/weapon/card/id/guest))
|
||||
return
|
||||
var/obj/item/weapon/card/id/guest/G = W
|
||||
if(world.time > G.expiration_time)
|
||||
to_chat(user, "There's no point, the guest pass has expired.")
|
||||
return
|
||||
if(guest_pass)
|
||||
to_chat(user, "There's already a guest pass attached to this ID.")
|
||||
return
|
||||
if(G.registered_name != registered_name && G.registered_name != "NOT SPECIFIED")
|
||||
to_chat(user, "The guest pass cannot be attached to this ID")
|
||||
return
|
||||
if(!user.unEquip(G))
|
||||
return
|
||||
G.loc = src
|
||||
guest_pass = G
|
||||
|
||||
/obj/item/weapon/card/id/verb/remove_guest_pass()
|
||||
set name = "Remove Guest Pass"
|
||||
set category = "Object"
|
||||
set src in range(0)
|
||||
|
||||
if(usr.stat || !usr.canmove || usr.restrained())
|
||||
return
|
||||
|
||||
if(guest_pass)
|
||||
to_chat(usr, "<span class='notice'>You remove the guest pass from this ID.</span>")
|
||||
guest_pass.forceMove(get_turf(src))
|
||||
guest_pass = null
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>There is no guest pass attached to this ID</span>")
|
||||
|
||||
/obj/item/weapon/card/id/silver
|
||||
name = "identification card"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -368,8 +368,26 @@
|
||||
update_icon()
|
||||
return
|
||||
if(H.heart_attack)
|
||||
H.heart_attack = 0
|
||||
if(H.stat == 2)
|
||||
if(!H.get_int_organ(/obj/item/organ/internal/heart) && !H.get_int_organ(/obj/item/organ/internal/brain/slime)) //prevents defibing someone still alive suffering from a heart attack attack if they lack a heart
|
||||
user.visible_message("<span class='boldnotice'>[defib] buzzes: Resuscitation failed - Failed to pick up any heart electrical activity.</span>")
|
||||
playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
|
||||
busy = 0
|
||||
update_icon()
|
||||
return
|
||||
else
|
||||
H.heart_attack = 0
|
||||
user.visible_message("<span class='boldnotice'>[defib] pings: Cardiac arrhythmia corrected.</span>")
|
||||
M.visible_message("<span class='warning'>[M]'s body convulses a bit.")
|
||||
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
|
||||
playsound(get_turf(src), "bodyfall", 50, 1)
|
||||
playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0)
|
||||
defib.deductcharge(revivecost)
|
||||
busy = 0
|
||||
cooldown = 1
|
||||
update_icon()
|
||||
defib.cooldowncheck(user)
|
||||
return
|
||||
if(H.stat == DEAD)
|
||||
var/health = H.health
|
||||
M.visible_message("<span class='warning'>[M]'s body convulses a bit.")
|
||||
playsound(get_turf(src), "bodyfall", 50, 1)
|
||||
@@ -377,7 +395,7 @@
|
||||
for(var/obj/item/organ/external/O in H.organs)
|
||||
total_brute += O.brute_dam
|
||||
total_burn += O.burn_dam
|
||||
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations))
|
||||
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations) && (H.get_int_organ(/obj/item/organ/internal/heart) || H.get_int_organ(/obj/item/organ/internal/brain/slime)))
|
||||
tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you
|
||||
tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived
|
||||
H.adjustOxyLoss(tobehealed)
|
||||
|
||||
@@ -0,0 +1,456 @@
|
||||
/obj/item/weapon/nullrod
|
||||
name = "null rod"
|
||||
desc = "A rod of pure obsidian, its very presence disrupts and dampens the powers of Nar-Sie's followers."
|
||||
icon_state = "nullrod"
|
||||
item_state = "nullrod"
|
||||
force = 18
|
||||
throw_speed = 3
|
||||
throw_range = 4
|
||||
throwforce = 10
|
||||
w_class = 1
|
||||
var/reskinned = FALSE
|
||||
var/list/fluff_transformations = list() //does it have any special transformations only accessible to it? Should only be subtypes of /obj/item/weapon/nullrod
|
||||
|
||||
/obj/item/weapon/nullrod/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is killing \himself with \the [src.name]! It looks like \he's trying to get closer to god!</span>")
|
||||
return (BRUTELOSS|FIRELOSS)
|
||||
|
||||
/obj/item/weapon/nullrod/attack(mob/M, mob/living/carbon/user)
|
||||
..()
|
||||
if(M.mind)
|
||||
if(M.mind.vampire)
|
||||
if(ishuman(M))
|
||||
if(!M.mind.vampire.get_ability(/datum/vampire_passive/full))
|
||||
to_chat(M, "<span class='warning'>The nullrod's power interferes with your own!</span>")
|
||||
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
|
||||
|
||||
/obj/item/weapon/nullrod/attack_self(mob/user)
|
||||
if(reskinned)
|
||||
return
|
||||
if(user.mind && (user.mind.assigned_role == "Chaplain"))
|
||||
reskin_holy_weapon(user)
|
||||
|
||||
/obj/item/weapon/nullrod/proc/reskin_holy_weapon(mob/M)
|
||||
var/list/holy_weapons_list = typesof(/obj/item/weapon/nullrod) - typesof(/obj/item/weapon/nullrod/fluff)
|
||||
if(fluff_transformations.len)
|
||||
for(var/thing in fluff_transformations)
|
||||
holy_weapons_list += thing
|
||||
var/list/display_names = list()
|
||||
for(var/V in holy_weapons_list)
|
||||
var/atom/A = V
|
||||
display_names += initial(A.name)
|
||||
|
||||
var/choice = input(M,"What theme would you like for your holy weapon?","Holy Weapon Theme") as null|anything in display_names
|
||||
if(!src || !choice || !in_range(M, src) || M.incapacitated() || reskinned)
|
||||
return
|
||||
|
||||
var/index = display_names.Find(choice)
|
||||
var/A = holy_weapons_list[index]
|
||||
|
||||
var/obj/item/weapon/nullrod/holy_weapon = new A
|
||||
|
||||
feedback_set_details("chaplain_weapon","[choice]")
|
||||
|
||||
if(holy_weapon)
|
||||
holy_weapon.reskinned = TRUE
|
||||
M.unEquip(src)
|
||||
M.put_in_active_hand(holy_weapon)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/nullrod/godhand
|
||||
icon_state = "disintegrate"
|
||||
item_state = "disintegrate"
|
||||
name = "god hand"
|
||||
desc = "This hand of yours glows with an awesome power!"
|
||||
flags = ABSTRACT | NODROP
|
||||
w_class = 5
|
||||
hitsound = 'sound/weapons/sear.ogg'
|
||||
damtype = BURN
|
||||
attack_verb = list("punched", "cross countered", "pummeled")
|
||||
|
||||
/obj/item/weapon/nullrod/staff
|
||||
icon_state = "godstaff-red"
|
||||
item_state = "godstaff-red"
|
||||
name = "red holy staff"
|
||||
desc = "It has a mysterious, protective aura."
|
||||
w_class = 5
|
||||
force = 5
|
||||
slot_flags = SLOT_BACK
|
||||
|
||||
/obj/item/weapon/nullrod/staff/IsShield()
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/nullrod/staff/blue
|
||||
name = "blue holy staff"
|
||||
icon_state = "godstaff-blue"
|
||||
item_state = "godstaff-blue"
|
||||
|
||||
/obj/item/weapon/nullrod/claymore
|
||||
icon_state = "claymore"
|
||||
item_state = "claymore"
|
||||
name = "holy claymore"
|
||||
desc = "A weapon fit for a crusade!"
|
||||
w_class = 4
|
||||
slot_flags = SLOT_BACK|SLOT_BELT
|
||||
sharp = 1
|
||||
edge = 1
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
/obj/item/weapon/nullrod/claymore/IsShield()
|
||||
if(prob(30))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/nullrod/claymore/darkblade
|
||||
icon_state = "cultblade"
|
||||
item_state = "cultblade"
|
||||
name = "dark blade"
|
||||
desc = "Spread the glory of the dark gods!"
|
||||
slot_flags = SLOT_BELT
|
||||
hitsound = 'sound/hallucinations/growl1.ogg'
|
||||
|
||||
/obj/item/weapon/nullrod/claymore/chainsaw_sword
|
||||
icon_state = "chainswordon"
|
||||
item_state = "chainswordon"
|
||||
name = "sacred chainsaw sword"
|
||||
desc = "Suffer not a heretic to live."
|
||||
slot_flags = SLOT_BELT
|
||||
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
|
||||
hitsound = 'sound/weapons/chainsaw.ogg'
|
||||
|
||||
/obj/item/weapon/nullrod/claymore/glowing
|
||||
icon_state = "swordon"
|
||||
item_state = "swordon"
|
||||
name = "force weapon"
|
||||
desc = "The blade glows with the power of faith. Or possibly a battery."
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
/obj/item/weapon/nullrod/claymore/katana
|
||||
name = "hanzo steel"
|
||||
desc = "Capable of cutting clean through a holy claymore."
|
||||
icon_state = "katana"
|
||||
item_state = "katana"
|
||||
slot_flags = SLOT_BELT | SLOT_BACK
|
||||
|
||||
/obj/item/weapon/nullrod/claymore/multiverse
|
||||
name = "extradimensional blade"
|
||||
desc = "Once the harbringer of a interdimensional war, now a dormant souvenir. Still sharp though."
|
||||
icon_state = "multiverse"
|
||||
item_state = "multiverse"
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
/obj/item/weapon/nullrod/claymore/saber
|
||||
name = "light energy sword"
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
icon_state = "swordblue"
|
||||
item_state = "swordblue"
|
||||
desc = "If you strike me down, I shall become more robust than you can possibly imagine."
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
/obj/item/weapon/nullrod/claymore/saber/red
|
||||
name = "dark energy sword"
|
||||
icon_state = "swordred"
|
||||
item_state = "swordred"
|
||||
desc = "Woefully ineffective when used on steep terrain."
|
||||
|
||||
/obj/item/weapon/nullrod/claymore/saber/pirate
|
||||
name = "nautical energy sword"
|
||||
icon_state = "cutlass1"
|
||||
item_state = "cutlass1"
|
||||
desc = "Convincing HR that your religion involved piracy was no mean feat."
|
||||
|
||||
/obj/item/weapon/nullrod/sord
|
||||
name = "\improper UNREAL SORD"
|
||||
desc = "This thing is so unspeakably HOLY you are having a hard time even holding it."
|
||||
icon_state = "sord"
|
||||
item_state = "sord"
|
||||
slot_flags = SLOT_BELT
|
||||
force = 4.13
|
||||
throwforce = 1
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
/obj/item/weapon/nullrod/scythe
|
||||
icon_state = "scythe0"
|
||||
item_state = "scythe0"
|
||||
name = "reaper scythe"
|
||||
desc = "Ask not for whom the bell tolls..."
|
||||
w_class = 4
|
||||
armour_penetration = 35
|
||||
slot_flags = SLOT_BACK
|
||||
sharp = 1
|
||||
edge = 1
|
||||
attack_verb = list("chopped", "sliced", "cut", "reaped")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/obj/item/weapon/nullrod/scythe/vibro
|
||||
icon_state = "hfrequency0"
|
||||
item_state = "hfrequency1"
|
||||
name = "high frequency blade"
|
||||
desc = "Bad references are the DNA of the soul."
|
||||
attack_verb = list("chopped", "sliced", "cut", "zandatsu'd")
|
||||
|
||||
/obj/item/weapon/nullrod/scythe/talking
|
||||
icon_state = "talking_sword"
|
||||
item_state = "talking_sword"
|
||||
name = "possessed blade"
|
||||
desc = "When the station falls into chaos, it's nice to have a friend by your side."
|
||||
attack_verb = list("chopped", "sliced", "cut")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
var/possessed = FALSE
|
||||
|
||||
/obj/item/weapon/nullrod/scythe/talking/attack_self(mob/living/user)
|
||||
if(possessed)
|
||||
return
|
||||
|
||||
to_chat(user, "You attempt to wake the spirit of the blade...")
|
||||
|
||||
possessed = TRUE
|
||||
|
||||
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the spirit of [user.real_name]'s blade?", ROLE_PAI, 0, 100)
|
||||
var/mob/dead/observer/theghost = null
|
||||
|
||||
if(candidates.len)
|
||||
theghost = pick(candidates)
|
||||
var/mob/living/simple_animal/shade/S = new(src)
|
||||
S.real_name = name
|
||||
S.name = name
|
||||
S.ckey = theghost.ckey
|
||||
var/input = stripped_input(S,"What are you named?", ,"", MAX_NAME_LEN)
|
||||
|
||||
if(src && input)
|
||||
name = input
|
||||
S.real_name = input
|
||||
S.name = input
|
||||
else
|
||||
to_chat(user, "The blade is dormant. Maybe you can try again later.")
|
||||
possessed = FALSE
|
||||
|
||||
/obj/item/weapon/nullrod/scythe/talking/Destroy()
|
||||
for(var/mob/living/simple_animal/shade/S in contents)
|
||||
to_chat(S, "You were destroyed!")
|
||||
S.ghostize()
|
||||
qdel(S)
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/nullrod/hammmer
|
||||
icon_state = "hammeron"
|
||||
item_state = "hammeron"
|
||||
name = "relic war hammer"
|
||||
desc = "This war hammer cost the chaplain fourty thousand space dollars."
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = 5
|
||||
attack_verb = list("smashed", "bashed", "hammered", "crunched")
|
||||
|
||||
/obj/item/weapon/nullrod/chainsaw
|
||||
name = "chainsaw hand"
|
||||
desc = "Good? Bad? You're the guy with the chainsaw hand."
|
||||
icon_state = "chainsaw1"
|
||||
item_state = "mounted_chainsaw"
|
||||
w_class = 5
|
||||
flags = NODROP | ABSTRACT
|
||||
sharp = 1
|
||||
edge = 1
|
||||
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
|
||||
hitsound = 'sound/weapons/chainsaw.ogg'
|
||||
|
||||
/obj/item/weapon/nullrod/clown
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "clownrender"
|
||||
item_state = "gold_horn"
|
||||
name = "clown dagger"
|
||||
desc = "Used for absolutely hilarious sacrifices."
|
||||
hitsound = 'sound/items/bikehorn.ogg'
|
||||
sharp = 1
|
||||
edge = 1
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut", "honked")
|
||||
|
||||
/obj/item/weapon/nullrod/whip
|
||||
name = "holy whip"
|
||||
desc = "What a terrible night to be on Space Station 13."
|
||||
icon_state = "chain"
|
||||
item_state = "chain"
|
||||
slot_flags = SLOT_BELT
|
||||
attack_verb = list("whipped", "lashed")
|
||||
hitsound = 'sound/weapons/slash.ogg'
|
||||
|
||||
/obj/item/weapon/nullrod/whip/afterattack(atom/movable/AM, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
if(istype(AM, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
if(is_shadow(H))
|
||||
var/phrase = pick("Die monster! You don't belong in this world!!!", "You steal men's souls and make them your slaves!!!", "Your words are as empty as your soul!!!", "Mankind ill needs a savior such as you!!!")
|
||||
user.say("[phrase]")
|
||||
H.adjustBruteLoss(8) //Bonus damage
|
||||
|
||||
/obj/item/weapon/nullrod/fedora
|
||||
name = "athiest's fedora"
|
||||
desc = "The brim of the hat is as sharp as your wit. Throwing it at someone would hurt almost as much as disproving the existence of God."
|
||||
icon_state = "fedora"
|
||||
item_state = "fedora"
|
||||
slot_flags = SLOT_HEAD
|
||||
icon = 'icons/obj/clothing/hats.dmi'
|
||||
force = 0
|
||||
throw_speed = 4
|
||||
throw_range = 7
|
||||
throwforce = 20
|
||||
|
||||
/obj/item/weapon/nullrod/armblade
|
||||
name = "dark blessing"
|
||||
desc = "Particularly twisted deities grant gifts of dubious value."
|
||||
icon_state = "arm_blade"
|
||||
item_state = "arm_blade"
|
||||
flags = ABSTRACT | NODROP
|
||||
w_class = 5
|
||||
sharp = 1
|
||||
edge = 1
|
||||
|
||||
/obj/item/weapon/nullrod/carp
|
||||
name = "carp-sie plushie"
|
||||
desc = "An adorable stuffed toy that resembles the god of all carp. The teeth look pretty sharp. Activate it to recieve the blessing of Carp-Sie."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "carpplushie"
|
||||
item_state = "carp_plushie"
|
||||
force = 15
|
||||
attack_verb = list("bitten", "eaten", "fin slapped")
|
||||
hitsound = 'sound/weapons/bite.ogg'
|
||||
var/used_blessing = FALSE
|
||||
|
||||
/obj/item/weapon/nullrod/carp/attack_self(mob/living/user)
|
||||
if(used_blessing)
|
||||
return
|
||||
if(user.mind && (user.mind.assigned_role != "Chaplain"))
|
||||
return
|
||||
to_chat(user, "You are blessed by Carp-Sie. Wild space carp will no longer attack you.")
|
||||
user.faction |= "carp"
|
||||
used_blessing = TRUE
|
||||
|
||||
/obj/item/weapon/nullrod/claymore/bostaff //May as well make it a "claymore" and inherit the blocking
|
||||
name = "monk's staff"
|
||||
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts, now used to harass the clown."
|
||||
w_class = 4
|
||||
force = 15
|
||||
slot_flags = SLOT_BACK
|
||||
sharp = 0
|
||||
edge = 0
|
||||
hitsound = "swing_hit"
|
||||
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "bostaff0"
|
||||
item_state = "bostaff0"
|
||||
|
||||
/obj/item/weapon/nullrod/claymore/bostaff/IsShield()
|
||||
if(prob(40))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/nullrod/tribal_knife
|
||||
icon_state = "crysknife"
|
||||
item_state = "crysknife"
|
||||
name = "arrhythmic knife"
|
||||
w_class = 5
|
||||
desc = "They say fear is the true mind killer, but stabbing them in the head works too. Honour compels you to not sheathe it once drawn."
|
||||
sharp = 1
|
||||
edge = 1
|
||||
slot_flags = null
|
||||
flags = HANDSLOW
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
/obj/item/weapon/nullrod/tribal_knife/New()
|
||||
..()
|
||||
processing_objects.Add(src)
|
||||
|
||||
/obj/item/weapon/nullrod/tribal_knife/Destroy()
|
||||
processing_objects.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/nullrod/tribal_knife/process()
|
||||
slowdown = rand(-2, 2)
|
||||
|
||||
/obj/item/weapon/nullrod/pitchfork
|
||||
icon_state = "pitchfork0"
|
||||
item_state = "pitchfork0"
|
||||
name = "unholy pitchfork"
|
||||
w_class = 3
|
||||
desc = "Holding this makes you look absolutely devilish."
|
||||
attack_verb = list("poked", "impaled", "pierced", "jabbed")
|
||||
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(praying)
|
||||
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>")
|
||||
|
||||
praying = 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
|
||||
|
||||
@@ -56,11 +56,11 @@
|
||||
ticker.mode.traitors += H.mind
|
||||
H.mind.special_role = "traitor"
|
||||
to_chat(H, "<span class='warning'><B>You're now completely loyal to [user.name]!</B> You now must lay down your life to protect them and assist in their goals at any cost.</span>")
|
||||
var/datum/objective/protect/p = new
|
||||
p.owner = H.mind
|
||||
p.target = user:mind
|
||||
p.explanation_text = "Obey every order from and protect [user:real_name], the [user:mind:assigned_role=="MODE" ? (user:mind:special_role) : (user:mind:assigned_role)]."
|
||||
H.mind.objectives += p
|
||||
var/datum/objective/protect/mindslave/MS = new
|
||||
MS.owner = H.mind
|
||||
MS.target = user:mind
|
||||
MS.explanation_text = "Obey every order from and protect [user:real_name], the [user:mind:assigned_role=="MODE" ? (user:mind:special_role) : (user:mind:assigned_role)]."
|
||||
H.mind.objectives += MS
|
||||
for(var/datum/objective/objective in H.mind.objectives)
|
||||
to_chat(H, "<B>Objective #1</B>: [objective.explanation_text]")
|
||||
|
||||
@@ -71,10 +71,16 @@
|
||||
var/datum/mindslaves/slaved = user.mind.som
|
||||
H.mind.som = slaved
|
||||
slaved.serv += H
|
||||
slaved.add_serv_hud(user.mind,"syndicate")//handles master servent icons
|
||||
slaved.add_serv_hud(H.mind,"mindslave")
|
||||
slaved.add_serv_hud(user.mind, "master") //handles master servent icons
|
||||
slaved.add_serv_hud(H.mind, "mindslave")
|
||||
|
||||
log_admin("[ckey(user.key)] has mind-slaved [ckey(H.key)].")
|
||||
activated = 1
|
||||
return 1
|
||||
return 0
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/implant/traitor/removed(mob/target)
|
||||
if(..())
|
||||
ticker.mode.remove_traitor_mind(target.mind)
|
||||
return 1
|
||||
return 0
|
||||
@@ -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()
|
||||
|
||||
@@ -35,6 +44,7 @@
|
||||
desc = "Can hold various tools."
|
||||
icon_state = "utilitybelt"
|
||||
item_state = "utility"
|
||||
use_item_overlays = 1
|
||||
can_hold = list(
|
||||
"/obj/item/weapon/crowbar",
|
||||
"/obj/item/weapon/screwdriver",
|
||||
@@ -81,6 +91,7 @@
|
||||
desc = "Can hold various medical equipment."
|
||||
icon_state = "medicalbelt"
|
||||
item_state = "medical"
|
||||
use_item_overlays = 1
|
||||
can_hold = list(
|
||||
"/obj/item/device/healthanalyzer",
|
||||
"/obj/item/weapon/dnainjector",
|
||||
@@ -120,6 +131,7 @@
|
||||
desc = "Can hold various botanical supplies."
|
||||
icon_state = "botanybelt"
|
||||
item_state = "botany"
|
||||
use_item_overlays = 1
|
||||
can_hold = list(
|
||||
"/obj/item/device/analyzer/plant_analyzer",
|
||||
"/obj/item/weapon/minihoe",
|
||||
@@ -127,8 +139,8 @@
|
||||
"/obj/item/weapon/reagent_containers/glass/fertilizer",
|
||||
"/obj/item/weapon/reagent_containers/glass/bottle",
|
||||
"/obj/item/weapon/plantspray",
|
||||
"/obj/item/weapon/reagent_containers/syringe",
|
||||
"/obj/item/weapon/reagent_containers/glass/beaker",
|
||||
// "/obj/item/weapon/reagent_containers/syringe",
|
||||
// "/obj/item/weapon/reagent_containers/glass/beaker",
|
||||
"/obj/item/weapon/lighter/zippo",
|
||||
"/obj/item/weapon/storage/fancy/cigarettes",
|
||||
"obj/item/weapon/rollingpaperpack",
|
||||
@@ -148,6 +160,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",
|
||||
@@ -185,6 +198,7 @@
|
||||
icon_state = "soulstonebelt"
|
||||
item_state = "soulstonebelt"
|
||||
storage_slots = 6
|
||||
use_item_overlays = 1
|
||||
can_hold = list(
|
||||
"/obj/item/device/soulstone"
|
||||
)
|
||||
@@ -230,6 +244,7 @@
|
||||
item_state = "janibelt"
|
||||
storage_slots = 6
|
||||
max_w_class = 4 // Set to this so the light replacer can fit.
|
||||
use_item_overlays = 1
|
||||
can_hold = list(
|
||||
"/obj/item/weapon/grenade/chem_grenade/cleaner",
|
||||
"/obj/item/device/lightreplacer",
|
||||
@@ -300,6 +315,21 @@
|
||||
new /obj/item/ammo_casing/shotgun/beanbag(src)
|
||||
new /obj/item/ammo_casing/shotgun/beanbag(src)
|
||||
|
||||
/obj/item/weapon/storage/belt/bandolier/update_icon()
|
||||
..()
|
||||
icon_state = "[initial(icon_state)]_[contents.len]"
|
||||
|
||||
/obj/item/weapon/storage/belt/bandolier/attackby(obj/item/W, mob/user)
|
||||
var/amount = contents.len
|
||||
. = ..()
|
||||
if(amount != contents.len)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/storage/belt/lazabandolierrus/remove_from_storage(obj/item/W as obj, atom/new_location)
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/weapon/storage/belt/holster
|
||||
name = "shoulder holster"
|
||||
desc = "A holster to conceal a carried handgun. WARNING: Badasses only."
|
||||
@@ -318,6 +348,7 @@
|
||||
icon_state = "soulstonebelt"
|
||||
item_state = "soulstonebelt"
|
||||
storage_slots = 6
|
||||
use_item_overlays = 1
|
||||
can_hold = list(
|
||||
"/obj/item/weapon/gun/magic/wand"
|
||||
)
|
||||
|
||||
@@ -222,6 +222,10 @@
|
||||
icon_state = "dualsaber0"
|
||||
|
||||
/obj/item/weapon/twohanded/dualsaber/attack(target as mob, mob/living/user as mob)
|
||||
if(HULK in user.mutations)
|
||||
to_chat(user, "<span class='warning'>You grip the blade too hard and accidentally close it!</span>")
|
||||
unwield()
|
||||
return
|
||||
..()
|
||||
if((CLUMSY in user.mutations) && (wielded) &&prob(40))
|
||||
to_chat(user, "\red You twirl around a bit before losing your balance and impaling yourself on the [src].")
|
||||
@@ -259,7 +263,10 @@
|
||||
if(wielded)
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/twohanded/dualsaber/wield()
|
||||
/obj/item/weapon/twohanded/dualsaber/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds.
|
||||
if(HULK in M.mutations)
|
||||
to_chat(M, "<span class='warning'>You lack the grace to wield this!</span>")
|
||||
return
|
||||
..()
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
|
||||
|
||||
@@ -15,75 +15,6 @@
|
||||
to_chat(viewers(user), "<span class='suicide'>[user] is hitting \himself with the [src.name]! It looks like \he's trying to ban \himself from life.</span>")
|
||||
return (BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS)
|
||||
|
||||
/obj/item/weapon/nullrod
|
||||
name = "null rod"
|
||||
desc = "A rod of pure obsidian, its very presence disrupts and dampens the powers of paranormal phenomenae."
|
||||
icon_state = "nullrod"
|
||||
item_state = "nullrod"
|
||||
slot_flags = SLOT_BELT
|
||||
force = 15
|
||||
throw_speed = 1
|
||||
throw_range = 4
|
||||
throwforce = 10
|
||||
w_class = 1
|
||||
var/transformed = 0
|
||||
var/transform_into = /obj/item/weapon/nullrod/sword
|
||||
var/transform_via = list(/obj/item/clothing/suit/armor/riot/knight/templar, /obj/item/clothing/suit/chaplain_hoodie/fluff/chronx)
|
||||
|
||||
suicide_act(mob/user)
|
||||
to_chat(viewers(user), "<span class='suicide'>[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide.</span>")
|
||||
return (BRUTELOSS|FIRELOSS)
|
||||
|
||||
/obj/item/weapon/nullrod/attack(mob/M as mob, mob/living/user as mob) //Paste from old-code to decult with a null rod.
|
||||
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been attacked with [src.name] by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to attack [M.name] ([M.ckey])</font>")
|
||||
|
||||
if(!iscarbon(user))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = user
|
||||
|
||||
msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(M)] with [src.name] (INTENT: [uppertext(user.a_intent)])")
|
||||
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
to_chat(user, "\red The rod slips out of your hand and hits your head.")
|
||||
user.take_organ_damage(10)
|
||||
user.Paralyse(20)
|
||||
return
|
||||
|
||||
if(M.mind)
|
||||
if(M.mind.vampire)
|
||||
if(ishuman(M))
|
||||
if(!M.mind.vampire.get_ability(/datum/vampire_passive/full))
|
||||
to_chat(M, "<span class='warning'>The nullrod's power interferes with your own!</span>")
|
||||
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/nullrod/afterattack(var/obj/item/I as obj, mob/user as mob, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
for(var/T in transform_via)
|
||||
if(istype(I, T)) //Only the Chaplain's holy armor is capable fo performing this feat.
|
||||
if(!transformed) // can't turn a sword into a sword.
|
||||
var/obj/item/S = new transform_into()
|
||||
to_chat(user, "<span class='notice'>You sheath the [src] into the [I]'s scabbard, transforming it into \a [S].</span>")
|
||||
user.unEquip(src)
|
||||
qdel(src)
|
||||
user.put_in_hands(S)
|
||||
break
|
||||
|
||||
/obj/item/weapon/nullrod/sword
|
||||
name = "holy sword"
|
||||
desc = "A sword imbued with holy power, its very presence disrupts and dampens the powers of paranormal phenomenae."
|
||||
icon_state = "claymore"
|
||||
item_state = "claymore"
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
w_class = 3 //transforming it is not without its downsides.
|
||||
sharp = 1
|
||||
edge = 1
|
||||
transformed = 1
|
||||
|
||||
/obj/item/weapon/sord
|
||||
name = "\improper SORD"
|
||||
desc = "This thing is so unspeakably shitty you are having a hard time even holding it."
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -208,7 +208,7 @@
|
||||
if(!G.confirm())
|
||||
return 0
|
||||
G.affecting.forceMove(get_turf(src))
|
||||
G.affecting.Weaken(5)
|
||||
G.affecting.Weaken(2)
|
||||
G.affecting.visible_message("<span class='danger'>[G.assailant] pushes [G.affecting] onto [src].</span>", \
|
||||
"<span class='userdanger'>[G.assailant] pushes [G.affecting] onto [src].</span>")
|
||||
add_logs(G.affecting, G.assailant, "pushed onto a table")
|
||||
@@ -448,8 +448,9 @@
|
||||
/obj/structure/table/glass/destroy(dirty)
|
||||
if(dirty)
|
||||
new /obj/item/weapon/shard(loc)
|
||||
new /obj/item/weapon/shard(loc)
|
||||
else
|
||||
new /obj/item/stack/sheet/glass(loc)
|
||||
new /obj/item/stack/sheet/glass(loc, 2)
|
||||
..()
|
||||
|
||||
/obj/structure/table/glass/tablepush(obj/item/I, mob/user)
|
||||
|
||||
@@ -382,7 +382,7 @@ var/send_emergency_team
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/ert/security(M), slot_wear_suit)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/advtaser(M), slot_s_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(M), slot_s_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/ert/security(M), slot_in_backpack)
|
||||
@@ -459,7 +459,7 @@ var/send_emergency_team
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/security(M), slot_wear_suit)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/advtaser(M), slot_s_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(M), slot_s_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/security(M), slot_in_backpack)
|
||||
@@ -532,7 +532,7 @@ var/send_emergency_team
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/device/t_scanner/extended_range(M), slot_l_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
|
||||
@@ -553,7 +553,7 @@ var/send_emergency_team
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/ionrifle/carbine(M), slot_in_backpack)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/carbine(M), slot_r_hand)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/carbine(M), slot_r_hand)
|
||||
|
||||
if("Medic")
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
|
||||
@@ -566,7 +566,7 @@ var/send_emergency_team
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/medical(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/surgery(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_l_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
|
||||
@@ -585,7 +585,7 @@ var/send_emergency_team
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/storage/lockbox/loyalty(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_in_backpack)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(M), slot_l_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
|
||||
@@ -610,4 +610,4 @@ var/send_emergency_team
|
||||
new /obj/item/device/radio/centcom( src )
|
||||
new /obj/item/weapon/reagent_containers/food/pill/salicylic( src )
|
||||
new /obj/item/weapon/reagent_containers/food/pill/patch/synthflesh( src )
|
||||
return
|
||||
return
|
||||
|
||||
+30
-14
@@ -9,8 +9,9 @@ var/list/jackboot_sound = list('sound/effects/jackboot1.ogg','sound/effects/jack
|
||||
var/list/swing_hit_sound = list('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg')
|
||||
var/list/hiss_sound = list('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg')
|
||||
var/list/page_sound = list('sound/effects/pageturn1.ogg', 'sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg')
|
||||
//var/list/gun_sound = list('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg')
|
||||
var/list/gun_sound = list('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg')
|
||||
var/list/computer_ambience = list('sound/goonstation/machines/ambicomp1.ogg', 'sound/goonstation/machines/ambicomp2.ogg', 'sound/goonstation/machines/ambicomp3.ogg')
|
||||
var/list/ricochet = list('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg','sound/weapons/effects/ric3.ogg','sound/weapons/effects/ric4.ogg','sound/weapons/effects/ric5.ogg')
|
||||
|
||||
/proc/playsound(var/atom/source, soundin, vol as num, vary, extrarange as num, falloff, var/is_global, var/pitch)
|
||||
|
||||
@@ -107,17 +108,32 @@ var/const/FALLOFF_SOUNDS = 0.5
|
||||
/proc/get_sfx(soundin)
|
||||
if(istext(soundin))
|
||||
switch(soundin)
|
||||
if ("shatter") soundin = pick(shatter_sound)
|
||||
if ("explosion") soundin = pick(explosion_sound)
|
||||
if ("sparks") soundin = pick(spark_sound)
|
||||
if ("rustle") soundin = pick(rustle_sound)
|
||||
if ("bodyfall") soundin = pick(bodyfall_sound)
|
||||
if ("punch") soundin = pick(punch_sound)
|
||||
if ("clownstep") soundin = pick(clown_sound)
|
||||
if ("jackboot") soundin = pick(jackboot_sound)
|
||||
if ("swing_hit") soundin = pick(swing_hit_sound)
|
||||
if ("hiss") soundin = pick(hiss_sound)
|
||||
if ("pageturn") soundin = pick(page_sound)
|
||||
//if ("gunshot") soundin = pick(gun_sound)
|
||||
if("computer_ambience") soundin = pick(computer_ambience)
|
||||
if ("shatter")
|
||||
soundin = pick(shatter_sound)
|
||||
if ("explosion")
|
||||
soundin = pick(explosion_sound)
|
||||
if ("sparks")
|
||||
soundin = pick(spark_sound)
|
||||
if ("rustle")
|
||||
soundin = pick(rustle_sound)
|
||||
if ("bodyfall")
|
||||
soundin = pick(bodyfall_sound)
|
||||
if ("punch")
|
||||
soundin = pick(punch_sound)
|
||||
if ("clownstep")
|
||||
soundin = pick(clown_sound)
|
||||
if ("jackboot")
|
||||
soundin = pick(jackboot_sound)
|
||||
if ("swing_hit")
|
||||
soundin = pick(swing_hit_sound)
|
||||
if ("hiss")
|
||||
soundin = pick(hiss_sound)
|
||||
if ("pageturn")
|
||||
soundin = pick(page_sound)
|
||||
if ("gunshot")
|
||||
soundin = pick(gun_sound)
|
||||
if("computer_ambience")
|
||||
soundin = pick(computer_ambience)
|
||||
if("ricochet")
|
||||
soundin = pick(ricochet)
|
||||
return soundin
|
||||
|
||||
@@ -125,6 +125,7 @@ var/list/admin_verbs_server = list(
|
||||
/datum/admins/proc/toggleAI,
|
||||
/client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
|
||||
/client/proc/cmd_debug_del_all,
|
||||
/client/proc/cmd_debug_del_sing,
|
||||
/datum/admins/proc/toggle_aliens,
|
||||
/client/proc/delbook,
|
||||
/client/proc/view_flagged_books,
|
||||
@@ -141,6 +142,7 @@ var/list/admin_verbs_debug = list(
|
||||
/client/proc/cmd_debug_mob_lists,
|
||||
/client/proc/cmd_admin_delete,
|
||||
/client/proc/cmd_debug_del_all,
|
||||
/client/proc/cmd_debug_del_sing,
|
||||
/client/proc/reload_admins,
|
||||
/client/proc/restart_controller,
|
||||
/client/proc/enable_debug_verbs,
|
||||
@@ -945,15 +947,15 @@ var/list/admin_verbs_snpc = list(
|
||||
|
||||
verbs += admin_verbs_snpc
|
||||
verbs -= /client/proc/show_snpc_verbs
|
||||
to_chat(src, "<span class='interface'>SNPC verbs on.</span>")
|
||||
|
||||
/client/proc/hide_snpc_verbs()
|
||||
set name = "Hide SNPC Verbs"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder)
|
||||
return
|
||||
|
||||
verbs -= admin_verbs_snpc
|
||||
verbs += /client/proc/show_snpc_verbs
|
||||
to_chat(src, "<span class='interface'>SNPC verbs off.</span>")
|
||||
to_chat(src, "<span class='interface'>SNPC verbs on.</span>")
|
||||
|
||||
/client/proc/hide_snpc_verbs()
|
||||
set name = "Hide SNPC Verbs"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder)
|
||||
return
|
||||
|
||||
verbs -= admin_verbs_snpc
|
||||
verbs += /client/proc/show_snpc_verbs
|
||||
to_chat(src, "<span class='interface'>SNPC verbs off.</span>")
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -359,6 +359,27 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
message_admins("[key_name_admin(src)] has deleted all instances of [hsbitem].", 0)
|
||||
feedback_add_details("admin_verb","DELA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/cmd_debug_del_sing()
|
||||
set category = "Debug"
|
||||
set name = "Del Singulo / Tesla"
|
||||
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
|
||||
//This gets a confirmation check because it's way easier to accidentally hit this and delete things than it is with del-all
|
||||
var/confirm = alert("This will delete ALL Singularities and Tesla orbs except for any that are on away mission z-levels or the centcomm z-level. Are you sure you want to delete them?", "Confirm Panic Button", "Yes", "No")
|
||||
if(confirm != "Yes")
|
||||
return
|
||||
|
||||
for(var/I in singularities)
|
||||
var/obj/singularity/S = I
|
||||
if(S.z == ZLEVEL_CENTCOMM || S.z >= MAX_Z)
|
||||
continue
|
||||
qdel(S)
|
||||
log_admin("[key_name(src)] has deleted all Singularities and Tesla orbs.")
|
||||
message_admins("[key_name_admin(src)] has deleted all Singularities and Tesla orbs.", 0)
|
||||
feedback_add_details("admin_verb","DELS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/cmd_debug_make_powernets()
|
||||
set category = "Debug"
|
||||
set name = "Make Powernets"
|
||||
@@ -669,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)
|
||||
|
||||
@@ -860,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)"
|
||||
@@ -883,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)"
|
||||
@@ -946,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)
|
||||
|
||||
@@ -975,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)
|
||||
@@ -1212,4 +1233,4 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
assets.register()
|
||||
|
||||
// Clear the user's cache so they get resent.
|
||||
usr.client.cache = list()
|
||||
usr.client.cache = list()
|
||||
|
||||
@@ -121,7 +121,7 @@ var/global/sent_honksquad = 0
|
||||
if(prob(50))
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/energy/clown(src), slot_in_backpack)
|
||||
else
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/grenadelauncher/piecannon(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/throw/piecannon(src), slot_in_backpack)
|
||||
src.mutations.Add(CLUMSY)
|
||||
|
||||
|
||||
@@ -134,4 +134,4 @@ var/global/sent_honksquad = 0
|
||||
W.registered_name = real_name
|
||||
equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
alert("The game hasn't started yet!")
|
||||
return
|
||||
|
||||
var/list/incompatible_species = list("Plasmaman")
|
||||
var/list/incompatible_species = list("Plasmaman", "Vox")
|
||||
for(var/mob/living/carbon/human/H in player_list)
|
||||
if(H.stat == DEAD || !(H.client))
|
||||
continue
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
alert("The game hasn't started yet!")
|
||||
return
|
||||
|
||||
var/list/incompatible_species = list("Plasmaman")
|
||||
var/list/incompatible_species = list("Plasmaman", "Vox")
|
||||
var/team_toggle = 0
|
||||
for(var/mob/living/carbon/human/H in player_list)
|
||||
if(H.stat == DEAD || !(H.client))
|
||||
continue
|
||||
@@ -27,7 +28,7 @@
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/beach_ball/dodgeball(H), slot_r_hand)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
|
||||
|
||||
if(prob(50))
|
||||
if(!team_toggle)
|
||||
team_alpha += H
|
||||
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/red/dodgeball(H), slot_w_uniform)
|
||||
@@ -53,6 +54,7 @@
|
||||
W.registered_name = H.real_name
|
||||
H.equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
team_toggle = !team_toggle
|
||||
H.species.equip(H)
|
||||
H.regenerate_icons()
|
||||
|
||||
|
||||
@@ -154,7 +154,7 @@ var/global/sent_strike_team = 0
|
||||
equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(src), slot_belt)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(src), slot_r_hand)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse(src), slot_r_hand)
|
||||
|
||||
|
||||
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(src)//Here you go Deuryn
|
||||
@@ -170,4 +170,4 @@ var/global/sent_strike_team = 0
|
||||
W.registered_name = real_name
|
||||
equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -144,7 +144,7 @@ var/global/sent_syndicate_strike_team = 0
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(src), slot_back)
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m762, slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/mm556x45)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m45(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_in_backpack)
|
||||
@@ -160,7 +160,7 @@ var/global/sent_syndicate_strike_team = 0
|
||||
equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(src), slot_l_store)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/grenade/empgrenade(src), slot_r_store)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol/m2411(src), slot_belt)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol/m1911(src), slot_belt)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/l6_saw(src), slot_r_hand)
|
||||
|
||||
@@ -173,4 +173,4 @@ var/global/sent_syndicate_strike_team = 0
|
||||
W.registered_name = real_name
|
||||
equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -18,7 +18,7 @@ var/global/vox_tick = 1
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
|
||||
equip_to_slot_or_del(new /obj/item/device/chameleon(src), slot_l_store)
|
||||
|
||||
var/obj/item/weapon/gun/launcher/spikethrower/W = new(src)
|
||||
var/obj/item/weapon/gun/projectile/automatic/spikethrower/W = new(src)
|
||||
equip_to_slot_or_del(W, slot_r_hand)
|
||||
|
||||
|
||||
@@ -77,4 +77,4 @@ var/global/vox_tick = 1
|
||||
vox_tick++
|
||||
if (vox_tick > 4) vox_tick = 1
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
var/status = 0 //0 - not readied //1 - bomb finished with welder
|
||||
var/obj/item/device/assembly_holder/bombassembly = null //The first part of the bomb is an assembly holder, holding an igniter+some device
|
||||
var/obj/item/weapon/tank/bombtank = null //the second part of the bomb is a plasma tank
|
||||
origin_tech = "materials=1;engineering=1"
|
||||
|
||||
/obj/item/device/onetankbomb/examine(mob/user)
|
||||
..(user)
|
||||
|
||||
@@ -61,10 +61,8 @@
|
||||
*/
|
||||
//Captain's retro laser - Fires practice laser shots instead.
|
||||
obj/item/weapon/gun/energy/laser/retro/sc_retro
|
||||
name ="retro laser"
|
||||
icon_state = "retro"
|
||||
desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces."
|
||||
// projectile_type = "/obj/item/projectile/practice"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser/practice)
|
||||
clumsy_check = 0 //No sense in having a harmless gun blow up in the clowns face
|
||||
|
||||
//Syndicate sub-machine guns.
|
||||
@@ -196,4 +194,4 @@ var/sc_safecode5 = "[rand(0,9)]"
|
||||
return
|
||||
|
||||
/obj/singularity/narsie/sc_Narsie/ex_act()
|
||||
return
|
||||
return
|
||||
|
||||
@@ -316,9 +316,9 @@
|
||||
send_resources()
|
||||
|
||||
if(prefs.lastchangelog != changelog_hash) //bolds the changelog button on the interface so we know there are updates. -CP
|
||||
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(establish_db_connection())
|
||||
winset(src, "rpane.changelog", "background-color=#f4aa94;font-style=bold")
|
||||
to_chat(src, "<span class='info'>Changelog has changed since your last visit.</span>")
|
||||
|
||||
if(!void)
|
||||
void = new()
|
||||
|
||||
@@ -456,10 +456,12 @@
|
||||
|
||||
/datum/preferences/proc/SetChangelog(client/C,hash)
|
||||
lastchangelog=hash
|
||||
winset(C, "rpane.changelog", "background-color=none;font-style=")
|
||||
var/DBQuery/query = dbcon.NewQuery("UPDATE [format_table_name("player")] SET lastchangelog='[lastchangelog]' WHERE ckey='[C.ckey]'")
|
||||
if(!query.Execute())
|
||||
var/err = query.ErrorMsg()
|
||||
log_game("SQL ERROR during lastchangelog updating. Error : \[[err]\]\n")
|
||||
message_admins("SQL ERROR during lastchangelog updating. Error : \[[err]\]\n")
|
||||
to_chat(C, "Couldn't update your last seen changelog, please try again later.")
|
||||
return
|
||||
return 1
|
||||
|
||||
@@ -6,8 +6,32 @@
|
||||
siemens_coefficient = 0
|
||||
permeability_coefficient = 0.05
|
||||
item_color="yellow"
|
||||
power
|
||||
var/next_shock = 0
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/power
|
||||
description_antag = "These are a pair of power gloves, and can be used to fire bolts of electricity while standing over powered power cables."
|
||||
var/old_mclick_override
|
||||
var/datum/middleClickOverride/power_gloves/mclick_override = new /datum/middleClickOverride/power_gloves
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/power/equipped(mob/user, slot)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(slot == slot_gloves)
|
||||
if(H.middleClickOverride)
|
||||
old_mclick_override = H.middleClickOverride
|
||||
H.middleClickOverride = mclick_override
|
||||
to_chat(H, "<span class='notice'>You feel electricity begin to build up in [src].</span>")
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/power/dropped(mob/user, slot)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.get_item_by_slot(slot_gloves) == src && H.middleClickOverride == mclick_override)
|
||||
if(old_mclick_override)
|
||||
H.middleClickOverride = old_mclick_override
|
||||
old_mclick_override = null
|
||||
else
|
||||
H.middleClickOverride = null
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/fake
|
||||
desc = "These gloves will protect the wearer from electric shock. They don't feel like rubber..."
|
||||
@@ -167,4 +191,4 @@
|
||||
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
|
||||
heat_protection = HANDS
|
||||
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
|
||||
strip_delay = 60
|
||||
strip_delay = 60
|
||||
|
||||
@@ -95,13 +95,12 @@
|
||||
src.icon_state = "orange"
|
||||
return
|
||||
|
||||
/obj/item/clothing/shoes/orange/attackby(H as obj, loc, params)
|
||||
/obj/item/clothing/shoes/orange/attackby(obj/H, loc, params)
|
||||
..()
|
||||
if ((istype(H, /obj/item/weapon/restraints/handcuffs) && !( src.chained )))
|
||||
//H = null
|
||||
if (istype(H, /obj/item/weapon/restraints/handcuffs) && !chained && !(H.flags & NODROP))
|
||||
if (src.icon_state != "orange") return
|
||||
qdel(H)
|
||||
src.chained = 1
|
||||
src.slowdown = 15
|
||||
src.icon_state = "orange1"
|
||||
return
|
||||
return
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user