Merge branch 'master' into upstream-merge-30084
This commit is contained in:
@@ -14,3 +14,5 @@
|
||||
#define COMSIG_COMPONENT_ADDED "component_added" //when a component is added to a datum: (datum/component)
|
||||
#define COMSIG_COMPONENT_REMOVING "component_removing" //before a component is removed from a datum because of RemoveComponent: (datum/component)
|
||||
#define COMSIG_PARENT_QDELETED "parent_qdeleted" //before a datum's Destroy() is called: ()
|
||||
#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable, atom)
|
||||
#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (atom/movable)
|
||||
|
||||
@@ -137,10 +137,10 @@
|
||||
#define isorgan(A) (istype(A, /obj/item/organ))
|
||||
|
||||
GLOBAL_LIST_INIT(pointed_types, typecacheof(list(
|
||||
/obj/item/weapon/pen,
|
||||
/obj/item/weapon/screwdriver,
|
||||
/obj/item/weapon/reagent_containers/syringe,
|
||||
/obj/item/weapon/kitchen/fork)))
|
||||
/obj/item/pen,
|
||||
/obj/item/screwdriver,
|
||||
/obj/item/reagent_containers/syringe,
|
||||
/obj/item/kitchen/fork)))
|
||||
|
||||
#define is_pointed(W) (is_type_in_typecache(W, GLOB.pointed_types))
|
||||
|
||||
|
||||
@@ -97,13 +97,11 @@
|
||||
#define AI_IDLE 2
|
||||
#define AI_OFF 3
|
||||
|
||||
//determines if a mob can smash through it
|
||||
#define ENVIRONMENT_SMASH_NONE 0
|
||||
|
||||
#define ENVIRONMENT_SMASH_STRUCTURES 1
|
||||
|
||||
#define ENVIRONMENT_SMASH_WALLS 2
|
||||
|
||||
#define ENVIRONMENT_SMASH_RWALLS 3
|
||||
#define ENVIRONMENT_SMASH_STRUCTURES 1 //crates, lockers, ect
|
||||
#define ENVIRONMENT_SMASH_WALLS 2 //walls
|
||||
#define ENVIRONMENT_SMASH_RWALLS 4 //rwalls
|
||||
|
||||
|
||||
//SNPCs
|
||||
|
||||
@@ -42,6 +42,8 @@
|
||||
|
||||
#define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run
|
||||
|
||||
#define STATUS_EFFECT_GEISTRACKER /datum/status_effect/geis_tracker //if you're using geis, this tracks that and keeps you from using scripture
|
||||
|
||||
#define STATUS_EFFECT_MANIAMOTOR /datum/status_effect/maniamotor //disrupts, damages, and confuses the affected as long as they're in range of the motor
|
||||
#define MAX_MANIA_SEVERITY 100 //how high the mania severity can go
|
||||
#define MANIA_DAMAGE_TO_CONVERT 90 //how much damage is required before it'll convert affected targets
|
||||
|
||||
@@ -97,8 +97,7 @@
|
||||
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]CHAT: [text]")
|
||||
|
||||
/proc/log_sql(text)
|
||||
if(config.sql_enabled)
|
||||
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]SQL: [text]")
|
||||
WRITE_FILE(GLOB.sql_error_log, "\[[time_stamp()]]SQL: [text]")
|
||||
|
||||
//This replaces world.log so it displays both in DD and the file
|
||||
/proc/log_world(text)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
A non null 'fixed_underlay' list var will skip copying the previous turf appearance and always use the list. If the list is
|
||||
not set properly, the underlay will default to regular floor plating.
|
||||
|
||||
To see an example of a diagonal wall, see '/turf/closed/wall/shuttle' and its subtypes.
|
||||
To see an example of a diagonal wall, see '/turf/closed/wall/mineral/titanium' and its subtypes.
|
||||
*/
|
||||
|
||||
//Redefinitions of the diagonal directions so they can be stored in one var without conflicts
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
for(var/obj/machinery/computer/communications/C in GLOB.machines)
|
||||
if(!(C.stat & (BROKEN|NOPOWER)) && C.z == ZLEVEL_STATION)
|
||||
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(C.loc)
|
||||
var/obj/item/paper/P = new /obj/item/paper(C.loc)
|
||||
P.name = "paper - '[title]'"
|
||||
P.info = text
|
||||
C.messagetitle.Add("[title]")
|
||||
|
||||
@@ -72,7 +72,9 @@
|
||||
return .
|
||||
|
||||
//Splits the text of a file at seperator and returns them in a list.
|
||||
/world/proc/file2list(filename, seperator="\n")
|
||||
/world/proc/file2list(filename, seperator="\n", trim = TRUE)
|
||||
if (trim)
|
||||
return splittext(trim(file2text(filename)),seperator)
|
||||
return splittext(file2text(filename),seperator)
|
||||
|
||||
//Turns a direction into text
|
||||
@@ -551,4 +553,4 @@
|
||||
return /atom
|
||||
else
|
||||
return /datum
|
||||
return text2path(copytext(string_type, 1, last_slash))
|
||||
return text2path(copytext(string_type, 1, last_slash))
|
||||
|
||||
@@ -605,6 +605,18 @@ Turf and target are separate in case you want to teleport some distance from a t
|
||||
GLOB.sortedAreas.Add(src)
|
||||
sortTim(GLOB.sortedAreas, /proc/cmp_name_asc)
|
||||
|
||||
//Takes: Area type as a text string from a variable.
|
||||
//Returns: Instance for the area in the world.
|
||||
/proc/get_area_instance_from_text(areatext)
|
||||
var/areainstance = null
|
||||
if(istext(areatext))
|
||||
areatext = text2path(areatext)
|
||||
for(var/V in GLOB.sortedAreas)
|
||||
var/area/A = V
|
||||
if(A.type == areatext)
|
||||
areainstance = V
|
||||
return areainstance
|
||||
|
||||
//Takes: Area type as text string or as typepath OR an instance of the area.
|
||||
//Returns: A list of all areas of that type in the world.
|
||||
/proc/get_areas(areatype, subtypes=TRUE)
|
||||
@@ -797,7 +809,7 @@ GLOBAL_LIST_INIT(WALLITEMS, typecacheof(list(
|
||||
/obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign,
|
||||
/obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/button,
|
||||
/obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio/simple_vent_controller,
|
||||
/obj/item/weapon/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth,
|
||||
/obj/item/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth,
|
||||
/obj/structure/mirror, /obj/structure/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment,
|
||||
/obj/structure/sign/picture_frame
|
||||
)))
|
||||
|
||||
@@ -45,7 +45,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
|
||||
/obj/item/device/multitool = 2,
|
||||
/obj/item/device/radio/off = 2,
|
||||
/obj/item/device/t_scanner = 5,
|
||||
/obj/item/weapon/airlock_painter = 1,
|
||||
/obj/item/airlock_painter = 1,
|
||||
/obj/item/stack/cable_coil/random = 4,
|
||||
/obj/item/stack/cable_coil/random/five = 6,
|
||||
/obj/item/stack/medical/bruise_pack = 1,
|
||||
@@ -56,54 +56,54 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
|
||||
/obj/item/stack/sheet/metal/twenty = 1,
|
||||
/obj/item/stack/sheet/mineral/plasma = 1,
|
||||
/obj/item/stack/sheet/rglass = 1,
|
||||
/obj/item/weapon/book/manual/wiki/engineering_construction = 1,
|
||||
/obj/item/weapon/book/manual/wiki/engineering_hacking = 1,
|
||||
/obj/item/book/manual/wiki/engineering_construction = 1,
|
||||
/obj/item/book/manual/wiki/engineering_hacking = 1,
|
||||
/obj/item/clothing/head/cone = 1,
|
||||
/obj/item/weapon/coin/silver = 1,
|
||||
/obj/item/weapon/coin/twoheaded = 1,
|
||||
/obj/item/weapon/poster/random_contraband = 1,
|
||||
/obj/item/weapon/poster/random_official = 1,
|
||||
/obj/item/weapon/crowbar = 1,
|
||||
/obj/item/weapon/crowbar/red = 1,
|
||||
/obj/item/weapon/extinguisher = 11,
|
||||
//obj/item/weapon/gun/ballistic/revolver/russian = 1, //disabled until lootdrop is a proper world proc.
|
||||
/obj/item/weapon/hand_labeler = 1,
|
||||
/obj/item/weapon/paper/crumpled = 1,
|
||||
/obj/item/weapon/pen = 1,
|
||||
/obj/item/weapon/reagent_containers/spray/pestspray = 1,
|
||||
/obj/item/weapon/reagent_containers/glass/rag = 3,
|
||||
/obj/item/weapon/stock_parts/cell = 3,
|
||||
/obj/item/weapon/storage/belt/utility = 2,
|
||||
/obj/item/weapon/storage/box = 2,
|
||||
/obj/item/weapon/storage/box/cups = 1,
|
||||
/obj/item/weapon/storage/box/donkpockets = 1,
|
||||
/obj/item/weapon/storage/box/lights/mixed = 3,
|
||||
/obj/item/weapon/storage/box/hug/medical = 1,
|
||||
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 1,
|
||||
/obj/item/weapon/storage/toolbox/mechanical = 1,
|
||||
/obj/item/weapon/screwdriver = 3,
|
||||
/obj/item/weapon/tank/internals/emergency_oxygen = 2,
|
||||
/obj/item/weapon/vending_refill/cola = 1,
|
||||
/obj/item/weapon/weldingtool = 3,
|
||||
/obj/item/weapon/wirecutters = 1,
|
||||
/obj/item/weapon/wrench = 4,
|
||||
/obj/item/weapon/relic = 3,
|
||||
/obj/item/coin/silver = 1,
|
||||
/obj/item/coin/twoheaded = 1,
|
||||
/obj/item/poster/random_contraband = 1,
|
||||
/obj/item/poster/random_official = 1,
|
||||
/obj/item/crowbar = 1,
|
||||
/obj/item/crowbar/red = 1,
|
||||
/obj/item/extinguisher = 11,
|
||||
//obj/item/gun/ballistic/revolver/russian = 1, //disabled until lootdrop is a proper world proc.
|
||||
/obj/item/hand_labeler = 1,
|
||||
/obj/item/paper/crumpled = 1,
|
||||
/obj/item/pen = 1,
|
||||
/obj/item/reagent_containers/spray/pestspray = 1,
|
||||
/obj/item/reagent_containers/glass/rag = 3,
|
||||
/obj/item/stock_parts/cell = 3,
|
||||
/obj/item/storage/belt/utility = 2,
|
||||
/obj/item/storage/box = 2,
|
||||
/obj/item/storage/box/cups = 1,
|
||||
/obj/item/storage/box/donkpockets = 1,
|
||||
/obj/item/storage/box/lights/mixed = 3,
|
||||
/obj/item/storage/box/hug/medical = 1,
|
||||
/obj/item/storage/fancy/cigarettes/dromedaryco = 1,
|
||||
/obj/item/storage/toolbox/mechanical = 1,
|
||||
/obj/item/screwdriver = 3,
|
||||
/obj/item/tank/internals/emergency_oxygen = 2,
|
||||
/obj/item/vending_refill/cola = 1,
|
||||
/obj/item/weldingtool = 3,
|
||||
/obj/item/wirecutters = 1,
|
||||
/obj/item/wrench = 4,
|
||||
/obj/item/relic = 3,
|
||||
/obj/item/weaponcrafting/receiver = 2,
|
||||
/obj/item/clothing/head/cone = 2,
|
||||
/obj/item/weapon/grenade/smokebomb = 2,
|
||||
/obj/item/grenade/smokebomb = 2,
|
||||
/obj/item/device/geiger_counter = 3,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/orange = 1,
|
||||
/obj/item/device/radio/headset = 1,
|
||||
/obj/item/device/assembly/infra = 1,
|
||||
/obj/item/device/assembly/igniter = 2,
|
||||
/obj/item/device/assembly/signaler = 2,
|
||||
/obj/item/device/assembly/mousetrap = 2,
|
||||
/obj/item/weapon/reagent_containers/syringe = 2,
|
||||
/obj/item/reagent_containers/syringe = 2,
|
||||
/obj/item/clothing/gloves/color/random = 8,
|
||||
/obj/item/clothing/shoes/laceup = 1,
|
||||
/obj/item/weapon/storage/secure/briefcase = 3,
|
||||
/obj/item/weapon/storage/toolbox/artistic = 2,
|
||||
/obj/item/storage/secure/briefcase = 3,
|
||||
/obj/item/storage/toolbox/artistic = 2,
|
||||
/obj/item/toy/eightball = 1,
|
||||
/obj/item/weapon/storage/daki = 3,
|
||||
/obj/item/storage/daki = 3,
|
||||
"" = 3
|
||||
))
|
||||
|
||||
@@ -6,5 +6,6 @@
|
||||
#define POLL_IGNORE_ALIEN_LARVA "alien_larva"
|
||||
#define POLL_IGNORE_CLOCKWORK_MARAUDER "clockwork_marauder"
|
||||
#define POLL_IGNORE_SYNDICATE "syndicate"
|
||||
#define POLL_IGNORE_HOLOPARASITE "holoparasite"
|
||||
|
||||
GLOBAL_LIST_EMPTY(poll_ignore)
|
||||
|
||||
@@ -12,6 +12,8 @@ GLOBAL_VAR(round_id)
|
||||
GLOBAL_PROTECT(round_id)
|
||||
GLOBAL_VAR(config_error_log)
|
||||
GLOBAL_PROTECT(config_error_log)
|
||||
GLOBAL_VAR(sql_error_log)
|
||||
GLOBAL_PROTECT(sql_error_log)
|
||||
|
||||
GLOBAL_LIST_EMPTY(bombers)
|
||||
GLOBAL_PROTECT(bombers)
|
||||
|
||||
@@ -55,10 +55,10 @@
|
||||
/obj/item
|
||||
var/canMouseDown = FALSE
|
||||
|
||||
/obj/item/weapon/gun
|
||||
/obj/item/gun
|
||||
var/automatic = 0 //can gun use it, 0 is no, anything above 0 is the delay between clicks in ds
|
||||
|
||||
/obj/item/weapon/gun/CanItemAutoclick(object, location, params)
|
||||
/obj/item/gun/CanItemAutoclick(object, location, params)
|
||||
. = automatic
|
||||
|
||||
/atom/proc/IsAutoclickable()
|
||||
|
||||
@@ -180,7 +180,7 @@
|
||||
/atom/proc/CanReachStorage(atom/target,user,depth)
|
||||
return FALSE
|
||||
|
||||
/obj/item/weapon/storage/CanReachStorage(atom/target,user,depth)
|
||||
/obj/item/storage/CanReachStorage(atom/target,user,depth)
|
||||
while(target && depth > 0)
|
||||
target = target.loc
|
||||
depth--
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
if(..())
|
||||
return
|
||||
var/mob/living/silicon/robot/R = usr
|
||||
if(R.module.type != /obj/item/weapon/robot_module)
|
||||
if(R.module.type != /obj/item/robot_module)
|
||||
R.hud_used.toggle_show_robot_modules()
|
||||
return 1
|
||||
R.pick_module()
|
||||
|
||||
@@ -182,8 +182,8 @@
|
||||
name = "close"
|
||||
|
||||
/obj/screen/close/Click()
|
||||
if(istype(master, /obj/item/weapon/storage))
|
||||
var/obj/item/weapon/storage/S = master
|
||||
if(istype(master, /obj/item/storage))
|
||||
var/obj/item/storage/S = master
|
||||
S.close(usr)
|
||||
return 1
|
||||
|
||||
@@ -262,27 +262,27 @@
|
||||
to_chat(C, "<span class='warning'>You are not wearing an internals mask!</span>")
|
||||
return
|
||||
|
||||
var/obj/item/I = C.is_holding_item_of_type(/obj/item/weapon/tank)
|
||||
var/obj/item/I = C.is_holding_item_of_type(/obj/item/tank)
|
||||
if(I)
|
||||
to_chat(C, "<span class='notice'>You are now running on internals from the [I] on your [C.get_held_index_name(C.get_held_index_of_item(I))].</span>")
|
||||
C.internal = I
|
||||
else if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(istype(H.s_store, /obj/item/weapon/tank))
|
||||
if(istype(H.s_store, /obj/item/tank))
|
||||
to_chat(H, "<span class='notice'>You are now running on internals from the [H.s_store] on your [H.wear_suit].</span>")
|
||||
H.internal = H.s_store
|
||||
else if(istype(H.belt, /obj/item/weapon/tank))
|
||||
else if(istype(H.belt, /obj/item/tank))
|
||||
to_chat(H, "<span class='notice'>You are now running on internals from the [H.belt] on your belt.</span>")
|
||||
H.internal = H.belt
|
||||
else if(istype(H.l_store, /obj/item/weapon/tank))
|
||||
else if(istype(H.l_store, /obj/item/tank))
|
||||
to_chat(H, "<span class='notice'>You are now running on internals from the [H.l_store] in your left pocket.</span>")
|
||||
H.internal = H.l_store
|
||||
else if(istype(H.r_store, /obj/item/weapon/tank))
|
||||
else if(istype(H.r_store, /obj/item/tank))
|
||||
to_chat(H, "<span class='notice'>You are now running on internals from the [H.r_store] in your right pocket.</span>")
|
||||
H.internal = H.r_store
|
||||
|
||||
//Separate so CO2 jetpacks are a little less cumbersome.
|
||||
if(!C.internal && istype(C.back, /obj/item/weapon/tank))
|
||||
if(!C.internal && istype(C.back, /obj/item/tank))
|
||||
to_chat(C, "<span class='notice'>You are now running on internals from the [C.back] on your back.</span>")
|
||||
C.internal = C.back
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
else
|
||||
to_chat(user, "[src] has no destination.")
|
||||
|
||||
/obj/item/weapon/storage/attack_ghost(mob/user)
|
||||
/obj/item/storage/attack_ghost(mob/user)
|
||||
orient2hud(user)
|
||||
show_to(user)
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ GLOBAL_LIST_EMPTY(cock_shapes_icons) //Associated list for names->icon_states fo
|
||||
GLOBAL_LIST_EMPTY(breasts_size_list)
|
||||
GLOBAL_LIST_EMPTY(breasts_shapes_list)
|
||||
GLOBAL_LIST_EMPTY(vagina_shapes_list)
|
||||
GLOBAL_LIST_INIT(cum_into_containers_list, list(/obj/item/weapon/reagent_containers/food/snacks/pie)) //Yer fuggin snowflake name list jfc
|
||||
GLOBAL_LIST_INIT(cum_into_containers_list, list(/obj/item/reagent_containers/food/snacks/pie)) //Yer fuggin snowflake name list jfc
|
||||
GLOBAL_LIST_INIT(dick_nouns, list("dick","cock","member","shaft"))
|
||||
GLOBAL_LIST_INIT(cum_id_list,"semen")
|
||||
GLOBAL_LIST_INIT(milk_id_list,"milk")
|
||||
|
||||
@@ -287,7 +287,7 @@
|
||||
setArousalLoss(min_arousal)
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/G, obj/item/weapon/reagent_containers/container, mb_time = 30) //For beaker-filling, beware the bartender
|
||||
/mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/G, obj/item/reagent_containers/container, mb_time = 30) //For beaker-filling, beware the bartender
|
||||
var/total_fluids = 0
|
||||
var/datum/reagents/fluid_source = null
|
||||
|
||||
@@ -368,11 +368,11 @@
|
||||
return input(src, "With whom?", "Sexual partner", null) in partners //pick one, default to null
|
||||
|
||||
/mob/living/carbon/human/proc/pick_climax_container()
|
||||
var/obj/item/weapon/reagent_containers/SC = null
|
||||
var/obj/item/reagent_containers/SC = null
|
||||
var/list/containers_list = list()
|
||||
|
||||
for(var/obj/item/weapon/reagent_containers/container in held_items)
|
||||
if(container.is_open_container() || istype(container, /obj/item/weapon/reagent_containers/food/snacks))
|
||||
for(var/obj/item/reagent_containers/container in held_items)
|
||||
if(container.is_open_container() || istype(container, /obj/item/reagent_containers/food/snacks))
|
||||
containers_list += container
|
||||
|
||||
if(containers_list.len)
|
||||
@@ -530,7 +530,7 @@
|
||||
picked_organ = pick_climax_genitals() //Gotta be climaxable, not just masturbation, to fill with fluids.
|
||||
if(picked_organ)
|
||||
//Good, got an organ, time to pick a container
|
||||
var/obj/item/weapon/reagent_containers/fluid_container = pick_climax_container()
|
||||
var/obj/item/reagent_containers/fluid_container = pick_climax_container()
|
||||
if(fluid_container)
|
||||
mob_fill_container(picked_organ, fluid_container)
|
||||
return
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//Will include consumable gene mods in the future.
|
||||
|
||||
/obj/item/weapon/genemod
|
||||
/obj/item/genemod
|
||||
name = "genetic modifier"
|
||||
desc = "Microbodies which can grow, morph, or otherwise change an organism into something else."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "dnainjector"
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
@@ -18,5 +18,5 @@
|
||||
|
||||
var/used = 0
|
||||
|
||||
/obj/item/weapon/genemod/proc/use(mob/living/carbon/human/target)
|
||||
/obj/item/genemod/proc/use(mob/living/carbon/human/target)
|
||||
return
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/weapon/gun/energy/laser/carbine
|
||||
/obj/item/gun/energy/laser/carbine
|
||||
name = "laser carbine"
|
||||
desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal laser gun."
|
||||
icon = 'icons/obj/guns/cit_guns.dmi'
|
||||
@@ -8,13 +8,13 @@
|
||||
force = 10
|
||||
throwforce = 10
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/lasergun)
|
||||
cell_type = /obj/item/weapon/stock_parts/cell/lascarbine
|
||||
cell_type = /obj/item/stock_parts/cell/lascarbine
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/weapon/gun/energy/laser/carbine/nopin
|
||||
/obj/item/gun/energy/laser/carbine/nopin
|
||||
pin = null
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/lascarbine
|
||||
/obj/item/stock_parts/cell/lascarbine
|
||||
name = "laser carbine power supply"
|
||||
maxcharge = 2500
|
||||
|
||||
@@ -25,5 +25,5 @@
|
||||
req_tech = list("combat" = 5, "magnets" = 5, "powerstorage" = 4)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_GOLD = 2500, MAT_METAL = 5000, MAT_GLASS = 5000)
|
||||
build_path = /obj/item/weapon/gun/energy/laser/carbine/nopin
|
||||
build_path = /obj/item/gun/energy/laser/carbine/nopin
|
||||
category = list("Weapons")
|
||||
+11
-11
@@ -13,15 +13,15 @@
|
||||
/obj/item/clothing/under/maid = 5,
|
||||
/obj/item/clothing/under/stripper_pink = 5,
|
||||
/obj/item/clothing/under/stripper_green = 5,
|
||||
/obj/item/weapon/dildo/custom = 5
|
||||
/obj/item/dildo/custom = 5
|
||||
)
|
||||
contraband = list(/obj/item/weapon/restraints/handcuffs/fake/kinky = 5,
|
||||
contraband = list(/obj/item/restraints/handcuffs/fake/kinky = 5,
|
||||
/obj/item/clothing/neck/petcollar = 5,
|
||||
/obj/item/clothing/under/mankini = 1,
|
||||
/obj/item/weapon/dildo/flared/huge = 1
|
||||
/obj/item/dildo/flared/huge = 1
|
||||
)
|
||||
premium = list()
|
||||
refill_canister = /obj/item/weapon/vending_refill/kink
|
||||
refill_canister = /obj/item/vending_refill/kink
|
||||
|
||||
/obj/machinery/vending/nazivend
|
||||
name = "Nazivend"
|
||||
@@ -42,11 +42,11 @@
|
||||
/obj/item/clothing/suit/officercoat = 10,
|
||||
/obj/item/clothing/under/officeruniform = 10,
|
||||
/obj/item/clothing/suit/space/hardsuit/nazi = 3,
|
||||
/obj/item/weapon/gun/energy/plasma/MP40k = 4
|
||||
/obj/item/gun/energy/plasma/MP40k = 4
|
||||
)
|
||||
premium = list()
|
||||
|
||||
refill_canister = /obj/item/weapon/vending_refill/nazi
|
||||
refill_canister = /obj/item/vending_refill/nazi
|
||||
|
||||
/obj/machinery/vending/sovietvend
|
||||
name = "KomradeVendtink"
|
||||
@@ -70,11 +70,11 @@
|
||||
/obj/item/clothing/suit/russofurcoat = 4,
|
||||
/obj/item/clothing/head/russofurhat = 4,
|
||||
/obj/item/clothing/suit/space/hardsuit/soviet = 3,
|
||||
/obj/item/weapon/gun/energy/laser/LaserAK = 4
|
||||
/obj/item/gun/energy/laser/LaserAK = 4
|
||||
)
|
||||
premium = list()
|
||||
|
||||
refill_canister = /obj/item/weapon/vending_refill/soviet
|
||||
refill_canister = /obj/item/vending_refill/soviet
|
||||
|
||||
|
||||
#undef STANDARD_CHARGE
|
||||
@@ -82,19 +82,19 @@
|
||||
#undef COIN_CHARGE
|
||||
|
||||
|
||||
/obj/item/weapon/vending_refill/kink
|
||||
/obj/item/vending_refill/kink
|
||||
machine_name = "KinkMate"
|
||||
icon_state = "refill_kink"
|
||||
charges = list(8, 5, 0)// of 20 standard, 12 contraband, 0 premium
|
||||
init_charges = list(8, 5, 0)
|
||||
|
||||
/obj/item/weapon/vending_refill/nazi
|
||||
/obj/item/vending_refill/nazi
|
||||
machine_name = "nazivend"
|
||||
icon_state = "refill_nazi"
|
||||
charges = list(33, 13, 0)
|
||||
init_charges = list(33, 13, 0)
|
||||
|
||||
/obj/item/weapon/vending_refill/soviet
|
||||
/obj/item/vending_refill/soviet
|
||||
machine_name = "sovietvend"
|
||||
icon_state = "refill_soviet"
|
||||
charges = list(47, 7, 0)
|
||||
|
||||
+34
-34
@@ -1,42 +1,42 @@
|
||||
/obj/item/weapon/robot_module/loader
|
||||
/obj/item/robot_module/loader
|
||||
name = "loader robot module"
|
||||
/obj/item/weapon/robot_module/loader/New()
|
||||
/obj/item/robot_module/loader/New()
|
||||
..()
|
||||
emag = new /obj/item/borg/stun(src)
|
||||
modules += new /obj/item/weapon/extinguisher(src)
|
||||
modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
|
||||
modules += new /obj/item/weapon/screwdriver(src)
|
||||
modules += new /obj/item/weapon/wrench(src)
|
||||
modules += new /obj/item/weapon/crowbar(src)
|
||||
modules += new /obj/item/weapon/wirecutters(src)
|
||||
modules += new /obj/item/extinguisher(src)
|
||||
modules += new /obj/item/weldingtool/largetank/cyborg(src)
|
||||
modules += new /obj/item/screwdriver(src)
|
||||
modules += new /obj/item/wrench(src)
|
||||
modules += new /obj/item/crowbar(src)
|
||||
modules += new /obj/item/wirecutters(src)
|
||||
modules += new /obj/item/device/multitool(src)
|
||||
modules += new /obj/item/device/t_scanner(src)
|
||||
modules += new /obj/item/device/analyzer(src)
|
||||
modules += new /obj/item/device/assembly/signaler
|
||||
modules += new /obj/item/weapon/soap/nanotrasen(src)
|
||||
modules += new /obj/item/soap/nanotrasen(src)
|
||||
|
||||
fix_modules()
|
||||
|
||||
/obj/item/weapon/robot_module/k9
|
||||
/obj/item/robot_module/k9
|
||||
name = "Security K-9 Unit module"
|
||||
/obj/item/weapon/robot_module/k9/New()
|
||||
/obj/item/robot_module/k9/New()
|
||||
..()
|
||||
modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg/dog(src)
|
||||
modules += new /obj/item/weapon/dogborg/jaws/big(src)
|
||||
modules += new /obj/item/weapon/dogborg/pounce(src)
|
||||
modules += new /obj/item/restraints/handcuffs/cable/zipties/cyborg/dog(src)
|
||||
modules += new /obj/item/dogborg/jaws/big(src)
|
||||
modules += new /obj/item/dogborg/pounce(src)
|
||||
modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src)
|
||||
modules += new /obj/item/weapon/soap/tongue(src)
|
||||
modules += new /obj/item/soap/tongue(src)
|
||||
modules += new /obj/item/device/analyzer/nose(src)
|
||||
modules += new /obj/item/weapon/storage/bag/borgdelivery(src)
|
||||
modules += new /obj/item/storage/bag/borgdelivery(src)
|
||||
//modules += new /obj/item/device/assembly/signaler(src)
|
||||
//modules += new /obj/item/device/detective_scanner(src)
|
||||
modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src)
|
||||
emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
|
||||
modules += new /obj/item/gun/energy/disabler/cyborg(src)
|
||||
emag = new /obj/item/gun/energy/laser/cyborg(src)
|
||||
fix_modules()
|
||||
|
||||
/obj/item/weapon/robot_module/security/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
|
||||
/obj/item/robot_module/security/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
|
||||
..()
|
||||
var/obj/item/weapon/gun/energy/gun/advtaser/cyborg/T = locate(/obj/item/weapon/gun/energy/gun/advtaser/cyborg) in get_usable_modules()
|
||||
var/obj/item/gun/energy/gun/advtaser/cyborg/T = locate(/obj/item/gun/energy/gun/advtaser/cyborg) in get_usable_modules()
|
||||
if(T)
|
||||
if(T.power_supply.charge < T.power_supply.maxcharge)
|
||||
var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select]
|
||||
@@ -46,31 +46,31 @@
|
||||
T.charge_tick = 0
|
||||
fix_modules()
|
||||
|
||||
/obj/item/weapon/robot_module/borgi
|
||||
/obj/item/robot_module/borgi
|
||||
name = "Borgi module"
|
||||
|
||||
/obj/item/weapon/robot_module/borgi/New()
|
||||
/obj/item/robot_module/borgi/New()
|
||||
..()
|
||||
modules += new /obj/item/weapon/dogborg/jaws/small(src)
|
||||
modules += new /obj/item/weapon/storage/bag/borgdelivery(src)
|
||||
modules += new /obj/item/weapon/soap/tongue(src)
|
||||
modules += new /obj/item/dogborg/jaws/small(src)
|
||||
modules += new /obj/item/storage/bag/borgdelivery(src)
|
||||
modules += new /obj/item/soap/tongue(src)
|
||||
modules += new /obj/item/device/healthanalyzer(src)
|
||||
modules += new /obj/item/device/analyzer/nose(src)
|
||||
emag = new /obj/item/weapon/dogborg/pounce(src)
|
||||
emag = new /obj/item/dogborg/pounce(src)
|
||||
fix_modules()
|
||||
|
||||
/obj/item/weapon/robot_module/medihound
|
||||
/obj/item/robot_module/medihound
|
||||
name = "MediHound module"
|
||||
|
||||
/obj/item/weapon/robot_module/medihound/New()
|
||||
/obj/item/robot_module/medihound/New()
|
||||
..()
|
||||
modules += new /obj/item/weapon/dogborg/jaws/small(src)
|
||||
modules += new /obj/item/weapon/storage/bag/borgdelivery(src)
|
||||
modules += new /obj/item/dogborg/jaws/small(src)
|
||||
modules += new /obj/item/storage/bag/borgdelivery(src)
|
||||
modules += new /obj/item/device/analyzer/nose(src)
|
||||
modules += new /obj/item/weapon/soap/tongue(src)
|
||||
modules += new /obj/item/soap/tongue(src)
|
||||
modules += new /obj/item/device/healthanalyzer(src)
|
||||
modules += new /obj/item/weapon/dogborg/sleeper(src)
|
||||
modules += new /obj/item/weapon/twohanded/shockpaddles/hound(src)
|
||||
modules += new /obj/item/dogborg/sleeper(src)
|
||||
modules += new /obj/item/twohanded/shockpaddles/hound(src)
|
||||
modules += new /obj/item/device/sensor_device(src)
|
||||
emag = new /obj/item/weapon/dogborg/pounce(src)
|
||||
emag = new /obj/item/dogborg/pounce(src)
|
||||
fix_modules()
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/weapon/dogborg/jaws/big
|
||||
/obj/item/dogborg/jaws/big
|
||||
name = "combat jaws"
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "jaws"
|
||||
@@ -11,7 +11,7 @@
|
||||
w_class = 3
|
||||
sharpness = IS_SHARP
|
||||
|
||||
/obj/item/weapon/dogborg/jaws/small
|
||||
/obj/item/dogborg/jaws/small
|
||||
name = "puppy jaws"
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "smalljaws"
|
||||
@@ -25,11 +25,11 @@
|
||||
sharpness = IS_SHARP
|
||||
var/emagged = 0
|
||||
|
||||
/obj/item/weapon/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user)
|
||||
/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user)
|
||||
..()
|
||||
user.do_attack_animation(A, ATTACK_EFFECT_BITE)
|
||||
|
||||
/obj/item/weapon/dogborg/jaws/small/attack_self(mob/user)
|
||||
/obj/item/dogborg/jaws/small/attack_self(mob/user)
|
||||
var/mob/living/silicon/robot.R = user
|
||||
if(R.emagged)
|
||||
emagged = !emagged
|
||||
@@ -62,20 +62,20 @@
|
||||
|
||||
//Cuffs
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg/dog/attack(mob/living/carbon/C, mob/user)
|
||||
/obj/item/restraints/handcuffs/cable/zipties/cyborg/dog/attack(mob/living/carbon/C, mob/user)
|
||||
if(!C.handcuffed)
|
||||
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
|
||||
C.visible_message("<span class='danger'>[user] is trying to put zipties on [C]!</span>", \
|
||||
"<span class='userdanger'>[user] is trying to put zipties on [C]!</span>")
|
||||
if(do_mob(user, C, 30))
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/weapon/restraints/handcuffs/cable/zipties/used(C)
|
||||
C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
|
||||
C.update_inv_handcuffed(0)
|
||||
user << "<span class='notice'>You handcuff [C].</span>"
|
||||
to_chat(user,"<span class='notice'>You handcuff [C].</span>")
|
||||
playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0)
|
||||
add_logs(user, C, "handcuffed")
|
||||
else
|
||||
user << "<span class='warning'>You fail to handcuff [C]!</span>"
|
||||
to_chat(user,"<span class='warning'>You fail to handcuff [C]!</span>")
|
||||
|
||||
|
||||
//Boop
|
||||
@@ -149,7 +149,7 @@
|
||||
|
||||
//Delivery
|
||||
|
||||
/obj/item/weapon/storage/bag/borgdelivery
|
||||
/obj/item/storage/bag/borgdelivery
|
||||
name = "fetching storage"
|
||||
desc = "Fetch the thing!"
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
@@ -161,12 +161,12 @@
|
||||
storage_slots = 1
|
||||
collection_mode = 0
|
||||
can_hold = list() // any
|
||||
cant_hold = list(/obj/item/weapon/disk/nuclear)
|
||||
cant_hold = list(/obj/item/disk/nuclear)
|
||||
|
||||
|
||||
//Tongue stuff
|
||||
|
||||
/obj/item/weapon/soap/tongue
|
||||
/obj/item/soap/tongue
|
||||
name = "synthetic tongue"
|
||||
desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
@@ -175,7 +175,7 @@
|
||||
cleanspeed = 80
|
||||
var/emagged = 0
|
||||
|
||||
/obj/item/weapon/soap/tongue/New()
|
||||
/obj/item/soap/tongue/New()
|
||||
..()
|
||||
flags_1 |= NOBLUDGEON_1 //No more attack messages
|
||||
|
||||
@@ -185,7 +185,7 @@
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state= "kibble"
|
||||
|
||||
/obj/item/weapon/soap/tongue/attack_self(mob/user)
|
||||
/obj/item/soap/tongue/attack_self(mob/user)
|
||||
var/mob/living/silicon/robot.R = user
|
||||
if(R.emagged)
|
||||
emagged = !emagged
|
||||
@@ -203,15 +203,17 @@
|
||||
cleanspeed = 80
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/soap/tongue/afterattack(atom/target, mob/user, proximity)
|
||||
/obj/item/soap/tongue/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity || !check_allowed_items(target))
|
||||
return
|
||||
if(user.client && (target in user.client.screen))
|
||||
user << "<span class='warning'>You need to take that [target.name] off before cleaning it!</span>"
|
||||
to_chat(user, "<span class='warning'>You need to take that [target.name] off before cleaning it!</span>")
|
||||
else if(istype(target,/obj/effect/decal/cleanable))
|
||||
user.visible_message("[user] begins to lick off \the [target.name].", "<span class='warning'>You begin to lick off \the [target.name]...</span>")
|
||||
if(do_after(user, src.cleanspeed, target = target))
|
||||
user << "<span class='notice'>You finish licking off \the [target.name].</span>"
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't eat them.
|
||||
to_chat(user, "<span class='notice'>You finish licking off \the [target.name].</span>")
|
||||
qdel(target)
|
||||
var/mob/living/silicon/robot.R = user
|
||||
R.cell.give(50)
|
||||
@@ -219,17 +221,21 @@
|
||||
if(istype(target,/obj/item/trash))
|
||||
user.visible_message("[user] nibbles away at \the [target.name].", "<span class='warning'>You begin to nibble away at \the [target.name]...</span>")
|
||||
if(do_after(user, src.cleanspeed, target = target))
|
||||
user << "<span class='notice'>You finish off \the [target.name].</span>"
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't eat them.
|
||||
to_chat(user, "<span class='notice'>You finish off \the [target.name].</span>")
|
||||
qdel(target)
|
||||
var/mob/living/silicon/robot.R = user
|
||||
R.cell.give(250)
|
||||
return
|
||||
if(istype(target,/obj/item/weapon/stock_parts/cell))
|
||||
if(istype(target,/obj/item/stock_parts/cell))
|
||||
user.visible_message("[user] begins cramming \the [target.name] down its throat.", "<span class='warning'>You begin cramming \the [target.name] down your throat...</span>")
|
||||
if(do_after(user, 50, target = target))
|
||||
user << "<span class='notice'>You finish off \the [target.name].</span>"
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't eat them.
|
||||
to_chat(user, "<span class='notice'>You finish off \the [target.name].</span>")
|
||||
var/mob/living/silicon/robot.R = user
|
||||
var/obj/item/weapon/stock_parts/cell.C = target
|
||||
var/obj/item/stock_parts/cell.C = target
|
||||
R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf
|
||||
qdel(target)
|
||||
return
|
||||
@@ -237,15 +243,19 @@
|
||||
if(!I.anchored && src.emagged)
|
||||
user.visible_message("[user] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", "<span class='warning'>You begin chewing up \the [target.name]...</span>")
|
||||
if(do_after(user, 100, target = I)) //Nerf dat time yo
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. Even emags don't make you magically eat things at range.
|
||||
return //If they moved away, you can't eat them.
|
||||
visible_message("<span class='warning'>[user] chews up \the [target.name] and cleans off the debris!</span>")
|
||||
user << "<span class='notice'>You finish off \the [target.name].</span>"
|
||||
to_chat(user, "<span class='notice'>You finish off \the [target.name].</span>")
|
||||
qdel(I)
|
||||
var/mob/living/silicon/robot.R = user
|
||||
R.cell.give(500)
|
||||
return
|
||||
user.visible_message("[user] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
|
||||
if(do_after(user, src.cleanspeed, target = target))
|
||||
user << "<span class='notice'>You clean \the [target.name].</span>"
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't clean them.
|
||||
to_chat(user,"<span class='notice'>You clean \the [target.name].</span>")
|
||||
var/obj/effect/decal/cleanable/C = locate() in target
|
||||
qdel(C)
|
||||
target.clean_blood()
|
||||
@@ -269,12 +279,16 @@
|
||||
else if(istype(target, /obj/structure/window))
|
||||
user.visible_message("[user] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
|
||||
if(do_after(user, src.cleanspeed, target = target))
|
||||
user << "<span class='notice'>You clean \the [target.name].</span>"
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't clean them.
|
||||
to_chat(user, "<span class='notice'>You clean \the [target.name].</span>")
|
||||
target.color = initial(target.color)
|
||||
else
|
||||
user.visible_message("[user] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
|
||||
if(do_after(user, src.cleanspeed, target = target))
|
||||
user << "<span class='notice'>You clean \the [target.name].</span>"
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't clean them.
|
||||
to_chat(user, "<span class='notice'>You clean \the [target.name].</span>")
|
||||
var/obj/effect/decal/cleanable/C = locate() in target
|
||||
qdel(C)
|
||||
target.clean_blood()
|
||||
@@ -284,7 +298,7 @@
|
||||
|
||||
//Defibs
|
||||
|
||||
/obj/item/weapon/twohanded/shockpaddles/hound
|
||||
/obj/item/twohanded/shockpaddles/hound
|
||||
name = "defibrillator paws"
|
||||
desc = "MediHound specific shock paws."
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
@@ -293,7 +307,7 @@
|
||||
req_defib = 0
|
||||
wielded = 1
|
||||
|
||||
/obj/item/weapon/twohanded/shockpaddles/hound/attack(mob/M, mob/user)
|
||||
/obj/item/twohanded/shockpaddles/hound/attack(mob/M, mob/user)
|
||||
var/mob/living/silicon/robot.R = user
|
||||
if(R.cell.charge < 1000)
|
||||
user.visible_message("<span class='warning'>You don't have enough charge for this operation!</span class>")
|
||||
@@ -322,17 +336,17 @@
|
||||
var/eject_port = "ingestion"
|
||||
var/list/items_preserved = list()
|
||||
var/list/important_items = list(
|
||||
/obj/item/weapon/hand_tele,
|
||||
/obj/item/weapon/card/id/captains_spare,
|
||||
/obj/item/hand_tele,
|
||||
/obj/item/card/id/captains_spare,
|
||||
/obj/item/device/aicard,
|
||||
/obj/item/device/paicard,
|
||||
/obj/item/weapon/gun,
|
||||
/obj/item/weapon/pinpointer,
|
||||
/obj/item/gun,
|
||||
/obj/item/pinpointer,
|
||||
/obj/item/clothing/shoes/magboots,
|
||||
/obj/item/clothing/head/helmet/space,
|
||||
/obj/item/clothing/suit/space,
|
||||
/obj/item/weapon/reagent_containers/hypospray/CMO,
|
||||
/obj/item/weapon/tank/jetpack/oxygen/captain,
|
||||
/obj/item/reagent_containers/hypospray/CMO,
|
||||
/obj/item/tank/jetpack/oxygen/captain,
|
||||
/obj/item/clothing/accessory/medal/gold/captain,
|
||||
/obj/item/clothing/suit/armor,
|
||||
/obj/item/documents,
|
||||
@@ -340,7 +354,7 @@
|
||||
/obj/item/nuke_core_container,
|
||||
/obj/item/areaeditor/blueprints,
|
||||
/obj/item/documents/syndicate,
|
||||
/obj/item/weapon/disk/nuclear)
|
||||
/obj/item/disk/nuclear)
|
||||
|
||||
/obj/item/device/dogborg/sleeper/New()
|
||||
..()
|
||||
@@ -355,16 +369,20 @@
|
||||
return
|
||||
if(!ishuman(target))
|
||||
return
|
||||
if(!target.devourable)
|
||||
to_chat(user, "<span class='warning'>This person is incompatible with our equipment.</span>")
|
||||
return
|
||||
if(target.buckled)
|
||||
user << "<span class='warning'>The user is buckled and can not be put into your [src.name].</span>"
|
||||
to_chat(user, "<span class='warning'>The user is buckled and can not be put into your [src.name].</span>")
|
||||
return
|
||||
if(patient)
|
||||
user << "<span class='warning'>Your [src.name] is already occupied.</span>"
|
||||
to_chat(user, "<span class='warning'>Your [src.name] is already occupied.</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[hound.name] is ingesting [target.name] into their [src.name].</span>", "<span class='notice'>You start ingesting [target] into your [src]...</span>")
|
||||
if(!patient && ishuman(target) && !target.buckled && do_after (user, 50, target))
|
||||
if(!patient && ishuman(target) && !target.buckled && do_after (user, 50, target = target))
|
||||
|
||||
if(!proximity) return //If they moved away, you can't eat them.
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't eat them.
|
||||
|
||||
if(patient) return //If you try to eat two people at once, you can only eat one.
|
||||
|
||||
@@ -526,7 +544,7 @@
|
||||
START_PROCESSING(SSobj, src)
|
||||
sleeperUI(usr)
|
||||
if(patient)
|
||||
patient << "<span class='danger'>[hound.name]'s [src.name] fills with caustic enzymes around you!</span>"
|
||||
to_chat(patient, "<span class='danger'>[hound.name]'s [src.name] fills with caustic enzymes around you!</span>")
|
||||
return
|
||||
if(cleaning)
|
||||
sleeperUI(usr)
|
||||
@@ -544,9 +562,9 @@
|
||||
if(href_list["inject"] == "epinephrine" || patient.health > min_health)
|
||||
inject_chem(usr, href_list["inject"])
|
||||
else
|
||||
usr << "<span class='notice'>ERROR: Subject is not in stable condition for injections.</span>"
|
||||
to_chat(usr, "<span class='notice'>ERROR: Subject is not in stable condition for injections.</span>")
|
||||
else
|
||||
usr << "<span class='notice'>ERROR: Subject cannot metabolise chemicals.</span>"
|
||||
to_chat(usr,"<span class='notice'>ERROR: Subject cannot metabolise chemicals.</span>")
|
||||
|
||||
src.updateUsrDialog()
|
||||
sleeperUI(usr) //Needs a callback to boop the page to refresh.
|
||||
@@ -556,15 +574,15 @@
|
||||
if(patient && patient.reagents)
|
||||
if(chem in injection_chems + "epinephrine")
|
||||
if(hound.cell.charge < 800) //This is so borgs don't kill themselves with it.
|
||||
hound << "<span class='notice'>You don't have enough power to synthesize fluids.</span>"
|
||||
to_chat(hound, "<span class='notice'>You don't have enough power to synthesize fluids.</span>")
|
||||
return
|
||||
else if(patient.reagents.get_reagent_amount(chem) + 10 >= 20) //Preventing people from accidentally killing themselves by trying to inject too many chemicals!
|
||||
hound << "<span class='notice'>Your stomach is currently too full of fluids to secrete more fluids of this kind.</span>"
|
||||
to_chat(hound, "<span class='notice'>Your stomach is currently too full of fluids to secrete more fluids of this kind.</span>")
|
||||
else if(patient.reagents.get_reagent_amount(chem) + 10 <= 20) //No overdoses for you
|
||||
patient.reagents.add_reagent(chem, inject_amount)
|
||||
drain(750) //-750 charge per injection
|
||||
var/units = round(patient.reagents.get_reagent_amount(chem))
|
||||
hound << "<span class='notice'>Injecting [units] unit\s of [injection_chems[chem]] into occupant.</span>" //If they were immersed, the reagents wouldn't leave with them.
|
||||
to_chat(hound, "<span class='notice'>Injecting [units] unit\s of [injection_chems[chem]] into occupant.</span>") //If they were immersed, the reagents wouldn't leave with them.
|
||||
|
||||
/obj/item/device/dogborg/sleeper/process()
|
||||
|
||||
@@ -651,7 +669,7 @@
|
||||
|
||||
//Belly is entirely empty
|
||||
if(!length(contents))
|
||||
hound << "<span class='notice'>Your [src.name] is now clean. Ending self-cleaning cycle.</span>"
|
||||
to_chat(hound, "<span class='notice'>Your [src.name] is now clean. Ending self-cleaning cycle.</span>")
|
||||
cleaning = 0
|
||||
update_patient()
|
||||
return
|
||||
@@ -716,8 +734,8 @@
|
||||
qdel(T)
|
||||
|
||||
//Special case for IDs to make them digested
|
||||
//else if (istype(T, /obj/item/weapon/card/id))
|
||||
//var/obj/item/weapon/card/id/ID = T
|
||||
//else if (istype(T, /obj/item/card/id))
|
||||
//var/obj/item/card/id/ID = T
|
||||
//ID.digest() //Need the digest proc, first.
|
||||
|
||||
//Anything not perserved, PDA, or ID
|
||||
@@ -742,7 +760,7 @@
|
||||
min_health = -100
|
||||
injection_chems = null //So they don't have all the same chems as the medihound!
|
||||
|
||||
/obj/item/weapon/storage/attackby(obj/item/device/dogborg/sleeper/K9, mob/user, proximity)
|
||||
/obj/item/storage/attackby(obj/item/device/dogborg/sleeper/K9, mob/user, proximity)
|
||||
K9.afterattack(src, user ,1)
|
||||
|
||||
/obj/item/device/dogborg/sleeper/K9/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)
|
||||
@@ -766,12 +784,14 @@
|
||||
to_chat(user,"<span class='warning'>[brigman] is buckled and can not be put into your [src.name].</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[hound.name] is ingesting [brigman] into their [src.name].</span>", "<span class='notice'>You start ingesting [brigman] into your [src.name]...</span>")
|
||||
if(do_after(user, 30, brigman) && !patient && !brigman.buckled)
|
||||
if(do_after(user, 30, target = brigman) && !patient && !brigman.buckled)
|
||||
if(!in_range(src, brigman)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't eat them.
|
||||
brigman.forceMove(src)
|
||||
brigman.reset_perspective(src)
|
||||
update_patient()
|
||||
START_PROCESSING(SSobj, src)
|
||||
user.visible_message("<span class='warning'>[hound.name]'s mobile brig clunks in series as [brigman] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [brigman] slips inside.</span>")
|
||||
user.visible_message("<span class='warning'>[hound.name]'s mobile brig clunks in series as [brigman] slips inside.</span>", "<span class='notice'>Your mobile brig groans lightly as [brigman] slips inside.</span>")
|
||||
playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) // Really don't need ERP sound effects for robots
|
||||
return
|
||||
return
|
||||
@@ -786,7 +806,7 @@
|
||||
injection_chems = null //So they don't have all the same chems as the medihound!
|
||||
var/max_item_count = 32
|
||||
|
||||
/obj/item/weapon/storage/attackby(obj/item/device/dogborg/sleeper/compactor, mob/user, proximity) //GIT CIRCUMVENTED YO!
|
||||
/obj/item/storage/attackby(obj/item/device/dogborg/sleeper/compactor, mob/user, proximity) //GIT CIRCUMVENTED YO!
|
||||
compactor.afterattack(src, user ,1)
|
||||
|
||||
/obj/item/device/dogborg/sleeper/compactor/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)//GARBO NOMS
|
||||
@@ -810,7 +830,9 @@
|
||||
to_chat(user,"<span class='warning'>\The [target] is too large to fit into your [src.name]</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[hound.name] is ingesting [target.name] into their [src.name].</span>", "<span class='notice'>You start ingesting [target] into your [src.name]...</span>")
|
||||
if(do_after(user, 30, target) && length(contents) < max_item_count)
|
||||
if(do_after(user, 30, target = target) && length(contents) < max_item_count)
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't eat them. This still applies to items, don't magically eat things I picked up already.
|
||||
target.forceMove(src)
|
||||
user.visible_message("<span class='warning'>[hound.name]'s garbage processor groans lightly as [target.name] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [target] slips inside.</span>")
|
||||
playsound(hound, 'sound/machines/disposalflush.ogg', 50, 1)
|
||||
@@ -822,7 +844,7 @@
|
||||
else if(ishuman(target))
|
||||
var/mob/living/carbon/human/trashman = target
|
||||
if (!trashman.devourable)
|
||||
to_chat(user, "The target registers an error code.")
|
||||
to_chat(user, "<span class='warning'>\The [target] registers an error code to your [src.name]</span>")
|
||||
return
|
||||
if(patient)
|
||||
to_chat(user,"<span class='warning'>Your [src.name] is already occupied.</span>")
|
||||
@@ -831,7 +853,9 @@
|
||||
to_chat(user,"<span class='warning'>[trashman] is buckled and can not be put into your [src.name].</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[hound.name] is ingesting [trashman] into their [src.name].</span>", "<span class='notice'>You start ingesting [trashman] into your [src.name]...</span>")
|
||||
if(do_after(user, 30, trashman) && !patient && !trashman.buckled && length(contents) < max_item_count)
|
||||
if(do_after(user, 30, target = trashman) && !patient && !trashman.buckled && length(contents) < max_item_count)
|
||||
if(!in_range(src, trashman)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't eat them.
|
||||
trashman.forceMove(src)
|
||||
trashman.reset_perspective(src)
|
||||
update_patient()
|
||||
@@ -844,7 +868,7 @@
|
||||
|
||||
// Pounce stuff for K-9
|
||||
|
||||
/obj/item/weapon/dogborg/pounce
|
||||
/obj/item/dogborg/pounce
|
||||
name = "pounce"
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "pounce"
|
||||
@@ -852,7 +876,7 @@
|
||||
force = 0
|
||||
throwforce = 0
|
||||
|
||||
/obj/item/weapon/dogborg/pounce/New()
|
||||
/obj/item/dogborg/pounce/New()
|
||||
..()
|
||||
flags_1 |= NOBLUDGEON_1
|
||||
|
||||
@@ -868,7 +892,7 @@
|
||||
|
||||
#define MAX_K9_LEAP_DIST 4 //because something's definitely borked the pounce functioning from a distance.
|
||||
|
||||
/obj/item/weapon/dogborg/pounce/afterattack(atom/A, mob/user)
|
||||
/obj/item/dogborg/pounce/afterattack(atom/A, mob/user)
|
||||
var/mob/living/silicon/robot.R = user
|
||||
R.leap_at(A)
|
||||
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
icon = 'icons/mob/pokemon.dmi'
|
||||
var/pokeball
|
||||
pixel_x = -16
|
||||
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab = 5)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 5)
|
||||
ventcrawler = 2
|
||||
health = 100
|
||||
maxHealth = 100
|
||||
@@ -132,7 +132,7 @@
|
||||
/mob/living/simple_animal/pokemon/leg
|
||||
icon = 'icons/mob/legendary.dmi'
|
||||
pixel_x = -32
|
||||
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab = 12)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 12)
|
||||
health = 200
|
||||
maxHealth = 200
|
||||
|
||||
|
||||
+13
-13
@@ -1,7 +1,7 @@
|
||||
//////////
|
||||
//DILDOS//
|
||||
//////////
|
||||
obj/item/weapon/dildo
|
||||
obj/item/dildo
|
||||
name = "dildo"
|
||||
desc = "Floppy!"
|
||||
icon = 'code/citadel/icons/dildo.dmi'
|
||||
@@ -19,7 +19,7 @@ obj/item/weapon/dildo
|
||||
var/random_shape = FALSE
|
||||
//Lists moved to _cit_helpers.dm as globals so they're not instanced individually
|
||||
|
||||
obj/item/weapon/dildo/proc/update_appearance()
|
||||
obj/item/dildo/proc/update_appearance()
|
||||
icon_state = "[dildo_type]_[dildo_shape]_[dildo_size]"
|
||||
var/sizeword = ""
|
||||
switch(dildo_size)
|
||||
@@ -34,7 +34,7 @@ obj/item/weapon/dildo/proc/update_appearance()
|
||||
|
||||
name = "[sizeword][dildo_shape] [can_customize ? "custom " : ""][dildo_type]"
|
||||
|
||||
obj/item/weapon/dildo/AltClick(mob/living/user)
|
||||
obj/item/dildo/AltClick(mob/living/user)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
if(!isliving(user))
|
||||
@@ -45,7 +45,7 @@ obj/item/weapon/dildo/AltClick(mob/living/user)
|
||||
return
|
||||
customize(user)
|
||||
|
||||
obj/item/weapon/dildo/proc/customize(mob/living/user)
|
||||
obj/item/dildo/proc/customize(mob/living/user)
|
||||
if(!can_customize)
|
||||
return FALSE
|
||||
if(src && !user.incapacitated() && in_range(user,src))
|
||||
@@ -74,7 +74,7 @@ obj/item/weapon/dildo/proc/customize(mob/living/user)
|
||||
update_appearance()
|
||||
return TRUE
|
||||
|
||||
obj/item/weapon/dildo/Initialize()
|
||||
obj/item/dildo/Initialize()
|
||||
. = ..()
|
||||
if(random_color == TRUE)
|
||||
var/randcolor = pick(GLOB.dildo_colors)
|
||||
@@ -90,40 +90,40 @@ obj/item/weapon/dildo/Initialize()
|
||||
pixel_y = rand(-7,7)
|
||||
pixel_x = rand(-7,7)
|
||||
|
||||
obj/item/weapon/dildo/examine(mob/user)
|
||||
obj/item/dildo/examine(mob/user)
|
||||
..()
|
||||
if(can_customize)
|
||||
user << "<span class='notice'>Alt-Click \the [src.name] to customize it.</span>"
|
||||
|
||||
obj/item/weapon/dildo/random//totally random
|
||||
obj/item/dildo/random//totally random
|
||||
name = "random dildo"//this name will show up in vendors and shit so you know what you're vending(or don't, i guess :^))
|
||||
random_color = TRUE
|
||||
random_shape = TRUE
|
||||
random_size = TRUE
|
||||
|
||||
|
||||
obj/item/weapon/dildo/knotted
|
||||
obj/item/dildo/knotted
|
||||
dildo_shape = "knotted"
|
||||
name = "knotted dildo"
|
||||
|
||||
obj/item/weapon/dildo/human
|
||||
obj/item/dildo/human
|
||||
dildo_shape = "human"
|
||||
name = "human dildo"
|
||||
|
||||
obj/item/weapon/dildo/plain
|
||||
obj/item/dildo/plain
|
||||
dildo_shape = "plain"
|
||||
name = "plain dildo"
|
||||
|
||||
obj/item/weapon/dildo/flared
|
||||
obj/item/dildo/flared
|
||||
dildo_shape = "flared"
|
||||
name = "flared dildo"
|
||||
|
||||
obj/item/weapon/dildo/flared/huge
|
||||
obj/item/dildo/flared/huge
|
||||
name = "literal horse cock"
|
||||
desc = "THIS THING IS HUGE!"
|
||||
dildo_size = 4
|
||||
|
||||
obj/item/weapon/dildo/custom
|
||||
obj/item/dildo/custom
|
||||
name = "customizable dildo"
|
||||
desc = "Thanks to significant advances in synthetic nanomaterials, this dildo is capable of taking on many different forms to fit the user's preferences! Pricy!"
|
||||
can_customize = TRUE
|
||||
|
||||
@@ -68,14 +68,14 @@
|
||||
/**
|
||||
* Employee reassignment hook.
|
||||
* Called in card.dm when someone's card is reassigned at the HoP's desk.
|
||||
* Parameters: var/obj/item/weapon/card/id
|
||||
* Parameters: var/obj/item/card/id
|
||||
*/
|
||||
/hook/reassign_employee
|
||||
|
||||
/**
|
||||
* Employee terminated hook.
|
||||
* Called in card.dm when someone's card is terminated at the HoP's desk.
|
||||
* Parameters: var/obj/item/weapon/card/id
|
||||
* Parameters: var/obj/item/card/id
|
||||
*/
|
||||
/hook/terminate_employee
|
||||
|
||||
|
||||
@@ -253,16 +253,14 @@ SUBSYSTEM_DEF(blackbox)
|
||||
/datum/feedback_variable/proc/get_variable()
|
||||
return variable
|
||||
|
||||
/datum/feedback_variable/proc/set_details(text)
|
||||
if (istext(text))
|
||||
details = text
|
||||
|
||||
/datum/feedback_variable/proc/add_details(text)
|
||||
if (istext(text))
|
||||
if (!details)
|
||||
details = "\"[text]\""
|
||||
else
|
||||
details += " | \"[text]\""
|
||||
/datum/feedback_variable/proc/set_details(deets)
|
||||
details = "\"[deets]\""
|
||||
|
||||
/datum/feedback_variable/proc/add_details(deets)
|
||||
if (!details)
|
||||
set_details(deets)
|
||||
else
|
||||
details += " | \"[deets]\""
|
||||
|
||||
/datum/feedback_variable/proc/get_details()
|
||||
return details
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#define COMMUNICATION_COOLDOWN 600
|
||||
#define COMMUNICATION_COOLDOWN_AI 600
|
||||
#define COMMUNICATION_COOLDOWN 300
|
||||
#define COMMUNICATION_COOLDOWN_AI 300
|
||||
|
||||
SUBSYSTEM_DEF(communications)
|
||||
name = "Communications"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
SUBSYSTEM_DEF(garbage)
|
||||
name = "Garbage"
|
||||
priority = 15
|
||||
wait = 5
|
||||
wait = 20
|
||||
flags_1 = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT
|
||||
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/LoadSatchels()
|
||||
secret_satchels = new /savefile("data/npc_saves/SecretSatchels.sav")
|
||||
satchel_blacklist = typecacheof(list(/obj/item/stack/tile/plasteel, /obj/item/weapon/crowbar))
|
||||
satchel_blacklist = typecacheof(list(/obj/item/stack/tile/plasteel, /obj/item/crowbar))
|
||||
secret_satchels[SSmapping.config.map_name] >> old_secret_satchels
|
||||
|
||||
var/list/expanded_old_satchels = list()
|
||||
@@ -38,7 +38,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
var/list/free_satchels = list()
|
||||
for(var/turf/T in shuffle(block(locate(TRANSITIONEDGE,TRANSITIONEDGE,ZLEVEL_STATION), locate(world.maxx-TRANSITIONEDGE,world.maxy-TRANSITIONEDGE,ZLEVEL_STATION)))) //Nontrivially expensive but it's roundstart only
|
||||
if(isfloorturf(T) && !istype(T, /turf/open/floor/plating/))
|
||||
free_satchels += new /obj/item/weapon/storage/backpack/satchel/flat/secret(T)
|
||||
free_satchels += new /obj/item/storage/backpack/satchel/flat/secret(T)
|
||||
if(!isemptylist(free_satchels) && ((free_satchels.len + placed_satchels) >= (50 - expanded_old_satchels.len) * 0.1)) //up to six tiles, more than enough to kill anything that moves
|
||||
break
|
||||
|
||||
@@ -59,7 +59,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
if(!path)
|
||||
return 0
|
||||
|
||||
var/obj/item/weapon/storage/backpack/satchel/flat/F = new()
|
||||
var/obj/item/storage/backpack/satchel/flat/F = new()
|
||||
F.x = text2num(chosen_satchel[1])
|
||||
F.y = text2num(chosen_satchel[2])
|
||||
F.z = ZLEVEL_STATION
|
||||
@@ -157,7 +157,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/CollectSecretSatchels()
|
||||
for(var/A in new_secret_satchels)
|
||||
var/obj/item/weapon/storage/backpack/satchel/flat/F = A
|
||||
var/obj/item/storage/backpack/satchel/flat/F = A
|
||||
if(QDELETED(F) || F.z != ZLEVEL_STATION || F.invisibility != INVISIBILITY_MAXIMUM)
|
||||
continue
|
||||
var/list/savable_obj = list()
|
||||
|
||||
@@ -234,8 +234,8 @@
|
||||
UpdateButtonIcon()
|
||||
|
||||
/datum/action/item_action/toggle_unfriendly_fire/UpdateButtonIcon(status_only = FALSE)
|
||||
if(istype(target, /obj/item/weapon/hierophant_club))
|
||||
var/obj/item/weapon/hierophant_club/H = target
|
||||
if(istype(target, /obj/item/hierophant_club))
|
||||
var/obj/item/hierophant_club/H = target
|
||||
if(H.friendly_fire_check)
|
||||
button_icon_state = "vortex_ff_off"
|
||||
name = "Toggle Friendly Fire \[OFF\]"
|
||||
@@ -264,8 +264,8 @@
|
||||
button_icon_state = "vortex_recall"
|
||||
|
||||
/datum/action/item_action/vortex_recall/IsAvailable()
|
||||
if(istype(target, /obj/item/weapon/hierophant_club))
|
||||
var/obj/item/weapon/hierophant_club/H = target
|
||||
if(istype(target, /obj/item/hierophant_club))
|
||||
var/obj/item/hierophant_club/H = target
|
||||
if(H.teleporting)
|
||||
return 0
|
||||
return ..()
|
||||
@@ -351,7 +351,7 @@
|
||||
name = "Toggle Jetpack Stabilization"
|
||||
|
||||
/datum/action/item_action/jetpack_stabilization/IsAvailable()
|
||||
var/obj/item/weapon/tank/jetpack/J = target
|
||||
var/obj/item/tank/jetpack/J = target
|
||||
if(!istype(J) || !J.on)
|
||||
return 0
|
||||
return ..()
|
||||
@@ -431,7 +431,7 @@
|
||||
name = "Create Throwing Stars (1E)"
|
||||
desc = "Creates some throwing stars"
|
||||
button_icon_state = "throwingstar"
|
||||
icon_icon = 'icons/obj/weapons.dmi'
|
||||
icon_icon = 'icons/obj/items_and_weapons.dmi'
|
||||
|
||||
/datum/action/item_action/ninjanet
|
||||
name = "Energy Net (20E)"
|
||||
@@ -443,7 +443,7 @@
|
||||
name = "Recall Energy Katana (Variable Cost)"
|
||||
desc = "Teleports the Energy Katana linked to this suit to its wearer, cost based on distance."
|
||||
button_icon_state = "energy_katana"
|
||||
icon_icon = 'icons/obj/weapons.dmi'
|
||||
icon_icon = 'icons/obj/items_and_weapons.dmi'
|
||||
|
||||
/datum/action/item_action/ninja_stealth
|
||||
name = "Toggle Stealth"
|
||||
|
||||
@@ -320,11 +320,11 @@
|
||||
//Spawn and equip documents
|
||||
var/mob/living/carbon/human/mob = owner.current
|
||||
|
||||
var/obj/item/weapon/folder/syndicate/folder
|
||||
var/obj/item/folder/syndicate/folder
|
||||
if(owner == SSticker.mode.exchange_red)
|
||||
folder = new/obj/item/weapon/folder/syndicate/red(mob.loc)
|
||||
folder = new/obj/item/folder/syndicate/red(mob.loc)
|
||||
else
|
||||
folder = new/obj/item/weapon/folder/syndicate/blue(mob.loc)
|
||||
folder = new/obj/item/folder/syndicate/blue(mob.loc)
|
||||
|
||||
var/list/slots = list (
|
||||
"backpack" = slot_in_backpack,
|
||||
|
||||
@@ -188,7 +188,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
|
||||
if(form == BLOOD_LIZARD && SOULVALUE < BLOOD_THRESHOLD)
|
||||
regress_humanoid()
|
||||
if(SOULVALUE < 0)
|
||||
remove_spells()
|
||||
give_appropriate_spells()
|
||||
to_chat(owner.current, "<span class='warning'>As punishment for your failures, all of your powers except contract creation have been revoked.")
|
||||
|
||||
/datum/antagonist/devil/proc/regress_humanoid()
|
||||
@@ -408,7 +408,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
|
||||
reviveNumber += LOSS_PER_DEATH
|
||||
update_hud()
|
||||
if(body)
|
||||
body.revive(1,0)
|
||||
body.revive(TRUE, TRUE) //Adminrevive also recovers organs, preventing someone from resurrecting without a heart.
|
||||
if(istype(body.loc, /obj/effect/dummy/slaughter/))
|
||||
body.forceMove(get_turf(body))//Fixes dying while jaunted leaving you permajaunted.
|
||||
if(istype(body, /mob/living/carbon/true_devil))
|
||||
@@ -437,8 +437,8 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/black(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_hands)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/pen(H), slot_l_store)
|
||||
H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), slot_hands)
|
||||
H.equip_to_slot_or_del(new /obj/item/pen(H), slot_l_store)
|
||||
if(SOULVALUE >= BLOOD_THRESHOLD)
|
||||
H.set_species(/datum/species/lizard, 1)
|
||||
H.underwear = "Nude"
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
qdel(H.gloves)
|
||||
|
||||
var/obj/item/clothing/suit/space/space_ninja/theSuit = new(H)
|
||||
var/obj/item/weapon/dash/energy_katana/EK = new(H)
|
||||
var/obj/item/dash/energy_katana/EK = new(H)
|
||||
theSuit.energyKatana = EK
|
||||
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_ears)
|
||||
@@ -42,12 +42,12 @@
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(H), slot_glasses)
|
||||
H.equip_to_slot_or_del(EK, slot_belt)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/flashlight(H), slot_r_store)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(H), slot_l_store)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(H), slot_s_store)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(H), slot_back)
|
||||
H.equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(H), slot_l_store)
|
||||
H.equip_to_slot_or_del(new /obj/item/tank/internals/emergency_oxygen(H), slot_s_store)
|
||||
H.equip_to_slot_or_del(new /obj/item/tank/jetpack/carbondioxide(H), slot_back)
|
||||
theSuit.randomize_param()
|
||||
|
||||
var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(H)
|
||||
var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H)
|
||||
E.implant(H)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -27,17 +27,21 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
|
||||
### Vars
|
||||
|
||||
1. `/datum/var/list/datum_components` (private)
|
||||
* Lazy list of all components a datum has (TODO: Make this a typecache with longer paths overwriting shorter ones maybe? It'd be weird)
|
||||
* Lazy associated list of type -> component/list of components.
|
||||
1. `/datum/component/var/enabled` (protected, boolean)
|
||||
* If the component is enabled. If not, it will not react to signals
|
||||
* TRUE by default
|
||||
* `TRUE` by default
|
||||
1. `/datum/component/var/dupe_mode` (protected, enum)
|
||||
* How multiple components of the exact same type are handled when added to the datum.
|
||||
* How duplicate component types are handled when added to the datum.
|
||||
* `COMPONENT_DUPE_HIGHLANDER` (default): Old component will be deleted, new component will first have `/datum/component/proc/InheritComponent(datum/component/old, FALSE)` on it
|
||||
* `COMPONENT_DUPE_ALLOWED`: The components will be treated as seperate, `GetComponent()` will return the first added
|
||||
* `COMPONENT_DUPE_ALLOWED`: The components will be treated as separate, `GetComponent()` will return the first added
|
||||
* `COMPONENT_DUPE_UNIQUE`: New component will be deleted, old component will first have `/datum/component/proc/InheritComponent(datum/component/new, TRUE)` on it
|
||||
1. `/datum/component/var/dupe_type` (protected, type)
|
||||
* Definition of a duplicate component type
|
||||
* `null` means exact match on `type`
|
||||
* Any other type means that and all subtypes
|
||||
1. `/datum/component/var/list/signal_procs` (private)
|
||||
* Associated lazy list of signals -> callbacks that will be run when the parent datum recieves that signal
|
||||
* Associated lazy list of signals -> `/datum/callback`s that will be run when the parent datum recieves that signal
|
||||
1. `/datum/component/var/datum/parent` (protected, read-only)
|
||||
* The datum this component belongs to
|
||||
|
||||
@@ -52,10 +56,12 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
|
||||
1. `GET_COMPONENT(varname, component_type)` OR `GET_COMPONENT_FROM(varname, component_type, src)`
|
||||
* Shorthand for `var/component_type/varname = src.GetComponent(component_type)`
|
||||
1. `/datum/proc/AddComponent(component_type(type), ...) -> datum/component` (public, final)
|
||||
* Creates an instance of `component_type` in the datum and passes `...` to it's `New()` call
|
||||
* Creates an instance of `component_type` in the datum and passes `...` to its `Initialize()` call
|
||||
* Sends the `COMSIG_COMPONENT_ADDED` signal to the datum
|
||||
* All components a datum owns are deleted with the datum
|
||||
* Returns the component that was created. Or the old component in a dupe situation where `COMPONENT_DUPE_UNIQUE` was set
|
||||
1. `/datum/proc/LoadComponent(component_type(type), ...) -> datum/component` (public, final)
|
||||
* Equivalent to calling `GetComponent(component_type)` where, if the result would be `null`, returns `AddComponent(component_type, ...)` instead
|
||||
1. `/datum/proc/ComponentActivated(datum/component/C)` (abstract)
|
||||
* Called on a component's `parent` after a signal recieved causes it to activate. `src` is the parameter
|
||||
* Will only be called if a component's callback returns `TRUE`
|
||||
@@ -66,16 +72,24 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
|
||||
1. `/datum/proc/SendSignal(signal, ...)` (public, final)
|
||||
* Call to send a signal to the components of the target datum
|
||||
* Extra arguments are to be specified in the signal definition
|
||||
1. `/datum/component/New(datum/parent, ...)` (protected, virtual)
|
||||
* Forwarded the arguments from `AddComponent()`
|
||||
1. `/datum/component/Destroy()` (virtual)
|
||||
1. `/datum/component/New(datum/parent, ...)` (private, final)
|
||||
* Runs internal setup for the component
|
||||
* Extra arguments are passed to `Initialize()`
|
||||
1. `/datum/component/Initialize(...)` (abstract, no-sleep)
|
||||
* Called by `New()` with the same argments excluding `parent`
|
||||
* Component does not exist in `parent`'s `datum_components` list yet, although `parent` is set and may be used
|
||||
* Signals will not be recieved while this function is running
|
||||
* Component may be deleted after this function completes without being attached
|
||||
1. `/datum/component/Destroy()` (virtual, no-sleep)
|
||||
* Sends the `COMSIG_COMPONENT_REMOVING` signal to the parent datum if the `parent` isn't being qdeleted
|
||||
* Properly removes the component from `parent` and cleans up references
|
||||
1. `/datum/component/proc/InheritComponent(datum/component/C, i_am_original(boolean))` (abstract)
|
||||
1. `/datum/component/proc/InheritComponent(datum/component/C, i_am_original(boolean))` (abstract, no-sleep)
|
||||
* Called on a component when a component of the same type was added to the same parent
|
||||
* See `/datum/component/var/dupe_mode`
|
||||
* `C`'s type will always be the same of the called component
|
||||
1. `/datum/component/proc/OnTransfer(datum/new_parent)` (abstract)
|
||||
1. `/datum/component/proc/AfterComponentActivated()` (abstract)
|
||||
* Called on a component that was activated after it's `parent`'s `ComponentActivated()` is called
|
||||
1. `/datum/component/proc/OnTransfer(datum/new_parent)` (abstract, no-sleep)
|
||||
* Called before the new `parent` is assigned in `TakeComponent()`, after the remove signal, before the added signal
|
||||
* Allows the component to react to ownership transfers
|
||||
1. `/datum/component/proc/_RemoveNoSignal()` (private, final)
|
||||
@@ -91,9 +105,4 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
|
||||
* Called when a component recieves any signal and is enabled
|
||||
* Default implementation looks if the signal is registered and runs the appropriate proc
|
||||
|
||||
### See signals and their arguments in __DEFINES\components.dm
|
||||
|
||||
## Examples
|
||||
Material Containers: #29268 (Too many GetComponent calls, but not bad)
|
||||
Slips: #00000 (PR DIS)
|
||||
Powercells: (TODO)
|
||||
### See/Define signals and their arguments in __DEFINES\components.dm
|
||||
|
||||
@@ -19,15 +19,16 @@
|
||||
old = P.GetExactComponent(type)
|
||||
else
|
||||
old = P.GetComponent(dt)
|
||||
switch(dm)
|
||||
if(COMPONENT_DUPE_UNIQUE)
|
||||
old.InheritComponent(src, TRUE)
|
||||
parent = null //prevent COMPONENT_REMOVING signal
|
||||
qdel(src)
|
||||
return
|
||||
if(COMPONENT_DUPE_HIGHLANDER)
|
||||
InheritComponent(old, FALSE)
|
||||
qdel(old)
|
||||
if(old)
|
||||
switch(dm)
|
||||
if(COMPONENT_DUPE_UNIQUE)
|
||||
old.InheritComponent(src, TRUE)
|
||||
parent = null //prevent COMPONENT_REMOVING signal
|
||||
qdel(src)
|
||||
return
|
||||
if(COMPONENT_DUPE_HIGHLANDER)
|
||||
InheritComponent(old, FALSE)
|
||||
qdel(old)
|
||||
|
||||
//let the others know
|
||||
P.SendSignal(COMSIG_COMPONENT_ADDED, src)
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
/datum/component/slippery
|
||||
var/intensity
|
||||
var/lube_flags
|
||||
var/mob/slip_victim
|
||||
|
||||
/datum/component/slippery/Initialize(_intensity, _lube_flags = NONE)
|
||||
intensity = max(_intensity, 0)
|
||||
lube_flags = _lube_flags
|
||||
if(ismovableatom(parent))
|
||||
RegisterSignal(COMSIG_MOVABLE_CROSSED, .proc/Slip)
|
||||
else
|
||||
RegisterSignal(COMSIG_ATOM_ENTERED, .proc/Slip)
|
||||
|
||||
/datum/component/slippery/proc/Slip(atom/movable/AM)
|
||||
var/mob/victim = AM
|
||||
if(istype(victim) && !victim.is_flying() && victim.slip(intensity, parent, lube_flags))
|
||||
slip_victim = victim
|
||||
return TRUE
|
||||
|
||||
/datum/component/slippery/AfterComponentActivated()
|
||||
slip_victim = null
|
||||
@@ -210,8 +210,8 @@
|
||||
if(!C)
|
||||
C = H.client
|
||||
var/image = get_id_photo(H, C)
|
||||
var/obj/item/weapon/photo/photo_front = new()
|
||||
var/obj/item/weapon/photo/photo_side = new()
|
||||
var/obj/item/photo/photo_front = new()
|
||||
var/obj/item/photo/photo_side = new()
|
||||
photo_front.photocreate(null, icon(image, dir = SOUTH))
|
||||
photo_side.photocreate(null, icon(image, dir = WEST))
|
||||
|
||||
|
||||
+11
-5
@@ -22,10 +22,16 @@
|
||||
continue
|
||||
qdel(timer)
|
||||
var/list/dc = datum_components
|
||||
for(var/I in dc)
|
||||
var/datum/component/C = I
|
||||
C._RemoveNoSignal()
|
||||
qdel(C)
|
||||
if(dc)
|
||||
var/all_components = dc[/datum/component]
|
||||
if(islist(all_components))
|
||||
for(var/I in all_components)
|
||||
var/datum/component/C = I
|
||||
C._RemoveNoSignal()
|
||||
qdel(C)
|
||||
else
|
||||
var/datum/component/C = all_components
|
||||
C._RemoveNoSignal()
|
||||
qdel(C)
|
||||
dc.Cut()
|
||||
return QDEL_HINT_QUEUE
|
||||
return QDEL_HINT_QUEUE
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
|
||||
switch(target_zone)
|
||||
if(1)
|
||||
if(isobj(H.head) && !istype(H.head, /obj/item/weapon/paper))
|
||||
if(isobj(H.head) && !istype(H.head, /obj/item/paper))
|
||||
Cl = H.head
|
||||
passed = prob((Cl.permeability_coefficient*100) - 1)
|
||||
if(passed && isobj(H.wear_mask))
|
||||
|
||||
@@ -78,7 +78,7 @@ STI KALY - blind
|
||||
else
|
||||
var/mob/living/carbon/H = affected_mob
|
||||
if(prob(chance))
|
||||
var/obj/item/weapon/staff/S = new(H)
|
||||
var/obj/item/staff/S = new(H)
|
||||
if(!H.put_in_hands(S))
|
||||
qdel(S)
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
msg = replace_pronoun(user, msg)
|
||||
|
||||
var/mob/living/L = user
|
||||
for(var/obj/item/weapon/implant/I in L.implants)
|
||||
for(var/obj/item/implant/I in L.implants)
|
||||
I.trigger(key, L)
|
||||
|
||||
if(!msg)
|
||||
|
||||
@@ -149,10 +149,10 @@
|
||||
|
||||
/datum/teleport/instant/science/setPrecision(aprecision)
|
||||
..()
|
||||
if(istype(teleatom, /obj/item/weapon/storage/backpack/holding))
|
||||
if(istype(teleatom, /obj/item/storage/backpack/holding))
|
||||
precision = rand(1,100)
|
||||
|
||||
var/list/bagholding = teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)
|
||||
var/list/bagholding = teleatom.search_contents_for(/obj/item/storage/backpack/holding)
|
||||
if(bagholding.len)
|
||||
precision = max(rand(1,100)*bagholding.len,100)
|
||||
if(isliving(teleatom))
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
var/config_max_users = 0
|
||||
var/config_min_users = 0
|
||||
var/voteweight = 1
|
||||
|
||||
var/allow_custom_shuttles = "yes"
|
||||
/datum/map_config/New(filename = "data/next_map.json", default_to_box, delete_after)
|
||||
if(default_to_box)
|
||||
return
|
||||
@@ -44,12 +44,12 @@
|
||||
if(!json)
|
||||
log_world("Could not open map_config: [filename]")
|
||||
return
|
||||
|
||||
|
||||
json = file2text(json)
|
||||
if(!json)
|
||||
log_world("map_config is not text: [filename]")
|
||||
return
|
||||
|
||||
|
||||
json = json_decode(json)
|
||||
if(!json)
|
||||
log_world("map_config is not json: [filename]")
|
||||
@@ -58,7 +58,7 @@
|
||||
if(!ValidateJSON(json))
|
||||
log_world("map_config failed to validate for above reason: [filename]")
|
||||
return
|
||||
|
||||
|
||||
config_filename = filename
|
||||
|
||||
map_name = json["map_name"]
|
||||
@@ -66,6 +66,7 @@
|
||||
map_file = json["map_file"]
|
||||
|
||||
minetype = json["minetype"]
|
||||
allow_custom_shuttles = json["allow_custom_shuttles"]
|
||||
|
||||
var/list/jtcl = json["transition_config"]
|
||||
|
||||
@@ -74,7 +75,7 @@
|
||||
|
||||
for(var/I in jtcl)
|
||||
transition_config[TransitionStringToEnum(I)] = TransitionStringToEnum(jtcl[I])
|
||||
|
||||
|
||||
defaulted = FALSE
|
||||
|
||||
#define CHECK_EXISTS(X) if(!istext(json[X])) { log_world(X + "missing from json!"); return; }
|
||||
@@ -84,6 +85,7 @@
|
||||
CHECK_EXISTS("map_file")
|
||||
CHECK_EXISTS("minetype")
|
||||
CHECK_EXISTS("transition_config")
|
||||
CHECK_EXISTS("allow_custom_shuttles")
|
||||
|
||||
var/path = GetFullMapPath(json["map_path"], json["map_file"])
|
||||
if(!fexists(path))
|
||||
@@ -92,7 +94,7 @@
|
||||
|
||||
if(json["transition_config"] != "default")
|
||||
if(!islist(json["transition_config"]))
|
||||
log_world("transition_config is not a list!")
|
||||
log_world("transition_config is not a list!")
|
||||
return
|
||||
|
||||
var/list/jtcl = json["transition_config"]
|
||||
|
||||
@@ -181,13 +181,13 @@
|
||||
|
||||
to_chat(usr, "<b><i>In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter attacks done to you.</i></b>")
|
||||
|
||||
/obj/item/weapon/cqc_manual
|
||||
/obj/item/cqc_manual
|
||||
name = "old manual"
|
||||
desc = "A small, black manual. There are drawn instructions of tactical hand-to-hand combat."
|
||||
icon = 'icons/obj/library.dmi'
|
||||
icon_state ="cqcmanual"
|
||||
|
||||
/obj/item/weapon/cqc_manual/attack_self(mob/living/carbon/human/user)
|
||||
/obj/item/cqc_manual/attack_self(mob/living/carbon/human/user)
|
||||
if(!istype(user) || !user)
|
||||
return
|
||||
to_chat(user, "<span class='boldannounce'>You remember the basics of CQC.</span>")
|
||||
|
||||
@@ -93,14 +93,14 @@
|
||||
to_chat(usr, "<span class='notice'>Throwback</span>: Disarm Harm Disarm. Throws the target and an item at them.")
|
||||
to_chat(usr, "<span class='notice'>The Plasma Fist</span>: Harm Disarm Disarm Disarm Harm. Knocks the brain out of the opponent and gibs their body.")
|
||||
|
||||
/obj/item/weapon/plasma_fist_scroll
|
||||
/obj/item/plasma_fist_scroll
|
||||
name = "frayed scroll"
|
||||
desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state ="scroll2"
|
||||
var/used = 0
|
||||
|
||||
/obj/item/weapon/plasma_fist_scroll/attack_self(mob/user)
|
||||
/obj/item/plasma_fist_scroll/attack_self(mob/user)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
if(!used)
|
||||
|
||||
@@ -154,13 +154,13 @@
|
||||
to_chat(usr, "<span class='notice'>Head Kick</span>: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand.")
|
||||
to_chat(usr, "<span class='notice'>Elbow Drop</span>: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition.")
|
||||
|
||||
/obj/item/weapon/sleeping_carp_scroll
|
||||
/obj/item/sleeping_carp_scroll
|
||||
name = "mysterious scroll"
|
||||
desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "scroll2"
|
||||
|
||||
/obj/item/weapon/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user)
|
||||
/obj/item/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user)
|
||||
if(!istype(user) || !user)
|
||||
return
|
||||
var/message = "<span class='sciradio'>You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \
|
||||
@@ -173,7 +173,7 @@
|
||||
new /obj/effect/decal/cleanable/ash(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/twohanded/bostaff
|
||||
/obj/item/twohanded/bostaff
|
||||
name = "bo staff"
|
||||
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
|
||||
force = 10
|
||||
@@ -184,17 +184,17 @@
|
||||
throwforce = 20
|
||||
throw_speed = 2
|
||||
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "bostaff0"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
|
||||
block_chance = 50
|
||||
|
||||
/obj/item/weapon/twohanded/bostaff/update_icon()
|
||||
/obj/item/twohanded/bostaff/update_icon()
|
||||
icon_state = "bostaff[wielded]"
|
||||
return
|
||||
|
||||
/obj/item/weapon/twohanded/bostaff/attack(mob/target, mob/living/user)
|
||||
/obj/item/twohanded/bostaff/attack(mob/target, mob/living/user)
|
||||
add_fingerprint(user)
|
||||
if((CLUMSY in user.disabilities) && prob(50))
|
||||
to_chat(user, "<span class ='warning'>You club yourself over the head with [src].</span>")
|
||||
@@ -243,7 +243,7 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
/obj/item/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(wielded)
|
||||
return ..()
|
||||
return 0
|
||||
|
||||
@@ -438,11 +438,11 @@
|
||||
add_logs(A, D, "cinched")
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/storage/belt/champion/wrestling
|
||||
/obj/item/storage/belt/champion/wrestling
|
||||
name = "Wrestling Belt"
|
||||
var/datum/martial_art/wrestling/style = new
|
||||
|
||||
/obj/item/weapon/storage/belt/champion/wrestling/equipped(mob/user, slot)
|
||||
/obj/item/storage/belt/champion/wrestling/equipped(mob/user, slot)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
if(slot == slot_belt)
|
||||
@@ -450,7 +450,7 @@
|
||||
style.teach(H,1)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/belt/champion/wrestling/dropped(mob/user)
|
||||
/obj/item/storage/belt/champion/wrestling/dropped(mob/user)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
@@ -223,7 +223,7 @@
|
||||
name = "Metal"
|
||||
id = MAT_METAL
|
||||
sheet_type = /obj/item/stack/sheet/metal
|
||||
coin_type = /obj/item/weapon/coin/iron
|
||||
coin_type = /obj/item/coin/iron
|
||||
|
||||
/datum/material/glass
|
||||
name = "Glass"
|
||||
@@ -234,31 +234,31 @@
|
||||
name = "Silver"
|
||||
id = MAT_SILVER
|
||||
sheet_type = /obj/item/stack/sheet/mineral/silver
|
||||
coin_type = /obj/item/weapon/coin/silver
|
||||
coin_type = /obj/item/coin/silver
|
||||
|
||||
/datum/material/gold
|
||||
name = "Gold"
|
||||
id = MAT_GOLD
|
||||
sheet_type = /obj/item/stack/sheet/mineral/gold
|
||||
coin_type = /obj/item/weapon/coin/gold
|
||||
coin_type = /obj/item/coin/gold
|
||||
|
||||
/datum/material/diamond
|
||||
name = "Diamond"
|
||||
id = MAT_DIAMOND
|
||||
sheet_type = /obj/item/stack/sheet/mineral/diamond
|
||||
coin_type = /obj/item/weapon/coin/diamond
|
||||
coin_type = /obj/item/coin/diamond
|
||||
|
||||
/datum/material/uranium
|
||||
name = "Uranium"
|
||||
id = MAT_URANIUM
|
||||
sheet_type = /obj/item/stack/sheet/mineral/uranium
|
||||
coin_type = /obj/item/weapon/coin/uranium
|
||||
coin_type = /obj/item/coin/uranium
|
||||
|
||||
/datum/material/plasma
|
||||
name = "Solid Plasma"
|
||||
id = MAT_PLASMA
|
||||
sheet_type = /obj/item/stack/sheet/mineral/plasma
|
||||
coin_type = /obj/item/weapon/coin/plasma
|
||||
coin_type = /obj/item/coin/plasma
|
||||
|
||||
/datum/material/bluespace
|
||||
name = "Bluespace Mesh"
|
||||
@@ -269,7 +269,7 @@
|
||||
name = "Bananium"
|
||||
id = MAT_BANANIUM
|
||||
sheet_type = /obj/item/stack/sheet/mineral/bananium
|
||||
coin_type = /obj/item/weapon/coin/clown
|
||||
coin_type = /obj/item/coin/clown
|
||||
|
||||
/datum/material/titanium
|
||||
name = "Titanium"
|
||||
|
||||
+2
-2
@@ -271,7 +271,7 @@
|
||||
var/list/all_contents = traitor_mob.GetAllContents()
|
||||
var/obj/item/device/pda/PDA = locate() in all_contents
|
||||
var/obj/item/device/radio/R = locate() in all_contents
|
||||
var/obj/item/weapon/pen/P = locate() in all_contents //including your PDA-pen!
|
||||
var/obj/item/pen/P = locate() in all_contents //including your PDA-pen!
|
||||
|
||||
var/obj/item/uplink_loc
|
||||
|
||||
@@ -1038,7 +1038,7 @@
|
||||
|
||||
if("takeequip")
|
||||
var/list/L = current.get_contents()
|
||||
for(var/obj/item/weapon/pen/gang/pen in L)
|
||||
for(var/obj/item/pen/gang/pen in L)
|
||||
qdel(pen)
|
||||
for(var/obj/item/device/gangtool/gangtool in L)
|
||||
qdel(gangtool)
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
H.update_action_buttons_icon()
|
||||
if(implants)
|
||||
for(var/implant_type in implants)
|
||||
var/obj/item/weapon/implant/I = new implant_type(H)
|
||||
var/obj/item/implant/I = new implant_type(H)
|
||||
I.implant(H, null, silent=TRUE)
|
||||
|
||||
H.update_body()
|
||||
|
||||
@@ -35,8 +35,8 @@
|
||||
|
||||
/datum/recipe
|
||||
var/list/reagents_list // example: = list("berryjuice" = 5) // do not list same reagent twice
|
||||
var/list/items // example: =list(/obj/item/weapon/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo
|
||||
var/result //example: = /obj/item/weapon/reagent_containers/food/snacks/donut
|
||||
var/list/items // example: =list(/obj/item/crowbar, /obj/item/welder) // place /foo/bar before /foo
|
||||
var/result //example: = /obj/item/reagent_containers/food/snacks/donut
|
||||
var/time = 100 // 1/10 part of second
|
||||
|
||||
|
||||
|
||||
@@ -255,7 +255,7 @@
|
||||
|
||||
///////////////BOATS////////////
|
||||
/datum/riding/boat
|
||||
keytype = /obj/item/weapon/oar
|
||||
keytype = /obj/item/oar
|
||||
|
||||
/datum/riding/boat/handle_ride(mob/user, direction)
|
||||
var/turf/next = get_step(ridden, direction)
|
||||
@@ -416,7 +416,7 @@
|
||||
|
||||
/obj/item/riding_offhand
|
||||
name = "offhand"
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "offhand"
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
flags_1 = ABSTRACT_1 | DROPDEL_1 | NOBLUDGEON_1
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
diff a/code/datums/riding.dm b/code/datums/riding.dm (rejected hunks)
|
||||
@@ -419,7 +419,7 @@
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/items_and_weapons.dmi.dmi'
|
||||
icon_state = "offhand"
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
- flags = ABSTRACT | DROPDEL | NOBLUDGEON
|
||||
|
||||
@@ -192,7 +192,7 @@
|
||||
/datum/status_effect/his_grace/tick()
|
||||
bloodlust = 0
|
||||
var/graces = 0
|
||||
for(var/obj/item/weapon/his_grace/HG in owner.held_items)
|
||||
for(var/obj/item/his_grace/HG in owner.held_items)
|
||||
if(HG.bloodthirst > bloodlust)
|
||||
bloodlust = HG.bloodthirst
|
||||
if(HG.awakened)
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
alerttooltipstyle = "hisgrace"
|
||||
|
||||
/datum/status_effect/his_wrath/tick()
|
||||
for(var/obj/item/weapon/his_grace/HG in owner.held_items)
|
||||
for(var/obj/item/his_grace/HG in owner.held_items)
|
||||
qdel(src)
|
||||
return
|
||||
owner.adjustBruteLoss(0.1)
|
||||
@@ -139,6 +139,20 @@
|
||||
if(owner.m_intent == MOVE_INTENT_WALK)
|
||||
owner.toggle_move_intent()
|
||||
|
||||
/datum/status_effect/geis_tracker
|
||||
id = "geis_tracker"
|
||||
duration = -1
|
||||
alert_type = null
|
||||
var/obj/structure/destructible/clockwork/geis_binding/binding
|
||||
|
||||
/datum/status_effect/geis_tracker/on_creation(mob/living/new_owner, obj/structure/destructible/clockwork/geis_binding/new_binding)
|
||||
. = ..()
|
||||
if(.)
|
||||
binding = new_binding
|
||||
|
||||
/datum/status_effect/geis_tracker/tick()
|
||||
if(QDELETED(binding))
|
||||
qdel(src)
|
||||
|
||||
/datum/status_effect/maniamotor
|
||||
id = "maniamotor"
|
||||
@@ -243,9 +257,9 @@
|
||||
status_type = STATUS_EFFECT_REPLACE
|
||||
alert_type = null
|
||||
var/mutable_appearance/marked_underlay
|
||||
var/obj/item/weapon/twohanded/required/kinetic_crusher/hammer_synced
|
||||
var/obj/item/twohanded/required/kinetic_crusher/hammer_synced
|
||||
|
||||
/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/weapon/twohanded/required/kinetic_crusher/new_hammer_synced)
|
||||
/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/twohanded/required/kinetic_crusher/new_hammer_synced)
|
||||
. = ..()
|
||||
if(.)
|
||||
hammer_synced = new_hammer_synced
|
||||
|
||||
@@ -13,16 +13,16 @@
|
||||
|
||||
|
||||
/datum/wires/explosive/c4
|
||||
holder_type = /obj/item/weapon/grenade/plastic/c4
|
||||
holder_type = /obj/item/grenade/plastic/c4
|
||||
randomize = TRUE //Same behaviour since no wire actually disarms it
|
||||
|
||||
/datum/wires/explosive/c4/interactable(mob/user)
|
||||
var/obj/item/weapon/grenade/plastic/c4/P = holder
|
||||
var/obj/item/grenade/plastic/c4/P = holder
|
||||
if(P.open_panel)
|
||||
return TRUE
|
||||
|
||||
/datum/wires/explosive/c4/explode()
|
||||
var/obj/item/weapon/grenade/plastic/c4/P = holder
|
||||
var/obj/item/grenade/plastic/c4/P = holder
|
||||
P.explode()
|
||||
|
||||
|
||||
@@ -73,8 +73,8 @@
|
||||
|
||||
|
||||
/datum/wires/explosive/gibtonite
|
||||
holder_type = /obj/item/weapon/twohanded/required/gibtonite
|
||||
holder_type = /obj/item/twohanded/required/gibtonite
|
||||
|
||||
/datum/wires/explosive/gibtonite/explode()
|
||||
var/obj/item/weapon/twohanded/required/gibtonite/P = holder
|
||||
var/obj/item/twohanded/required/gibtonite/P = holder
|
||||
P.GibtoniteReaction(null, 2)
|
||||
@@ -3,7 +3,7 @@
|
||||
/proc/is_wire_tool(obj/item/I)
|
||||
if(istype(I, /obj/item/device/multitool))
|
||||
return TRUE
|
||||
if(istype(I, /obj/item/weapon/wirecutters))
|
||||
if(istype(I, /obj/item/wirecutters))
|
||||
return TRUE
|
||||
if(istype(I, /obj/item/device/assembly))
|
||||
var/obj/item/device/assembly/A = I
|
||||
@@ -227,7 +227,7 @@
|
||||
var/obj/item/I = L.get_active_held_item()
|
||||
switch(action)
|
||||
if("cut")
|
||||
if(istype(I, /obj/item/weapon/wirecutters) || IsAdminGhost(usr))
|
||||
if(istype(I, /obj/item/wirecutters) || IsAdminGhost(usr))
|
||||
playsound(holder, I.usesound, 20, 1)
|
||||
cut_color(target_wire)
|
||||
. = TRUE
|
||||
|
||||
@@ -264,21 +264,44 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Central Asteroid Maintenance"
|
||||
icon_state = "maintcentral"
|
||||
|
||||
/area/maintenance/asteroid/disposal/east
|
||||
name = "Eastern External Waste Belt"
|
||||
/area/maintenance/asteroid/disposal
|
||||
icon_state = "disposal"
|
||||
|
||||
/area/maintenance/asteroid/disposal/north
|
||||
name = "Northern External Waste Belt"
|
||||
icon_state = "disposal"
|
||||
name = "Northern Disposal"
|
||||
|
||||
/area/maintenance/asteroid/disposal/southeast
|
||||
name = "South-Eastern Disposal"
|
||||
icon_state = "disposal"
|
||||
/area/maintenance/asteroid/disposal/north/east
|
||||
name = "North-Eastern Disposal"
|
||||
|
||||
/area/maintenance/asteroid/disposal/southwest
|
||||
/area/maintenance/asteroid/disposal/north/west
|
||||
name = "North-Western Disposal"
|
||||
|
||||
/area/maintenance/asteroid/disposal/east
|
||||
name = "Eastern Disposal"
|
||||
|
||||
/area/maintenance/asteroid/disposal/west
|
||||
name = "Western Disposal"
|
||||
|
||||
/area/maintenance/asteroid/disposal/west/secondary
|
||||
name = "Secondary Western Disposal"
|
||||
|
||||
/area/maintenance/asteroid/disposal/south
|
||||
name = "Southern Disposal"
|
||||
|
||||
/area/maintenance/asteroid/disposal/south/west
|
||||
name = "South-Western Disposal"
|
||||
icon_state = "disposal"
|
||||
|
||||
/area/maintenance/asteroid/disposal/external/east
|
||||
name = "Eastern External Waste Belt"
|
||||
|
||||
/area/maintenance/asteroid/disposal/external/north
|
||||
name = "Northern External Waste Belt"
|
||||
|
||||
/area/maintenance/asteroid/disposal/external/southeast
|
||||
name = "South-Eastern External Waste Belt"
|
||||
|
||||
/area/maintenance/asteroid/disposal/external/southwest
|
||||
name = "South-Western External Waste Belt"
|
||||
|
||||
/area/maintenance/asteroid/fore/cargo_west
|
||||
name = "Fore Asteroid Maintenance"
|
||||
@@ -531,15 +554,19 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/crew_quarters/toilet/locker
|
||||
name = "Locker Toilets"
|
||||
icon_state = "toilet"
|
||||
|
||||
|
||||
/area/crew_quarters/toilet/fitness
|
||||
name = "Fitness Toilets"
|
||||
icon_state = "toilet"
|
||||
|
||||
/area/crew_quarters/toilet/female
|
||||
name = "Female Toilets"
|
||||
icon_state = "toilet"
|
||||
|
||||
|
||||
/area/crew_quarters/toilet/male
|
||||
name = "Male Toilets"
|
||||
icon_state = "toilet"
|
||||
|
||||
|
||||
/area/crew_quarters/toilet/restrooms
|
||||
name = "Restrooms"
|
||||
icon_state = "toilet"
|
||||
@@ -817,13 +844,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Starboard Bow Auxiliary Solar Maintenance"
|
||||
icon_state = "SolarcontrolA"
|
||||
|
||||
/area/assembly/assembly_line //Derelict Assembly Line
|
||||
name = "Assembly Line"
|
||||
icon_state = "ass_line"
|
||||
power_equip = FALSE
|
||||
power_light = FALSE
|
||||
power_environ = FALSE
|
||||
|
||||
//Teleporter
|
||||
|
||||
/area/teleporter
|
||||
@@ -1007,10 +1027,15 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Firing Range"
|
||||
icon_state = "firingrange"
|
||||
|
||||
/area/security/transfer
|
||||
name = "Transfer Centre"
|
||||
/area/security/execution
|
||||
icon_state = "execution_room"
|
||||
|
||||
/area/security/execution/transfer
|
||||
name = "Transfer Centre"
|
||||
|
||||
/area/security/execution/education
|
||||
name = "Prisoner Education Chamber"
|
||||
|
||||
/area/security/nuke_storage
|
||||
name = "Vault"
|
||||
icon_state = "nuke_storage"
|
||||
@@ -1463,7 +1488,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
|
||||
//SPACE STATION 13
|
||||
GLOBAL_LIST_INIT(the_station_areas, list (
|
||||
/area/assembly,
|
||||
/area/bridge,
|
||||
/area/chapel,
|
||||
/area/construction,
|
||||
@@ -1490,4 +1514,4 @@ GLOBAL_LIST_INIT(the_station_areas, list (
|
||||
/area/ai_monitored/turret_protected/ai_upload, //do not try to simplify to "/area/ai_monitored/turret_protected" --rastaf0
|
||||
/area/ai_monitored/turret_protected/ai_upload_foyer,
|
||||
/area/ai_monitored/turret_protected/ai,
|
||||
))
|
||||
))
|
||||
|
||||
@@ -477,3 +477,9 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
valid_territory = FALSE
|
||||
blob_allowed = FALSE
|
||||
addSorted()
|
||||
|
||||
/area/AllowDrop()
|
||||
CRASH("Bad op: area/AllowDrop() called")
|
||||
|
||||
/area/drop_location()
|
||||
CRASH("Bad op: area/drop_location() called")
|
||||
|
||||
@@ -22,22 +22,6 @@
|
||||
|
||||
//Misc
|
||||
|
||||
/area/wreck/ai
|
||||
name = "AI Chamber"
|
||||
icon_state = "ai"
|
||||
|
||||
/area/wreck/main
|
||||
name = "Wreck"
|
||||
icon_state = "storage"
|
||||
|
||||
/area/wreck/engineering
|
||||
name = "Power Room"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/wreck/bridge
|
||||
name = "Bridge"
|
||||
icon_state = "bridge"
|
||||
|
||||
/area/generic
|
||||
name = "Unknown"
|
||||
icon_state = "storage"
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
//Parent types
|
||||
|
||||
/area/ruin
|
||||
name = "\improper Unexplored Location"
|
||||
icon_state = "away"
|
||||
has_gravity = TRUE
|
||||
hidden = TRUE
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
|
||||
|
||||
/area/ruin/unpowered
|
||||
always_unpowered = FALSE
|
||||
|
||||
/area/ruin/unpowered/no_grav
|
||||
has_gravity = FALSE
|
||||
|
||||
/area/ruin/powered
|
||||
requires_power = FALSE
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
//Lavaland Ruins
|
||||
|
||||
/area/ruin/powered/beach
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/clownplanet
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/animal_hospital
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/snow_biodome
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/gluttony
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/golem_ship
|
||||
name = "Free Golem Ship"
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/greed
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/unpowered/hierophant
|
||||
name = "Hierophant's Arena"
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/pride
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/seedvault
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/syndicate_lava_base
|
||||
name = "Secret Base"
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
//Xeno Nest
|
||||
|
||||
/area/ruin/unpowered/xenonest
|
||||
name = "The Hive"
|
||||
always_unpowered = TRUE
|
||||
power_environ = FALSE
|
||||
power_equip = FALSE
|
||||
power_light = FALSE
|
||||
poweralm = FALSE
|
||||
|
||||
//ash walker nest
|
||||
/area/ruin/unpowered/ash_walkers
|
||||
icon_state = "red"
|
||||
@@ -0,0 +1,429 @@
|
||||
//Space Ruin Parents
|
||||
|
||||
/area/ruin/space
|
||||
has_gravity = FALSE
|
||||
blob_allowed = FALSE //Nope, no winning in space as a blob. Gotta eat the station.
|
||||
|
||||
/area/ruin/space/has_grav
|
||||
has_gravity = TRUE
|
||||
|
||||
/area/ruin/space/has_grav/powered
|
||||
requires_power = FALSE
|
||||
|
||||
|
||||
/area/ruin/fakespace
|
||||
icon_state = "space"
|
||||
requires_power = TRUE
|
||||
always_unpowered = TRUE
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
|
||||
has_gravity = FALSE
|
||||
power_light = FALSE
|
||||
power_equip = FALSE
|
||||
power_environ = FALSE
|
||||
valid_territory = FALSE
|
||||
outdoors = TRUE
|
||||
ambientsounds = list('sound/ambience/ambispace.ogg','sound/ambience/title2.ogg')
|
||||
blob_allowed = FALSE
|
||||
|
||||
/////////////
|
||||
|
||||
/area/ruin/space/way_home
|
||||
name = "\improper Salvation"
|
||||
icon_state = "away"
|
||||
always_unpowered = FALSE
|
||||
|
||||
// Ruins of "onehalf" ship
|
||||
|
||||
/area/ruin/space/has_grav/onehalf/hallway
|
||||
name = "Hallway"
|
||||
icon_state = "hallC"
|
||||
|
||||
/area/ruin/space/has_grav/onehalf/drone_bay
|
||||
name = "Mining Drone Bay"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/ruin/space/has_grav/onehalf/dorms_med
|
||||
name = "Crew Quarters"
|
||||
icon_state = "Sleep"
|
||||
|
||||
/area/ruin/space/has_grav/onehalf/bridge
|
||||
name = "Bridge"
|
||||
icon_state = "bridge"
|
||||
|
||||
|
||||
|
||||
/area/ruin/space/has_grav/powered/dinner_for_two
|
||||
name = "Dinner for Two"
|
||||
|
||||
/area/ruin/space/has_grav/powered/authorship
|
||||
name = "Authorship"
|
||||
|
||||
/area/ruin/space/has_grav/powered/aesthetic
|
||||
name = "Aesthetic"
|
||||
ambientsounds = list('sound/ambience/ambivapor1.ogg')
|
||||
|
||||
|
||||
//Ruin of Hotel
|
||||
|
||||
/area/ruin/space/has_grav/hotel
|
||||
name = "Hotel"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/guestroom
|
||||
name = "Hotel Guest Room"
|
||||
icon_state = "Sleep"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/security
|
||||
name = "Hotel Security Post"
|
||||
icon_state = "security"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/pool
|
||||
name = "Hotel Pool Room"
|
||||
icon_state = "fitness"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/bar
|
||||
name = "Hotel Bar"
|
||||
icon_state = "cafeteria"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/power
|
||||
name = "Hotel Power Room"
|
||||
icon_state = "engine_smes"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/custodial
|
||||
name = "Hotel Custodial Closet"
|
||||
icon_state = "janitor"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/shuttle
|
||||
name = "Hotel Shuttle"
|
||||
icon_state = "shuttle"
|
||||
requires_power = FALSE
|
||||
|
||||
/area/ruin/space/has_grav/hotel/dock
|
||||
name = "Hotel Shuttle Dock"
|
||||
icon_state = "start"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/workroom
|
||||
name = "Hotel Staff Room"
|
||||
icon_state = "crew_quarters"
|
||||
|
||||
|
||||
|
||||
|
||||
//Ruin of Derelict Oupost
|
||||
|
||||
/area/ruin/space/has_grav/derelictoutpost
|
||||
name = "Derelict Outpost"
|
||||
icon_state = "green"
|
||||
|
||||
/area/ruin/space/has_grav/derelictoutpost/cargostorage
|
||||
name = "Derelict Outpost Cargo Storage"
|
||||
icon_state = "storage"
|
||||
|
||||
/area/ruin/space/has_grav/derelictoutpost/cargobay
|
||||
name = "Derelict Outpost Cargo Bay"
|
||||
icon_state = "quartstorage"
|
||||
|
||||
/area/ruin/space/has_grav/derelictoutpost/powerstorage
|
||||
name = "Derelict Outpost Power Storage"
|
||||
icon_state = "engine_smes"
|
||||
|
||||
/area/ruin/space/has_grav/derelictoutpost/dockedship
|
||||
name = "Derelict Outpost Docked Ship"
|
||||
icon_state = "red"
|
||||
|
||||
|
||||
//Ruin of Space Bar
|
||||
|
||||
/area/ruin/space/has_grav/powered/spacebar
|
||||
name = "Space Bar"
|
||||
icon_state = "bar"
|
||||
|
||||
//Ruin of turretedoutpost
|
||||
|
||||
/area/ruin/space/has_grav/turretedoutpost
|
||||
name = "Turreted Outpost"
|
||||
icon_state = "red"
|
||||
|
||||
|
||||
//Ruin of old teleporter
|
||||
|
||||
/area/ruin/space/oldteleporter
|
||||
name = "Old teleporter"
|
||||
icon_state = "teleporter"
|
||||
|
||||
|
||||
//Ruin of mech transport
|
||||
|
||||
/area/ruin/space/has_grav/powered/mechtransport
|
||||
name = "Mech Transport"
|
||||
icon_state = "green"
|
||||
|
||||
|
||||
//Ruin of gas the lizard
|
||||
|
||||
/area/ruin/space/has_grav/gasthelizard
|
||||
name = "Gas the lizard"
|
||||
|
||||
|
||||
//Ruin of Deep Storage
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage
|
||||
name = "Deep Storage"
|
||||
icon_state = "storage"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/airlock
|
||||
name = "Deep Storage Airlock"
|
||||
icon_state = "quart"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/power
|
||||
name = "Deep Storage Power and Atmospherics Room"
|
||||
icon_state = "engi_storage"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/hydroponics
|
||||
name = "Deep Storage Hydroponics"
|
||||
icon_state = "garden"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/armory
|
||||
name = "Deep Storage Secure Storage"
|
||||
icon_state = "armory"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/storage
|
||||
name = "Deep Storage Storage"
|
||||
icon_state = "storage_wing"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/dorm
|
||||
name = "Deep Storage Dormory"
|
||||
icon_state = "crew_quarters"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/kitchen
|
||||
name = "Deep Storage Kitchen"
|
||||
icon_state = "kitchen"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/crusher
|
||||
name = "Deep Storage Recycler"
|
||||
icon_state = "storage"
|
||||
|
||||
|
||||
//Ruin of Abandoned Zoo
|
||||
|
||||
/area/ruin/space/has_grav/abandonedzoo
|
||||
name = "Abandoned Zoo"
|
||||
icon_state = "green"
|
||||
|
||||
|
||||
//Ruin of ancient Space Station
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation
|
||||
name = "Charlie Station Main Corridor"
|
||||
icon_state = "green"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/powered
|
||||
name = "Powered Tile"
|
||||
icon_state = "teleporter"
|
||||
requires_power = FALSE
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/space
|
||||
name = "Exposed To Space"
|
||||
icon_state = "teleporter"
|
||||
has_gravity = FALSE
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/atmo
|
||||
name = "Beta Station Atmospherics"
|
||||
icon_state = "red"
|
||||
has_gravity = FALSE
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/betanorth
|
||||
name = "Beta Station North Corridor"
|
||||
icon_state = "blue"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/solar
|
||||
name = "Station Solar Array"
|
||||
icon_state = "panelsAP"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/engi
|
||||
name = "Charlie Station Engineering"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/comm
|
||||
name = "Charlie Station Command"
|
||||
icon_state = "captain"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/hydroponics
|
||||
name = "Charlie Station Hydroponics"
|
||||
icon_state = "garden"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/kitchen
|
||||
name = "Charlie Station Kitchen"
|
||||
icon_state = "kitchen"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/sec
|
||||
name = "Charlie Station Security"
|
||||
icon_state = "red"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/deltacorridor
|
||||
name = "Delta Station Main Corridor"
|
||||
icon_state = "green"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/proto
|
||||
name = "Delta Station Prototype Lab"
|
||||
icon_state = "toxlab"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/rnd
|
||||
name = "Delta Station Research and Development"
|
||||
icon_state = "toxlab"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/hivebot
|
||||
name = "Hivebot Mothership"
|
||||
icon_state = "teleporter"
|
||||
|
||||
//DERELICT
|
||||
|
||||
/area/ruin/space/derelict
|
||||
name = "Derelict Station"
|
||||
icon_state = "storage"
|
||||
|
||||
/area/ruin/space/derelict/hallway/primary
|
||||
name = "Derelict Primary Hallway"
|
||||
icon_state = "hallP"
|
||||
|
||||
/area/ruin/space/derelict/hallway/secondary
|
||||
name = "Derelict Secondary Hallway"
|
||||
icon_state = "hallS"
|
||||
|
||||
/area/ruin/space/derelict/hallway/primary/port
|
||||
name = "Derelict Port Hallway"
|
||||
icon_state = "hallFP"
|
||||
|
||||
/area/ruin/space/derelict/arrival
|
||||
name = "Derelict Arrival Centre"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/ruin/space/derelict/storage/equipment
|
||||
name = "Derelict Equipment Storage"
|
||||
|
||||
/area/ruin/space/derelict/storage/storage_access
|
||||
name = "Derelict Storage Access"
|
||||
|
||||
/area/ruin/space/derelict/storage/engine_storage
|
||||
name = "Derelict Engine Storage"
|
||||
icon_state = "green"
|
||||
|
||||
/area/ruin/space/derelict/bridge
|
||||
name = "Derelict Control Room"
|
||||
icon_state = "bridge"
|
||||
|
||||
/area/ruin/space/derelict/secret
|
||||
name = "Derelict Secret Room"
|
||||
icon_state = "library"
|
||||
|
||||
/area/ruin/space/derelict/bridge/access
|
||||
name = "Derelict Control Room Access"
|
||||
icon_state = "auxstorage"
|
||||
|
||||
/area/ruin/space/derelict/bridge/ai_upload
|
||||
name = "Derelict Computer Core"
|
||||
icon_state = "ai"
|
||||
|
||||
/area/ruin/space/derelict/solar_control
|
||||
name = "Derelict Solar Control"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/ruin/space/derelict/se_solar
|
||||
name = "South East Solars"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/ruin/space/derelict/crew_quarters
|
||||
name = "Derelict Crew Quarters"
|
||||
icon_state = "fitness"
|
||||
|
||||
/area/ruin/space/derelict/medical
|
||||
name = "Derelict Medbay"
|
||||
icon_state = "medbay"
|
||||
|
||||
/area/ruin/space/derelict/medical/morgue
|
||||
name = "Derelict Morgue"
|
||||
icon_state = "morgue"
|
||||
|
||||
/area/ruin/space/derelict/medical/chapel
|
||||
name = "Derelict Chapel"
|
||||
icon_state = "chapel"
|
||||
|
||||
/area/ruin/space/derelict/teleporter
|
||||
name = "Derelict Teleporter"
|
||||
icon_state = "teleporter"
|
||||
|
||||
/area/ruin/space/derelict/eva
|
||||
name = "Derelict EVA Storage"
|
||||
icon_state = "eva"
|
||||
|
||||
/area/ruin/space/derelict/ship
|
||||
name = "Abandoned Ship"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/solar/derelict_starboard
|
||||
name = "Derelict Starboard Solar Array"
|
||||
icon_state = "panelsS"
|
||||
|
||||
/area/solar/derelict_aft
|
||||
name = "Derelict Aft Solar Array"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/ruin/space/derelict/singularity_engine
|
||||
name = "Derelict Singularity Engine"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/ruin/space/derelict/gravity_generator
|
||||
name = "Derelict Gravity Generator Room"
|
||||
icon_state = "red"
|
||||
|
||||
/area/ruin/space/derelict/atmospherics
|
||||
name = "Derelict Atmospherics"
|
||||
icon_state = "red"
|
||||
|
||||
/area/ruin/space/derelict/assembly_line
|
||||
name = "Assembly Line"
|
||||
icon_state = "ass_line"
|
||||
power_equip = FALSE
|
||||
power_light = FALSE
|
||||
power_environ = FALSE
|
||||
|
||||
|
||||
//DJSTATION
|
||||
|
||||
/area/ruin/space/djstation
|
||||
name = "Ruskie DJ Station"
|
||||
icon_state = "DJ"
|
||||
has_gravity = TRUE
|
||||
blob_allowed = FALSE //Nope, no winning on the DJ station as a blob. Gotta eat the main station.
|
||||
|
||||
/area/ruin/space/djstation/solars
|
||||
name = "DJ Station Solars"
|
||||
icon_state = "DJ"
|
||||
has_gravity = TRUE
|
||||
|
||||
|
||||
//ABANDONED TELEPORTER
|
||||
|
||||
/area/ruin/space/abandoned_tele
|
||||
name = "Abandoned Teleporter"
|
||||
icon_state = "teleporter"
|
||||
music = "signal"
|
||||
ambientsounds = list('sound/ambience/ambimalf.ogg')
|
||||
|
||||
//OLD AI SAT
|
||||
|
||||
/area/ruin/space/old_ai_sat/ai
|
||||
name = "AI Chamber"
|
||||
icon_state = "ai"
|
||||
ambientsounds = list('sound/ambience/ambimalf.ogg')
|
||||
|
||||
/area/ruin/space/old_ai_sat/main
|
||||
name = "Wreck"
|
||||
icon_state = "storage"
|
||||
|
||||
/area/ruin/space/old_ai_sat/engineering
|
||||
name = "Power Room"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/ruin/space/old_ai_sat/bridge
|
||||
name = "Bridge"
|
||||
icon_state = "bridge"
|
||||
+19
-7
@@ -9,7 +9,7 @@
|
||||
var/list/fingerprints
|
||||
var/list/fingerprintshidden
|
||||
var/list/blood_DNA
|
||||
var/container_type = 0
|
||||
var/container_type = NONE
|
||||
var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff.
|
||||
var/datum/reagents/reagents = null
|
||||
|
||||
@@ -211,8 +211,8 @@
|
||||
return TRUE
|
||||
return container_type & DRAWABLE_1
|
||||
|
||||
/atom/proc/allow_drop()
|
||||
return 1
|
||||
/atom/proc/AllowDrop()
|
||||
return FALSE
|
||||
|
||||
/atom/proc/CheckExit()
|
||||
return 1
|
||||
@@ -479,14 +479,17 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
|
||||
/atom/proc/ratvar_act()
|
||||
return
|
||||
|
||||
/atom/proc/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd)
|
||||
/atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
return FALSE
|
||||
|
||||
/atom/proc/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode)
|
||||
/atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
|
||||
return FALSE
|
||||
|
||||
/atom/proc/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
|
||||
return 0
|
||||
/atom/proc/storage_contents_dump_act(obj/item/storage/src_object, mob/user)
|
||||
return 0
|
||||
|
||||
/atom/proc/get_dumping_location(obj/item/storage/source,mob/user)
|
||||
return null
|
||||
|
||||
//This proc is called on the location of an atom when the atom is Destroy()'d
|
||||
/atom/proc/handle_atom_del(atom/A)
|
||||
@@ -610,3 +613,12 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
|
||||
.["Add reagent"] = "?_src_=vars;addreagent=\ref[src]"
|
||||
.["Trigger EM pulse"] = "?_src_=vars;emp=\ref[src]"
|
||||
.["Trigger explosion"] = "?_src_=vars;explode=\ref[src]"
|
||||
|
||||
/atom/proc/drop_location()
|
||||
var/atom/L = loc
|
||||
if(!L)
|
||||
return null
|
||||
return L.AllowDrop() ? L : get_turf(L)
|
||||
|
||||
/atom/Entered(atom/movable/AM, atom/oldLoc)
|
||||
SendSignal(COMSIG_ATOM_ENTERED, AM, oldLoc)
|
||||
|
||||
@@ -215,7 +215,7 @@
|
||||
// This is automatically called when something enters your square
|
||||
//oldloc = old location on atom, inserted when forceMove is called and ONLY when forceMove is called!
|
||||
/atom/movable/Crossed(atom/movable/AM, oldloc)
|
||||
return
|
||||
SendSignal(COMSIG_MOVABLE_CROSSED, AM)
|
||||
|
||||
|
||||
//This is tg's equivalent to the byond bump, it used to be called bump with a second arg
|
||||
@@ -577,8 +577,8 @@
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.transferItemToLoc(src, targetturf, TRUE) //nodrops disks when?
|
||||
else if(istype(loc, /obj/item/weapon/storage))
|
||||
var/obj/item/weapon/storage/S = loc
|
||||
else if(istype(loc, /obj/item/storage))
|
||||
var/obj/item/storage/S = loc
|
||||
S.remove_from_storage(src, targetturf)
|
||||
else
|
||||
forceMove(targetturf)
|
||||
|
||||
@@ -202,18 +202,18 @@
|
||||
for(var/i in list(IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD))
|
||||
holder = hud_list[i]
|
||||
holder.icon_state = null
|
||||
for(var/obj/item/weapon/implant/I in implants)
|
||||
if(istype(I, /obj/item/weapon/implant/tracking))
|
||||
for(var/obj/item/implant/I in implants)
|
||||
if(istype(I, /obj/item/implant/tracking))
|
||||
holder = hud_list[IMPTRACK_HUD]
|
||||
var/icon/IC = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = IC.Height() - world.icon_size
|
||||
holder.icon_state = "hud_imp_tracking"
|
||||
else if(istype(I, /obj/item/weapon/implant/mindshield))
|
||||
else if(istype(I, /obj/item/implant/mindshield))
|
||||
holder = hud_list[IMPLOYAL_HUD]
|
||||
var/icon/IC = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = IC.Height() - world.icon_size
|
||||
holder.icon_state = "hud_imp_loyal"
|
||||
else if(istype(I, /obj/item/weapon/implant/chem))
|
||||
else if(istype(I, /obj/item/implant/chem))
|
||||
holder = hud_list[IMPCHEM_HUD]
|
||||
var/icon/IC = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = IC.Height() - world.icon_size
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
/obj/item/weapon/antag_spawner
|
||||
/obj/item/antag_spawner
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
var/used = 0
|
||||
|
||||
/obj/item/weapon/antag_spawner/proc/spawn_antag(client/C, turf/T, type = "")
|
||||
/obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, type = "")
|
||||
return
|
||||
|
||||
/obj/item/weapon/antag_spawner/proc/equip_antag(mob/target)
|
||||
/obj/item/antag_spawner/proc/equip_antag(mob/target)
|
||||
return
|
||||
|
||||
|
||||
///////////WIZARD
|
||||
|
||||
/obj/item/weapon/antag_spawner/contract
|
||||
/obj/item/antag_spawner/contract
|
||||
name = "contract"
|
||||
desc = "A magic contract previously signed by an apprentice. In exchange for instruction in the magical arts, they are bound to answer your call for aid."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state ="scroll2"
|
||||
|
||||
/obj/item/weapon/antag_spawner/contract/attack_self(mob/user)
|
||||
/obj/item/antag_spawner/contract/attack_self(mob/user)
|
||||
user.set_machine(src)
|
||||
var/dat
|
||||
if(used)
|
||||
@@ -41,7 +41,7 @@
|
||||
onclose(user, "radio")
|
||||
return
|
||||
|
||||
/obj/item/weapon/antag_spawner/contract/Topic(href, href_list)
|
||||
/obj/item/antag_spawner/contract/Topic(href, href_list)
|
||||
..()
|
||||
var/mob/living/carbon/human/H = usr
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
else
|
||||
to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")
|
||||
|
||||
/obj/item/weapon/antag_spawner/contract/spawn_antag(client/C, turf/T, type = "")
|
||||
/obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, type = "")
|
||||
new /obj/effect/particle_effect/smoke(T)
|
||||
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
|
||||
C.prefs.copy_to(M)
|
||||
@@ -90,7 +90,7 @@
|
||||
if("healing")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
|
||||
M.put_in_hands_or_del(new /obj/item/weapon/gun/magic/staff/healing(M))
|
||||
M.put_in_hands_or_del(new /obj/item/gun/magic/staff/healing(M))
|
||||
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.")
|
||||
if("robeless")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
|
||||
@@ -120,26 +120,26 @@
|
||||
M.age = rand(AGE_MIN, WIZARD_AGE_MIN - 1)
|
||||
M.dna.update_dna_identity()
|
||||
|
||||
/obj/item/weapon/antag_spawner/contract/equip_antag(mob/target)
|
||||
/obj/item/antag_spawner/contract/equip_antag(mob/target)
|
||||
target.equip_to_slot_or_del(new /obj/item/device/radio/headset(target), slot_ears)
|
||||
target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(target), slot_w_uniform)
|
||||
target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(target), slot_shoes)
|
||||
target.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(target), slot_wear_suit)
|
||||
target.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(target), slot_head)
|
||||
target.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(target), slot_back)
|
||||
target.equip_to_slot_or_del(new /obj/item/weapon/storage/box(target), slot_in_backpack)
|
||||
target.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll/apprentice(target), slot_r_store)
|
||||
target.equip_to_slot_or_del(new /obj/item/storage/backpack(target), slot_back)
|
||||
target.equip_to_slot_or_del(new /obj/item/storage/box(target), slot_in_backpack)
|
||||
target.equip_to_slot_or_del(new /obj/item/teleportation_scroll/apprentice(target), slot_r_store)
|
||||
///////////BORGS AND OPERATIVES
|
||||
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops
|
||||
/obj/item/antag_spawner/nuke_ops
|
||||
name = "syndicate operative teleporter"
|
||||
desc = "A single-use teleporter designed to quickly reinforce operatives in the field."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "locator"
|
||||
var/borg_to_spawn
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/proc/check_usability(mob/user)
|
||||
/obj/item/antag_spawner/nuke_ops/proc/check_usability(mob/user)
|
||||
if(used)
|
||||
to_chat(user, "<span class='warning'>[src] is out of power!</span>")
|
||||
return FALSE
|
||||
@@ -152,7 +152,7 @@
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/attack_self(mob/user)
|
||||
/obj/item/antag_spawner/nuke_ops/attack_self(mob/user)
|
||||
if(!(check_usability(user)))
|
||||
return
|
||||
|
||||
@@ -169,7 +169,7 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>")
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T)
|
||||
/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T)
|
||||
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
|
||||
C.prefs.copy_to(M)
|
||||
M.key = C.key
|
||||
@@ -184,21 +184,21 @@
|
||||
M.name = newname
|
||||
|
||||
//////SYNDICATE BORG
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele
|
||||
/obj/item/antag_spawner/nuke_ops/borg_tele
|
||||
name = "syndicate cyborg teleporter"
|
||||
desc = "A single-use teleporter designed to quickly reinforce operatives in the field.."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "locator"
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/assault
|
||||
/obj/item/antag_spawner/nuke_ops/borg_tele/assault
|
||||
name = "syndicate assault cyborg teleporter"
|
||||
borg_to_spawn = "Assault"
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/medical
|
||||
/obj/item/antag_spawner/nuke_ops/borg_tele/medical
|
||||
name = "syndicate medical teleporter"
|
||||
borg_to_spawn = "Medical"
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T)
|
||||
/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T)
|
||||
var/mob/living/silicon/robot/R
|
||||
switch(borg_to_spawn)
|
||||
if("Medical")
|
||||
@@ -224,7 +224,7 @@
|
||||
|
||||
///////////SLAUGHTER DEMON
|
||||
|
||||
/obj/item/weapon/antag_spawner/slaughter_demon //Warning edgiest item in the game
|
||||
/obj/item/antag_spawner/slaughter_demon //Warning edgiest item in the game
|
||||
name = "vial of blood"
|
||||
desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
@@ -236,7 +236,7 @@
|
||||
var/mob/living/demon_type = /mob/living/simple_animal/slaughter
|
||||
|
||||
|
||||
/obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user)
|
||||
/obj/item/antag_spawner/slaughter_demon/attack_self(mob/user)
|
||||
if(user.z != ZLEVEL_STATION)
|
||||
to_chat(user, "<span class='notice'>You should probably wait until you reach the station.</span>")
|
||||
return
|
||||
@@ -257,7 +257,7 @@
|
||||
to_chat(user, "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>")
|
||||
|
||||
|
||||
/obj/item/weapon/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "")
|
||||
/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "")
|
||||
|
||||
var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T)
|
||||
var/mob/living/simple_animal/slaughter/S = new demon_type(holder)
|
||||
@@ -284,7 +284,7 @@
|
||||
to_chat(S, "<B>Objective #[1]</B>: [new_objective.explanation_text]")
|
||||
to_chat(S, "<B>Objective #[new_objective ? "[2]":"[1]"]</B>: [new_objective2.explanation_text]")
|
||||
|
||||
/obj/item/weapon/antag_spawner/slaughter_demon/laughter
|
||||
/obj/item/antag_spawner/slaughter_demon/laughter
|
||||
name = "vial of tickles"
|
||||
desc = "A magically infused bottle of clown love, distilled from countless hugging attacks. Used in funny rituals to attract adorable creatures."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
////////////Syndicate Cortical Borer
|
||||
obj/item/weapon/antag_spawner/syndi_borer
|
||||
obj/item/antag_spawner/syndi_borer
|
||||
name = "syndicate brain-slug container"
|
||||
desc = "Releases a modified cortical borer to assist the user."
|
||||
icon = 'icons/obj/device.dmi' //Temporary? Doesn't really look like a container for xenofauna... but IDK what else could work.
|
||||
icon_state = "locator"
|
||||
var/polling = FALSE
|
||||
|
||||
obj/item/weapon/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owner)
|
||||
obj/item/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owner)
|
||||
var/mob/living/simple_animal/borer/syndi_borer/B = new /mob/living/simple_animal/borer/syndi_borer(T)
|
||||
|
||||
B.key = C.key
|
||||
@@ -27,7 +27,7 @@ obj/item/weapon/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owne
|
||||
if(new_objective)
|
||||
to_chat(B, "<B>Objective #[1]</B>: [new_objective.explanation_text]")
|
||||
SSticker.mode.update_borer_icons_added(B)
|
||||
/obj/item/weapon/antag_spawner/syndi_borer/proc/check_usability(mob/user)
|
||||
/obj/item/antag_spawner/syndi_borer/proc/check_usability(mob/user)
|
||||
if(used)
|
||||
to_chat(user, "<span class='warning'>[src] appears to be empty!</span>")
|
||||
return 0
|
||||
@@ -36,7 +36,7 @@ obj/item/weapon/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owne
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/antag_spawner/syndi_borer/attack_self(mob/user)
|
||||
/obj/item/antag_spawner/syndi_borer/attack_self(mob/user)
|
||||
if(!(check_usability(user)))
|
||||
return
|
||||
polling = TRUE
|
||||
|
||||
@@ -137,13 +137,13 @@
|
||||
chemical_cost = 20
|
||||
dna_cost = 2
|
||||
req_human = 1
|
||||
weapon_type = /obj/item/weapon/melee/arm_blade
|
||||
weapon_type = /obj/item/melee/arm_blade
|
||||
weapon_name_simple = "blade"
|
||||
|
||||
/obj/item/weapon/melee/arm_blade
|
||||
/obj/item/melee/arm_blade
|
||||
name = "arm blade"
|
||||
desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "arm_blade"
|
||||
item_state = "arm_blade"
|
||||
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
||||
@@ -159,14 +159,14 @@
|
||||
sharpness = IS_SHARP
|
||||
var/can_drop = FALSE
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/Initialize(mapload,silent,synthetic)
|
||||
/obj/item/melee/arm_blade/Initialize(mapload,silent,synthetic)
|
||||
. = ..()
|
||||
if(ismob(loc) && !silent)
|
||||
loc.visible_message("<span class='warning'>A grotesque blade forms around [loc.name]\'s arm!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a deadly blade.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||
if(synthetic)
|
||||
can_drop = TRUE
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/afterattack(atom/target, mob/user, proximity)
|
||||
/obj/item/melee/arm_blade/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
if(istype(target, /obj/structure/table))
|
||||
@@ -197,10 +197,10 @@
|
||||
"<span class='italics'>You hear a metal screeching sound.</span>")
|
||||
A.open(2)
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/dropped(mob/user)
|
||||
/obj/item/melee/arm_blade/dropped(mob/user)
|
||||
..()
|
||||
if(can_drop)
|
||||
new /obj/item/weapon/melee/synthetic_arm_blade(get_turf(user))
|
||||
new /obj/item/melee/synthetic_arm_blade(get_turf(user))
|
||||
|
||||
/***************************************\
|
||||
|***********COMBAT TENTACLES*************|
|
||||
@@ -215,14 +215,14 @@
|
||||
chemical_cost = 10
|
||||
dna_cost = 2
|
||||
req_human = 1
|
||||
weapon_type = /obj/item/weapon/gun/magic/tentacle
|
||||
weapon_type = /obj/item/gun/magic/tentacle
|
||||
weapon_name_simple = "tentacle"
|
||||
silent = TRUE
|
||||
|
||||
/obj/item/weapon/gun/magic/tentacle
|
||||
/obj/item/gun/magic/tentacle
|
||||
name = "tentacle"
|
||||
desc = "A fleshy tentacle that can stretch out and grab things or people."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "tentacle"
|
||||
item_state = "tentacle"
|
||||
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
||||
@@ -237,7 +237,7 @@
|
||||
throw_range = 0
|
||||
throw_speed = 0
|
||||
|
||||
/obj/item/weapon/gun/magic/tentacle/Initialize(mapload, silent)
|
||||
/obj/item/gun/magic/tentacle/Initialize(mapload, silent)
|
||||
. = ..()
|
||||
if(ismob(loc))
|
||||
if(!silent)
|
||||
@@ -246,10 +246,10 @@
|
||||
to_chat(loc, "<span class='notice'>You prepare to extend a tentacle.</span>")
|
||||
|
||||
|
||||
/obj/item/weapon/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj)
|
||||
/obj/item/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj)
|
||||
to_chat(user, "<span class='warning'>The [name] is not ready yet.<span>")
|
||||
|
||||
/obj/item/weapon/gun/magic/tentacle/suicide_act(mob/user)
|
||||
/obj/item/gun/magic/tentacle/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] coils [src] tightly around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return (OXYLOSS)
|
||||
|
||||
@@ -261,7 +261,7 @@
|
||||
caliber = "tentacle"
|
||||
icon_state = "tentacle_end"
|
||||
firing_effect_type = null
|
||||
var/obj/item/weapon/gun/magic/tentacle/gun //the item that shot it
|
||||
var/obj/item/gun/magic/tentacle/gun //the item that shot it
|
||||
|
||||
/obj/item/ammo_casing/magic/tentacle/Initialize()
|
||||
gun = loc
|
||||
@@ -380,7 +380,7 @@
|
||||
dna_cost = 1
|
||||
req_human = 1
|
||||
|
||||
weapon_type = /obj/item/weapon/shield/changeling
|
||||
weapon_type = /obj/item/shield/changeling
|
||||
weapon_name_simple = "shield"
|
||||
|
||||
/obj/effect/proc_holder/changeling/weapon/shield/sting_action(mob/user)
|
||||
@@ -388,15 +388,15 @@
|
||||
if(!changeling)
|
||||
return
|
||||
|
||||
var/obj/item/weapon/shield/changeling/S = ..(user)
|
||||
var/obj/item/shield/changeling/S = ..(user)
|
||||
S.remaining_uses = round(changeling.absorbedcount * 3)
|
||||
return TRUE
|
||||
|
||||
/obj/item/weapon/shield/changeling
|
||||
/obj/item/shield/changeling
|
||||
name = "shield-like mass"
|
||||
desc = "A mass of tough, boney tissue. You can still see the fingers as a twisted pattern in the shield."
|
||||
flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "ling_shield"
|
||||
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
|
||||
@@ -404,12 +404,12 @@
|
||||
|
||||
var/remaining_uses //Set by the changeling ability.
|
||||
|
||||
/obj/item/weapon/shield/changeling/Initialize()
|
||||
/obj/item/shield/changeling/Initialize()
|
||||
. = ..()
|
||||
if(ismob(loc))
|
||||
loc.visible_message("<span class='warning'>The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!</span>", "<span class='warning'>We inflate our hand into a strong shield.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||
|
||||
/obj/item/weapon/shield/changeling/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
/obj/item/shield/changeling/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(remaining_uses < 1)
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
@@ -444,7 +444,7 @@
|
||||
icon_state = "lingspacesuit"
|
||||
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel."
|
||||
flags_1 = STOPSPRESSUREDMAGE_1 | NODROP_1 | DROPDEL_1 //Not THICKMATERIAL_1 because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff)
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/weapon/tank/internals/oxygen)
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen)
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 90, acid = 90) //No armor at all.
|
||||
|
||||
/obj/item/clothing/suit/space/changeling/Initialize()
|
||||
|
||||
@@ -109,11 +109,11 @@
|
||||
chemical_cost = 20
|
||||
dna_cost = 1
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/false
|
||||
/obj/item/melee/arm_blade/false
|
||||
desc = "A grotesque mass of flesh that used to be your arm. Although it looks dangerous at first, you can tell it's actually quite dull and useless."
|
||||
force = 5 //Basically as strong as a punch
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/false/afterattack(atom/target, mob/user, proximity)
|
||||
/obj/item/melee/arm_blade/false/afterattack(atom/target, mob/user, proximity)
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/false_armblade/can_sting(mob/user, mob/target)
|
||||
@@ -134,7 +134,7 @@
|
||||
if(ismonkey(target))
|
||||
to_chat(user, "<span class='notice'>Our genes cry out as we sting [target.name]!</span>")
|
||||
|
||||
var/obj/item/weapon/melee/arm_blade/false/blade = new(target,1)
|
||||
var/obj/item/melee/arm_blade/false/blade = new(target,1)
|
||||
target.put_in_hands(blade)
|
||||
target.visible_message("<span class='warning'>A grotesque blade forms around [target.name]\'s arm!</span>", "<span class='userdanger'>Your arm twists and mutates, transforming into a horrific monstrosity!</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||
playsound(target, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
@@ -142,7 +142,7 @@
|
||||
addtimer(CALLBACK(src, .proc/remove_fake, target, blade), 600)
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/false_armblade/proc/remove_fake(mob/target, obj/item/weapon/melee/arm_blade/false/blade)
|
||||
/obj/effect/proc_holder/changeling/sting/false_armblade/proc/remove_fake(mob/target, obj/item/melee/arm_blade/false/blade)
|
||||
playsound(target, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
target.visible_message("<span class='warning'>With a sickening crunch, \
|
||||
[target] reforms their [blade.name] into an arm!</span>",
|
||||
|
||||
@@ -11,9 +11,21 @@
|
||||
var/stat_affected = CONSCIOUS
|
||||
var/sigil_name = "Sigil"
|
||||
var/resist_string = "glows blinding white" //string for when a null rod blocks its effects, "glows [resist_string]"
|
||||
var/list/component_refund = list()
|
||||
|
||||
/obj/effect/clockwork/sigil/attackby(obj/item/I, mob/living/user, params)
|
||||
if(I.force && !is_servant_of_ratvar(user))
|
||||
if(is_servant_of_ratvar(user))
|
||||
if(istype(I, /obj/item/clockwork/slab))
|
||||
user.visible_message("<span class='warning'>[user] starts to dispel [src]...</span>", "<span class='danger'>You start to dispel [src]...</span>")
|
||||
if(do_after(user, 20, target = src))
|
||||
user.visible_message("<span class='warning'>[user] dispels [src]!</span>", "<span class='danger'>You dispel [src]!</span>")
|
||||
for(var/i in component_refund)
|
||||
if(component_refund[i])
|
||||
for(var/r in 1 to component_refund[i])
|
||||
generate_cache_component(i, src)
|
||||
qdel(src)
|
||||
return 1
|
||||
else if(I.force)
|
||||
user.visible_message("<span class='warning'>[user] scatters [src] with [I]!</span>", "<span class='danger'>You scatter [src] with [I]!</span>")
|
||||
qdel(src)
|
||||
return 1
|
||||
@@ -63,6 +75,7 @@
|
||||
light_power = 1
|
||||
light_color = "#FAE48C"
|
||||
sigil_name = "Sigil of Transgression"
|
||||
component_refund = list(HIEROPHANT_ANSIBLE = 1)
|
||||
|
||||
/obj/effect/clockwork/sigil/transgression/sigil_effects(mob/living/L)
|
||||
var/target_flashed = L.flash_act()
|
||||
@@ -94,27 +107,33 @@
|
||||
light_color = "#FAE48C"
|
||||
stat_affected = UNCONSCIOUS
|
||||
resist_string = "glows faintly yellow"
|
||||
sigil_name = "Sigil of Submission"
|
||||
component_refund = list(GEIS_CAPACITOR = 1)
|
||||
var/convert_time = 80
|
||||
var/delete_on_finish = TRUE
|
||||
sigil_name = "Sigil of Submission"
|
||||
var/glow_type = /obj/effect/temp_visual/ratvar/sigil/submission
|
||||
|
||||
/obj/effect/clockwork/sigil/submission/sigil_effects(mob/living/L)
|
||||
if(istype(L.buckled, /obj/structure/destructible/clockwork/geis_binding))
|
||||
if(is_servant_of_ratvar(L.pulledby))
|
||||
L.pulledby.stop_pulling()
|
||||
if(is_servant_of_ratvar(L.buckled.pulledby))
|
||||
L.buckled.pulledby.stop_pulling()
|
||||
L.visible_message("<span class='warning'>[src] begins to glow a piercing magenta!</span>", "<span class='sevtug'>You feel something start to invade your mind...</span>")
|
||||
var/oldcolor = color
|
||||
animate(src, color = "#AF0AAF", time = convert_time, flags_1 = ANIMATION_END_NOW)
|
||||
animate(src, color = "#AF0AAF", time = convert_time, flags = ANIMATION_END_NOW)
|
||||
var/obj/effect/temp_visual/ratvar/sigil/glow
|
||||
if(glow_type)
|
||||
glow = new glow_type(get_turf(src))
|
||||
animate(glow, alpha = 255, time = convert_time)
|
||||
var/I = 0
|
||||
while(I < convert_time && get_turf(L) == get_turf(src))
|
||||
while(I < convert_time && !QDELETED(L) && get_turf(L) == get_turf(src))
|
||||
I++
|
||||
sleep(1)
|
||||
if(get_turf(L) != get_turf(src))
|
||||
if(QDELETED(L) || get_turf(L) != get_turf(src))
|
||||
if(glow)
|
||||
qdel(glow)
|
||||
animate(src, color = oldcolor, time = 20, flags_1 = ANIMATION_END_NOW)
|
||||
animate(src, color = oldcolor, time = 20, flags = ANIMATION_END_NOW)
|
||||
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 20)
|
||||
visible_message("<span class='warning'>[src] slowly stops glowing!</span>")
|
||||
return
|
||||
@@ -136,7 +155,7 @@
|
||||
to_chat(M, "<span class='heavy_brass'>[message] you!</span>")
|
||||
else
|
||||
to_chat(M, "<span class='heavy_brass'>[message] [L.real_name]!</span>")
|
||||
animate(src, color = oldcolor, time = 20, flags_1 = ANIMATION_END_NOW)
|
||||
animate(src, color = oldcolor, time = 20, flags = ANIMATION_END_NOW)
|
||||
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 20)
|
||||
visible_message("<span class='warning'>[src] slowly stops glowing!</span>")
|
||||
|
||||
@@ -152,6 +171,7 @@
|
||||
light_color = "#EC8A2D"
|
||||
resist_string = "glows faintly"
|
||||
sigil_name = "Sigil of Transmission"
|
||||
component_refund = list(HIEROPHANT_ANSIBLE = 1)
|
||||
affects_servants = TRUE
|
||||
var/power_charge = 0 //starts with no power
|
||||
var/drain_range = 14
|
||||
@@ -296,6 +316,7 @@
|
||||
stat_affected = DEAD
|
||||
resist_string = "glows shimmering yellow"
|
||||
sigil_name = "Vitality Matrix"
|
||||
component_refund = list(VANGUARD_COGWHEEL = 1)
|
||||
var/revive_cost = 150
|
||||
var/sigil_active = FALSE
|
||||
var/animation_number = 3 //each cycle increments this by 1, at 4 it produces an animation and resets
|
||||
@@ -314,7 +335,7 @@
|
||||
if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active)
|
||||
return
|
||||
visible_message("<span class='warning'>[src] begins to glow bright blue!</span>")
|
||||
animate(src, alpha = 255, time = 10, flags_1 = ANIMATION_END_NOW) //we may have a previous animation going. finish it first, then do this one without delay.
|
||||
animate(src, alpha = 255, time = 10, flags = ANIMATION_END_NOW) //we may have a previous animation going. finish it first, then do this one without delay.
|
||||
sleep(10)
|
||||
//as long as they're still on the sigil and are either not a servant or they're a servant AND it has remaining vitality
|
||||
while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || GLOB.clockwork_vitality))) && get_turf(L) == get_turf(src))
|
||||
@@ -380,4 +401,4 @@
|
||||
animation_number = initial(animation_number)
|
||||
sigil_active = FALSE
|
||||
visible_message("<span class='warning'>[src] slowly stops glowing!</span>")
|
||||
animate(src, alpha = initial(alpha), time = 10, flags_1 = ANIMATION_END_NOW)
|
||||
animate(src, alpha = initial(alpha), time = 10, flags = ANIMATION_END_NOW)
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
return TRUE
|
||||
|
||||
/obj/effect/clockwork/spatial_gateway/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/weapon/nullrod))
|
||||
if(istype(I, /obj/item/nullrod))
|
||||
user.visible_message("<span class='warning'>[user] dispels [src] with [I]!</span>", "<span class='danger'>You close [src] with [I]!</span>")
|
||||
qdel(linked_gateway)
|
||||
qdel(src)
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
//horrifying power drain proc made for clockcult's power drain in lieu of six istypes or six for(x in view) loops
|
||||
/atom/movable/proc/power_drain(clockcult_user)
|
||||
var/obj/item/weapon/stock_parts/cell/cell = get_cell()
|
||||
var/obj/item/stock_parts/cell/cell = get_cell()
|
||||
if(cell)
|
||||
return cell.power_drain(clockcult_user)
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/melee/baton/power_drain(clockcult_user) //balance memes
|
||||
/obj/item/melee/baton/power_drain(clockcult_user) //balance memes
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/gun/power_drain(clockcult_user) //balance memes
|
||||
/obj/item/gun/power_drain(clockcult_user) //balance memes
|
||||
return 0
|
||||
|
||||
/obj/machinery/power/apc/power_drain(clockcult_user)
|
||||
@@ -34,7 +34,7 @@
|
||||
visible_message("<span class='warning'>[src]'s panel flies open with a flurry of sparks!</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/power_drain(clockcult_user)
|
||||
/obj/item/stock_parts/cell/power_drain(clockcult_user)
|
||||
if(charge)
|
||||
. = min(charge, MIN_CLOCKCULT_POWER*3)
|
||||
charge = use(.)
|
||||
|
||||
@@ -27,9 +27,6 @@
|
||||
/turf/closed/wall/mineral/cult/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //no metal
|
||||
return list("operation_time" = 80, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = SOUTH)
|
||||
|
||||
/turf/closed/wall/shuttle/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //two sheets of metal
|
||||
return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2), "spawn_dir" = SOUTH)
|
||||
|
||||
/turf/closed/wall/r_wall/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent)
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -24,15 +24,10 @@
|
||||
//For the Geis scripture; binds a target to convert.
|
||||
/obj/effect/proc_holder/slab/geis
|
||||
ranged_mousepointer = 'icons/effects/geis_target.dmi'
|
||||
var/obj/structure/destructible/clockwork/geis_binding/binding //we always have a reference to the binding
|
||||
var/obj/structure/destructible/clockwork/geis_binding/pulled_binding //we use this to see if we're pulling it or not
|
||||
|
||||
/obj/effect/proc_holder/slab/geis/remove_ranged_ability(msg)
|
||||
..()
|
||||
binding = null
|
||||
pulled_binding = null
|
||||
|
||||
/obj/effect/proc_holder/slab/geis/InterceptClickOn(mob/living/caller, params, atom/target)
|
||||
if(..())
|
||||
return TRUE
|
||||
var/turf/T = ranged_ability_user.loc
|
||||
if(!isturf(T))
|
||||
return TRUE
|
||||
@@ -40,20 +35,6 @@
|
||||
var/target_is_binding = istype(target, /obj/structure/destructible/clockwork/geis_binding)
|
||||
|
||||
if((target_is_binding || isliving(target)) && ranged_ability_user.Adjacent(target))
|
||||
if(in_progress || ..())
|
||||
var/mob/living/L = target
|
||||
if(!pulled_binding)
|
||||
if(target == binding || (isliving(target) && L.buckled == binding))
|
||||
pulled_binding = binding
|
||||
ranged_ability_user.start_pulling(binding)
|
||||
remove_mousepointer(ranged_ability_user.client)
|
||||
ranged_mousepointer = 'icons/effects/geis_target_remove.dmi'
|
||||
add_mousepointer(ranged_ability_user.client)
|
||||
else if(target == pulled_binding || (isliving(target) && L.buckled == pulled_binding))
|
||||
ranged_ability_user.visible_message("<span class='warning'>[ranged_ability_user] dispels [pulled_binding]!</span>", "<span class='danger'>You dispel the binding!</span>")
|
||||
binding.take_damage(obj_integrity)
|
||||
remove_ranged_ability()
|
||||
return TRUE
|
||||
if(target_is_binding)
|
||||
var/obj/structure/destructible/clockwork/geis_binding/GB = target
|
||||
GB.repair_and_interrupt()
|
||||
@@ -80,42 +61,19 @@
|
||||
add_logs(ranged_ability_user, L, "rebound with Geis")
|
||||
successful = TRUE
|
||||
else
|
||||
in_progress = TRUE
|
||||
clockwork_say(ranged_ability_user, text2ratvar("Be bound, heathen!"))
|
||||
remove_mousepointer(ranged_ability_user.client)
|
||||
ranged_mousepointer = 'icons/effects/geis_target_remove.dmi'
|
||||
add_mousepointer(ranged_ability_user.client)
|
||||
add_logs(ranged_ability_user, L, "bound with Geis")
|
||||
playsound(target, 'sound/magic/blink.ogg', 50, TRUE, frequency = 0.5)
|
||||
playsound(target, 'sound/magic/blink.ogg', 50, TRUE, -4, frequency = 0.5)
|
||||
if(slab.speed_multiplier >= 0.5) //excuse my debug...
|
||||
ranged_ability_user.notransform = TRUE
|
||||
addtimer(CALLBACK(src, .proc/reset_user_notransform, ranged_ability_user), 5) //stop us moving for a little bit so we don't break the binding immediately
|
||||
addtimer(CALLBACK(src, .proc/reset_user_notransform, ranged_ability_user), 4) //stop us moving for a little bit so we don't break the binding immediately
|
||||
if(L.buckled)
|
||||
L.buckled.unbuckle_mob(target, TRUE)
|
||||
binding = new(get_turf(target))
|
||||
var/obj/structure/destructible/clockwork/geis_binding/binding = new(get_turf(target))
|
||||
binding.setDir(target.dir)
|
||||
binding.buckle_mob(target, TRUE)
|
||||
pulled_binding = binding
|
||||
ranged_ability_user.start_pulling(binding)
|
||||
slab.busy = "sustaining Geis"
|
||||
slab.flags_1 |= NODROP_1
|
||||
while(!QDELETED(binding) && !QDELETED(ranged_ability_user))
|
||||
if(ranged_ability_user.pulling == binding)
|
||||
pulled_binding = binding
|
||||
if(ranged_ability_user.client && ranged_ability_user.client.mouse_pointer_icon == 'icons/effects/geis_target.dmi')
|
||||
remove_mousepointer(ranged_ability_user.client)
|
||||
ranged_mousepointer = 'icons/effects/geis_target_remove.dmi'
|
||||
add_mousepointer(ranged_ability_user.client)
|
||||
else //if we're not pulling it, swap our mousepointer
|
||||
pulled_binding = null
|
||||
if(ranged_ability_user.client && ranged_ability_user.client.mouse_pointer_icon == 'icons/effects/geis_target_remove.dmi')
|
||||
remove_mousepointer(ranged_ability_user.client)
|
||||
ranged_mousepointer = 'icons/effects/geis_target.dmi'
|
||||
add_mousepointer(ranged_ability_user.client)
|
||||
sleep(1)
|
||||
if(!QDELETED(slab))
|
||||
slab.flags_1 &= ~NODROP_1
|
||||
in_progress = FALSE
|
||||
ranged_ability_user.apply_status_effect(STATUS_EFFECT_GEISTRACKER, binding)
|
||||
successful = TRUE
|
||||
|
||||
remove_ranged_ability()
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
to_chat(user, "<span class='[message_span]'>[cultist_message]</span>")
|
||||
if(user.mind && user.mind.isholy)
|
||||
to_chat(user, "<span class='boldannounce'>The power of your faith melts away the [src]!</span>")
|
||||
var/obj/item/weapon/ore/slag/wrath = new /obj/item/weapon/ore/slag
|
||||
var/obj/item/ore/slag/wrath = new /obj/item/ore/slag
|
||||
qdel(src)
|
||||
user.put_in_active_hand(wrath)
|
||||
if(is_servant_of_ratvar(user) && prob(20))
|
||||
|
||||
@@ -144,7 +144,7 @@
|
||||
to_chat(user, "<span class='brass'>You use [stored_power ? "some":"all"] of [src]'s power to produce <b>5</b> brass sheets. It now stores <b>[get_power()]W/[get_max_power()]W</b> of power.</span>")
|
||||
|
||||
/obj/item/clockwork/replica_fabricator/pre_attackby(atom/target, mob/living/user, params)
|
||||
if(!target || !user || !is_servant_of_ratvar(user) || istype(target, /obj/item/weapon/storage))
|
||||
if(!target || !user || !is_servant_of_ratvar(user) || istype(target, /obj/item/storage))
|
||||
return TRUE
|
||||
return fabricate(target, user)
|
||||
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
|
||||
if(amount > 0)
|
||||
for(var/mob/living/L in view(2, src))
|
||||
if(L.is_holding_item_of_type(/obj/item/weapon/nullrod))
|
||||
if(L.is_holding_item_of_type(/obj/item/nullrod))
|
||||
to_chat(src, "<span class='userdanger'>The presence of a brandished holy artifact weakens your armor!</span>")
|
||||
amount *= 4 //if a wielded null rod is nearby, it takes four times the health damage
|
||||
break
|
||||
@@ -258,7 +258,7 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/nullrod) || !blockOrCounter(user, I))
|
||||
if(istype(I, /obj/item/nullrod) || !blockOrCounter(user, I))
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/proc/blockOrCounter(mob/target, atom/textobject)
|
||||
|
||||
@@ -57,6 +57,9 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
|
||||
if(slab.busy)
|
||||
to_chat(invoker, "<span class='warning'>[slab] refuses to work, displaying the message: \"[slab.busy]!\"</span>")
|
||||
return FALSE
|
||||
if(invoker.has_status_effect(STATUS_EFFECT_GEISTRACKER))
|
||||
to_chat(invoker, "<span class='warning'>[slab] refuses to work, displaying the message: \"Sustaining Geis!\"</span>")
|
||||
return FALSE
|
||||
slab.busy = "Invocation ([name]) in progress"
|
||||
if(GLOB.ratvar_awakens)
|
||||
channel_time *= 0.5 //if ratvar has awoken, half channel time and no cost
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/structure/destructible/clockwork/attackby(obj/item/I, mob/user, params)
|
||||
if(is_servant_of_ratvar(user) && istype(I, /obj/item/weapon/wrench) && unanchored_icon)
|
||||
if(is_servant_of_ratvar(user) && istype(I, /obj/item/wrench) && unanchored_icon)
|
||||
if(default_unfasten_wrench(user, I, 50) == SUCCESSFUL_UNFASTEN)
|
||||
update_anchored(user)
|
||||
return 1
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
/obj/structure/destructible/clockwork/geis_binding
|
||||
name = "glowing ring"
|
||||
desc = "A flickering, glowing purple ring around a target."
|
||||
clockwork_desc = "A binding ring around a target, preventing them from taking action while they're being converted."
|
||||
max_integrity = 25
|
||||
clockwork_desc = "A binding ring around a target, preventing them from taking action."
|
||||
max_integrity = 20
|
||||
light_range = 2
|
||||
light_power = 0.8
|
||||
light_color = "#AF0AAF"
|
||||
@@ -18,6 +18,8 @@
|
||||
can_buckle = TRUE
|
||||
buckle_lying = 0
|
||||
var/mob_layer = MOB_LAYER
|
||||
var/last_mob_health = 0
|
||||
var/apply_time = 0
|
||||
|
||||
/obj/structure/destructible/clockwork/geis_binding/Initialize(mapload, obj/item/clockwork/slab/the_slab)
|
||||
. = ..()
|
||||
@@ -33,21 +35,39 @@
|
||||
icon_state = "geisbinding"
|
||||
|
||||
/obj/structure/destructible/clockwork/geis_binding/process()
|
||||
var/tick_damage = 1
|
||||
if(locate(/obj/effect/clockwork/sigil/submission) in loc)
|
||||
tick_damage *= 0.5
|
||||
if(LAZYLEN(buckled_mobs))
|
||||
for(var/V in buckled_mobs)
|
||||
var/mob/living/L = V
|
||||
if(is_servant_of_ratvar(L)) //servants are freed automatically
|
||||
take_damage(obj_integrity)
|
||||
return
|
||||
var/tick_damage = 1
|
||||
if(!is_servant_of_ratvar(pulledby))
|
||||
tick_damage++
|
||||
if(last_mob_health > L.health)
|
||||
tick_damage += last_mob_health - L.health
|
||||
last_mob_health = L.health
|
||||
if(L.layer != mob_layer)
|
||||
mob_layer = L.layer
|
||||
layer = mob_layer - 0.01
|
||||
cut_overlays()
|
||||
add_overlay(mutable_appearance('icons/effects/clockwork_effects.dmi', "geisbinding_top", mob_layer + 0.01))
|
||||
break
|
||||
take_damage(tick_damage, sound_effect = FALSE)
|
||||
playsound(src, 'sound/effects/empulse.ogg', tick_damage * 20, TRUE)
|
||||
playsound(src, 'sound/effects/empulse.ogg', tick_damage * 40, TRUE, -4)
|
||||
|
||||
/obj/structure/destructible/clockwork/geis_binding/attack_hand(mob/living/user)
|
||||
return
|
||||
|
||||
/obj/structure/destructible/clockwork/geis_binding/attackby(obj/item/I, mob/user, params)
|
||||
if(is_servant_of_ratvar(user) && istype(I, /obj/item/clockwork/slab))
|
||||
user.visible_message("<span class='warning'>[user] starts to dispel [src]...</span>", "<span class='danger'>You start to dispel [src]...</span>")
|
||||
if(do_after(user, 30, target = src))
|
||||
user.visible_message("<span class='warning'>[user] dispels [src]!</span>", "<span class='danger'>You dispel [src]!</span>")
|
||||
take_damage(obj_integrity)
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/obj/structure/destructible/clockwork/geis_binding/emp_act(severity)
|
||||
new /obj/effect/temp_visual/emp(loc)
|
||||
qdel(src)
|
||||
@@ -56,16 +76,22 @@
|
||||
..()
|
||||
if(M.buckled == src)
|
||||
desc = "A flickering, glowing purple ring around [M]."
|
||||
clockwork_desc = "A binding ring around [M], preventing [M.p_them()] from taking action while [M.p_theyre()] being converted."
|
||||
clockwork_desc = "A binding ring around [M], preventing [M.p_them()] from taking action."
|
||||
icon_state = "geisbinding"
|
||||
mob_layer = M.layer
|
||||
layer = M.layer - 0.01
|
||||
add_overlay(mutable_appearance('icons/effects/clockwork_effects.dmi', "geisbinding_top", M.layer + 0.01))
|
||||
layer = mob_layer - 0.01
|
||||
add_overlay(mutable_appearance('icons/effects/clockwork_effects.dmi', "geisbinding_top", mob_layer + 0.01))
|
||||
last_mob_health = M.health
|
||||
apply_time = world.time
|
||||
for(var/obj/item/I in M.held_items)
|
||||
M.dropItemToGround(I)
|
||||
for(var/i in M.get_empty_held_indexes())
|
||||
var/obj/item/geis_binding/B = new(M)
|
||||
M.put_in_hands(B, i)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/restraints/handcuffs/energy/clock(C)
|
||||
M.regenerate_icons()
|
||||
M.visible_message("<span class='warning'>A [name] appears around [M]!</span>", "<span class='warning'>A [name] appears around you!</span>")
|
||||
repair_and_interrupt()
|
||||
@@ -79,8 +105,17 @@
|
||||
animate(G, transform = matrix()*2, alpha = 0, time = 8, easing = EASE_OUT)
|
||||
animate(T, transform = matrix()*2, alpha = 0, time = 8, easing = EASE_OUT)
|
||||
M.visible_message("<span class='warning'>[src] snaps into glowing pieces and dissipates!</span>")
|
||||
M.AdjustStun(-130 + (apply_time - world.time), 1, 1) //remove exactly as much stun as was applied
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
C.silent = max(C.silent - 7, 0)
|
||||
for(var/obj/item/geis_binding/GB in M.held_items)
|
||||
M.dropItemToGround(GB, TRUE)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(istype(C.handcuffed, /obj/item/restraints/handcuffs/energy/clock))
|
||||
QDEL_NULL(C.handcuffed)
|
||||
C.update_handcuffed()
|
||||
|
||||
/obj/structure/destructible/clockwork/geis_binding/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
|
||||
playsound(src, 'sound/effects/empulse.ogg', 50, 1)
|
||||
@@ -130,3 +165,10 @@
|
||||
|
||||
/obj/item/geis_binding/pre_attackby(atom/target, mob/living/user, params)
|
||||
return FALSE
|
||||
|
||||
/obj/item/restraints/handcuffs/energy/clock
|
||||
name = "glowing rings"
|
||||
desc = "Flickering rings preventing you from holding items."
|
||||
icon = 'icons/effects/clockwork_effects.dmi'
|
||||
icon_state = "geisbinding_full"
|
||||
flags_1 = NODROP_1|ABSTRACT_1|DROPDEL_1
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
if(O.emped || !O.on)
|
||||
continue
|
||||
O.emp_act(EMP_HEAVY)
|
||||
else if((isliving(A) && !is_servant_of_ratvar(A)) || istype(A, /obj/structure/closet) || istype(A, /obj/item/weapon/storage)) //other things may have radios in them but we don't care
|
||||
else if((isliving(A) && !is_servant_of_ratvar(A)) || istype(A, /obj/structure/closet) || istype(A, /obj/item/storage)) //other things may have radios in them but we don't care
|
||||
for(var/obj/item/device/radio/O in A.GetAllContents())
|
||||
successfulprocess = TRUE
|
||||
if(O.emped || !O.on)
|
||||
|
||||
@@ -102,11 +102,11 @@
|
||||
/obj/structure/destructible/clockwork/ocular_warden/proc/acquire_nearby_targets()
|
||||
. = list()
|
||||
for(var/mob/living/L in viewers(sight_range, src)) //Doesn't attack the blind
|
||||
var/obj/item/weapon/storage/book/bible/B = L.bible_check()
|
||||
var/obj/item/storage/book/bible/B = L.bible_check()
|
||||
if(B)
|
||||
if(!(B.resistance_flags & ON_FIRE))
|
||||
to_chat(L, "<span class='warning'>Your [B.name] bursts into flames!</span>")
|
||||
for(var/obj/item/weapon/storage/book/bible/BI in L.GetAllContents())
|
||||
for(var/obj/item/storage/book/bible/BI in L.GetAllContents())
|
||||
if(!(BI.resistance_flags & ON_FIRE))
|
||||
BI.fire_act()
|
||||
continue
|
||||
|
||||
@@ -24,10 +24,10 @@
|
||||
return
|
||||
|
||||
/obj/structure/destructible/clockwork/wall_gear/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/wrench))
|
||||
if(istype(I, /obj/item/wrench))
|
||||
default_unfasten_wrench(user, I, 10)
|
||||
return 1
|
||||
else if(istype(I, /obj/item/weapon/screwdriver))
|
||||
else if(istype(I, /obj/item/screwdriver))
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='warning'>[src] needs to be unsecured to disassemble it!</span>")
|
||||
else
|
||||
|
||||
@@ -125,9 +125,9 @@
|
||||
mob.dna.remove_mutation(CLOWNMUT)
|
||||
|
||||
if(tome)
|
||||
. += cult_give_item(/obj/item/weapon/tome, mob)
|
||||
. += cult_give_item(/obj/item/tome, mob)
|
||||
else
|
||||
. += cult_give_item(/obj/item/weapon/paper/talisman/supply, mob)
|
||||
. += cult_give_item(/obj/item/paper/talisman/supply, mob)
|
||||
to_chat(mob, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.</span>")
|
||||
|
||||
/datum/game_mode/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob)
|
||||
@@ -146,7 +146,7 @@
|
||||
else
|
||||
to_chat(mob, "<span class='danger'>You have a [item_name] in your [where].")
|
||||
if(where == "backpack")
|
||||
var/obj/item/weapon/storage/B = mob.back
|
||||
var/obj/item/storage/B = mob.back
|
||||
B.orient2hud(mob)
|
||||
B.show_to(mob)
|
||||
return 1
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/weapon/melee/cultblade
|
||||
/obj/item/melee/cultblade
|
||||
name = "eldritch longsword"
|
||||
desc = "A sword humming with unholy energy. It glows with a dim red light."
|
||||
icon_state = "cultblade"
|
||||
@@ -14,7 +14,7 @@
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended")
|
||||
|
||||
|
||||
/obj/item/weapon/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
/obj/item/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
if(!iscultist(user))
|
||||
user.Knockdown(100)
|
||||
user.dropItemToGround(src, TRUE)
|
||||
@@ -28,12 +28,12 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/melee/cultblade/ghost
|
||||
/obj/item/melee/cultblade/ghost
|
||||
name = "eldritch sword"
|
||||
force = 19 //can't break normal airlocks
|
||||
flags_1 = NODROP_1|DROPDEL_1
|
||||
|
||||
/obj/item/weapon/melee/cultblade/pickup(mob/living/user)
|
||||
/obj/item/melee/cultblade/pickup(mob/living/user)
|
||||
..()
|
||||
if(!iscultist(user))
|
||||
if(!is_servant_of_ratvar(user))
|
||||
@@ -47,7 +47,7 @@
|
||||
user.apply_damage(30, BRUTE, pick("l_arm", "r_arm"))
|
||||
user.dropItemToGround(src)
|
||||
|
||||
/obj/item/weapon/melee/cultblade/dagger
|
||||
/obj/item/melee/cultblade/dagger
|
||||
name = "sacrificial dagger"
|
||||
desc = "A strange dagger said to be used by sinister groups for \"preparing\" a corpse before sacrificing it to their dark gods."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
@@ -57,7 +57,7 @@
|
||||
throwforce = 25
|
||||
embed_chance = 75
|
||||
|
||||
/obj/item/weapon/melee/cultblade/dagger/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
/obj/item/melee/cultblade/dagger/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
..()
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
@@ -66,7 +66,7 @@
|
||||
C.reagents.add_reagent("heparin", 1)
|
||||
|
||||
|
||||
/obj/item/weapon/restraints/legcuffs/bola/cult
|
||||
/obj/item/restraints/legcuffs/bola/cult
|
||||
name = "nar'sien bola"
|
||||
desc = "A strong bola, bound with dark magic. Throw it to trip and slow your victim."
|
||||
icon_state = "bola_cult"
|
||||
@@ -92,7 +92,7 @@
|
||||
icon_state = "cultrobes"
|
||||
item_state = "cultrobes"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
|
||||
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
|
||||
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0, fire = 10, acid = 10)
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
cold_protection = CHEST|GROIN|LEGS|ARMS
|
||||
@@ -135,7 +135,7 @@
|
||||
icon_state = "magusred"
|
||||
item_state = "magusred"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
|
||||
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
|
||||
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0, fire = 10, acid = 10)
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
|
||||
@@ -154,11 +154,11 @@
|
||||
item_state = "cult_armor"
|
||||
desc = "A heavily-armored exosuit worn by warriors of the Nar-Sien cult. It can withstand hard vacuum."
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade, /obj/item/weapon/tank/internals/)
|
||||
allowed = list(/obj/item/tome, /obj/item/melee/cultblade, /obj/item/tank/internals/)
|
||||
armor = list(melee = 70, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 40, acid = 75)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/cult
|
||||
|
||||
/obj/item/weapon/sharpener/cult
|
||||
/obj/item/sharpener/cult
|
||||
name = "eldritch whetstone"
|
||||
desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone."
|
||||
icon_state = "cult_sharpener"
|
||||
@@ -167,7 +167,7 @@
|
||||
max = 40
|
||||
prefix = "darkened"
|
||||
|
||||
/obj/item/weapon/sharpener/cult/update_icon()
|
||||
/obj/item/sharpener/cult/update_icon()
|
||||
icon_state = "cult_sharpener[used ? "_used" : ""]"
|
||||
|
||||
/obj/item/clothing/suit/hooded/cultrobes/cult_shield
|
||||
@@ -178,7 +178,7 @@
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
armor = list(melee = 50, bullet = 40, laser = 50,energy = 30, bomb = 50, bio = 30, rad = 30, fire = 50, acid = 60)
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
|
||||
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
|
||||
var/current_charges = 3
|
||||
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie
|
||||
|
||||
@@ -228,7 +228,7 @@
|
||||
icon_state = "cultrobes"
|
||||
item_state = "cultrobes"
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
|
||||
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
armor = list(melee = -50, bullet = -50, laser = -50,energy = -50, bomb = -50, bio = -50, rad = -50, fire = 0, acid = 0)
|
||||
slowdown = -1
|
||||
@@ -275,7 +275,7 @@
|
||||
user.Knockdown(100)
|
||||
user.blind_eyes(30)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater
|
||||
/obj/item/reagent_containers/food/drinks/bottle/unholywater
|
||||
name = "flask of unholy water"
|
||||
desc = "Toxic to nonbelievers; reinvigorating to the faithful - this flask may be sipped or thrown."
|
||||
icon_state = "holyflask"
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
..()
|
||||
|
||||
/obj/structure/destructible/cult/attackby(obj/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
|
||||
if(istype(I, /obj/item/tome) && iscultist(user))
|
||||
anchored = !anchored
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "":"un"]secure \the [src] [anchored ? "to":"from"] the floor.</span>")
|
||||
if(!anchored)
|
||||
@@ -78,11 +78,11 @@
|
||||
var/pickedtype
|
||||
switch(choice)
|
||||
if("Eldritch Whetstone")
|
||||
pickedtype = /obj/item/weapon/sharpener/cult
|
||||
pickedtype = /obj/item/sharpener/cult
|
||||
if("Zealot's Blindfold")
|
||||
pickedtype = /obj/item/clothing/glasses/night/cultblind
|
||||
if("Flask of Unholy Water")
|
||||
pickedtype = /obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater
|
||||
pickedtype = /obj/item/reagent_containers/food/drinks/bottle/unholywater
|
||||
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
|
||||
cooldowntime = world.time + 2400
|
||||
var/obj/item/N = new pickedtype(get_turf(src))
|
||||
@@ -218,7 +218,7 @@
|
||||
var/list/pickedtype = list()
|
||||
switch(choice)
|
||||
if("Supply Talisman")
|
||||
pickedtype += /obj/item/weapon/paper/talisman/supply/weak
|
||||
pickedtype += /obj/item/paper/talisman/supply/weak
|
||||
if("Shuttle Curse")
|
||||
pickedtype += /obj/item/device/shuttle_curse
|
||||
if("Veil Walker Set")
|
||||
|
||||
@@ -5,7 +5,7 @@ This file contains the arcane tome files.
|
||||
*/
|
||||
|
||||
|
||||
/obj/item/weapon/tome
|
||||
/obj/item/tome
|
||||
name = "arcane tome"
|
||||
desc = "An old, dusty tome with frayed edges and a sinister-looking cover."
|
||||
icon_state ="tome"
|
||||
@@ -13,7 +13,7 @@ This file contains the arcane tome files.
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/weapon/tome/Initialize()
|
||||
/obj/item/tome/Initialize()
|
||||
. = ..()
|
||||
if(!LAZYLEN(GLOB.rune_types))
|
||||
GLOB.rune_types = list()
|
||||
@@ -22,7 +22,7 @@ This file contains the arcane tome files.
|
||||
var/obj/effect/rune/R = i_can_do_loops_now_thanks_remie
|
||||
GLOB.rune_types[initial(R.cultist_name)] = R //Uses the cultist name for displaying purposes
|
||||
|
||||
/obj/item/weapon/tome/examine(mob/user)
|
||||
/obj/item/tome/examine(mob/user)
|
||||
..()
|
||||
if(iscultist(user) || isobserver(user))
|
||||
to_chat(user, "<span class='cult'>The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar-Sie.</span>")
|
||||
@@ -30,7 +30,7 @@ This file contains the arcane tome files.
|
||||
to_chat(user, "<span class='cult'>Striking another cultist with it will purge holy water from them.</span>")
|
||||
to_chat(user, "<span class='cult'>Striking a noncultist, however, will sear their flesh.</span>")
|
||||
|
||||
/obj/item/weapon/tome/attack(mob/living/M, mob/living/user)
|
||||
/obj/item/tome/attack(mob/living/M, mob/living/user)
|
||||
if(!istype(M))
|
||||
return
|
||||
if(!iscultist(user))
|
||||
@@ -51,13 +51,13 @@ This file contains the arcane tome files.
|
||||
user.do_attack_animation(M)
|
||||
add_logs(user, M, "smacked", src)
|
||||
|
||||
/obj/item/weapon/tome/attack_self(mob/user)
|
||||
/obj/item/tome/attack_self(mob/user)
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "<span class='warning'>[src] seems full of unintelligible shapes, scribbles, and notes. Is this some sort of joke?</span>")
|
||||
return
|
||||
open_tome(user)
|
||||
|
||||
/obj/item/weapon/tome/proc/open_tome(mob/user)
|
||||
/obj/item/tome/proc/open_tome(mob/user)
|
||||
var/choice = alert(user,"You open the tome...",,"Scribe Rune","More Information","Cancel")
|
||||
switch(choice)
|
||||
if("More Information")
|
||||
@@ -67,7 +67,7 @@ This file contains the arcane tome files.
|
||||
if("Cancel")
|
||||
return
|
||||
|
||||
/obj/item/weapon/tome/proc/read_tome(mob/user)
|
||||
/obj/item/tome/proc/read_tome(mob/user)
|
||||
var/text = ""
|
||||
text += "<center><font color='red' size=3><b><i>Archives of the Dark One</i></b></font></center><br><br><br>"
|
||||
text += "A rune's name and effects can be revealed by examining the rune.<br><br>"
|
||||
@@ -171,7 +171,7 @@ This file contains the arcane tome files.
|
||||
popup.open()
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/tome/proc/scribe_rune(mob/living/user)
|
||||
/obj/item/tome/proc/scribe_rune(mob/living/user)
|
||||
var/turf/Turf = get_turf(user)
|
||||
var/chosen_keyword
|
||||
var/obj/effect/rune/rune_to_scribe
|
||||
@@ -248,7 +248,7 @@ This file contains the arcane tome files.
|
||||
to_chat(user, "<span class='cult'>The [lowertext(R.cultist_name)] rune [R.cultist_desc]</span>")
|
||||
SSblackbox.add_details("cult_runes_scribed", R.cultist_name)
|
||||
|
||||
/obj/item/weapon/tome/proc/check_rune_turf(turf/T, mob/user)
|
||||
/obj/item/tome/proc/check_rune_turf(turf/T, mob/user)
|
||||
if(isspaceturf(T))
|
||||
to_chat(user, "<span class='warning'>You cannot scribe runes in space!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -56,10 +56,10 @@ To draw a rune, use an arcane tome.
|
||||
to_chat(user, "<b>Keyword:</b> [keyword]")
|
||||
|
||||
/obj/effect/rune/attackby(obj/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
|
||||
if(istype(I, /obj/item/tome) && iscultist(user))
|
||||
to_chat(user, "<span class='notice'>You carefully erase the [lowertext(cultist_name)] rune.</span>")
|
||||
qdel(src)
|
||||
else if(istype(I, /obj/item/weapon/nullrod))
|
||||
else if(istype(I, /obj/item/nullrod))
|
||||
user.say("BEGONE FOUL MAGIKS!!")
|
||||
to_chat(user, "<span class='danger'>You disrupt the magic of [src] with [I].</span>")
|
||||
qdel(src)
|
||||
@@ -175,13 +175,13 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
qdel(src)
|
||||
|
||||
/mob/proc/null_rod_check() //The null rod, if equipped, will protect the holder from the effects of most runes
|
||||
var/obj/item/weapon/nullrod/N = locate() in src
|
||||
var/obj/item/nullrod/N = locate() in src
|
||||
if(N && !GLOB.ratvar_awakens) //If Nar-Sie or Ratvar are alive, null rods won't protect you
|
||||
return N
|
||||
return 0
|
||||
|
||||
/mob/proc/bible_check() //The bible, if held, might protect against certain things
|
||||
var/obj/item/weapon/storage/book/bible/B = locate() in src
|
||||
var/obj/item/storage/book/bible/B = locate() in src
|
||||
if(is_holding(B))
|
||||
return B
|
||||
return 0
|
||||
@@ -198,7 +198,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
var/mob/living/user = invokers[1] //the first invoker is always the user
|
||||
var/list/papers_on_rune = checkpapers()
|
||||
var/entered_talisman_name
|
||||
var/obj/item/weapon/paper/talisman/talisman_type
|
||||
var/obj/item/paper/talisman/talisman_type
|
||||
var/list/possible_talismans = list()
|
||||
if(!papers_on_rune.len)
|
||||
to_chat(user, "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>")
|
||||
@@ -211,8 +211,8 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
log_game("Talisman Creation rune failed - already in use")
|
||||
return
|
||||
|
||||
for(var/I in subtypesof(/obj/item/weapon/paper/talisman) - /obj/item/weapon/paper/talisman/malformed - /obj/item/weapon/paper/talisman/supply - /obj/item/weapon/paper/talisman/supply/weak - /obj/item/weapon/paper/talisman/summon_tome)
|
||||
var/obj/item/weapon/paper/talisman/J = I
|
||||
for(var/I in subtypesof(/obj/item/paper/talisman) - /obj/item/paper/talisman/malformed - /obj/item/paper/talisman/supply - /obj/item/paper/talisman/supply/weak - /obj/item/paper/talisman/summon_tome)
|
||||
var/obj/item/paper/talisman/J = I
|
||||
var/talisman_cult_name = initial(J.cultist_name)
|
||||
if(talisman_cult_name)
|
||||
possible_talismans[talisman_cult_name] = J //This is to allow the menu to let cultists select talismans by name
|
||||
@@ -226,7 +226,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
fail_invoke()
|
||||
log_game("Talisman Creation rune failed - no blank papers on rune")
|
||||
return
|
||||
var/obj/item/weapon/paper/paper_to_imbue = papers_on_rune[1]
|
||||
var/obj/item/paper/paper_to_imbue = papers_on_rune[1]
|
||||
..()
|
||||
visible_message("<span class='warning'>Dark power begins to channel into the paper!</span>")
|
||||
rune_in_use = TRUE
|
||||
@@ -238,8 +238,8 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
|
||||
/obj/effect/rune/imbue/proc/checkpapers()
|
||||
. = list()
|
||||
for(var/obj/item/weapon/paper/P in get_turf(src))
|
||||
if(!P.info && !istype(P, /obj/item/weapon/paper/talisman))
|
||||
for(var/obj/item/paper/P in get_turf(src))
|
||||
if(!P.info && !istype(P, /obj/item/paper/talisman))
|
||||
. |= P
|
||||
|
||||
/obj/effect/rune/teleport
|
||||
@@ -388,7 +388,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
[brutedamage || burndamage ? "even as [convertee.p_their()] wounds heal and close" : "as the markings below [convertee.p_them()] glow a bloody red"]!</span>", \
|
||||
"<span class='cultlarge'><i>AAAAAAAAAAAAAA-</i></span>")
|
||||
SSticker.mode.add_cultist(convertee.mind, 1)
|
||||
new /obj/item/weapon/tome(get_turf(src))
|
||||
new /obj/item/tome(get_turf(src))
|
||||
convertee.mind.special_role = "Cultist"
|
||||
to_chat(convertee, "<span class='cultitalic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
|
||||
and something evil takes root.</b></span>")
|
||||
@@ -485,14 +485,14 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
new /obj/singularity/narsie/large/cult(T) //Causes Nar-Sie to spawn even if the rune has been removed
|
||||
|
||||
/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
|
||||
if((istype(I, /obj/item/weapon/tome) && iscultist(user)))
|
||||
if((istype(I, /obj/item/tome) && iscultist(user)))
|
||||
user.visible_message("<span class='warning'>[user.name] begins erasing the [src]...</span>", "<span class='notice'>You begin erasing the [src]...</span>")
|
||||
if(do_after(user, 50, target = src)) //Prevents accidental erasures.
|
||||
log_game("Summon Narsie rune erased by [user.mind.key] (ckey) with a tome")
|
||||
message_admins("[key_name_admin(user)] erased a Narsie rune with a tome")
|
||||
..()
|
||||
else
|
||||
if(istype(I, /obj/item/weapon/nullrod)) //Begone foul magiks. You cannot hinder me.
|
||||
if(istype(I, /obj/item/nullrod)) //Begone foul magiks. You cannot hinder me.
|
||||
log_game("Summon Narsie rune erased by [user.mind.key] (ckey) using a null rod")
|
||||
message_admins("[key_name_admin(user)] erased a Narsie rune with a null rod")
|
||||
..()
|
||||
@@ -842,7 +842,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
set_light(6, 1, color)
|
||||
for(var/mob/living/L in viewers(T))
|
||||
if(!iscultist(L) && L.blood_volume)
|
||||
var/obj/item/weapon/nullrod/N = L.null_rod_check()
|
||||
var/obj/item/nullrod/N = L.null_rod_check()
|
||||
if(N)
|
||||
to_chat(L, "<span class='userdanger'>\The [N] suddenly burns hotly before returning to normal!</span>")
|
||||
continue
|
||||
@@ -871,7 +871,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
set_light(6, 1, color)
|
||||
for(var/mob/living/L in viewers(T))
|
||||
if(!iscultist(L) && L.blood_volume)
|
||||
var/obj/item/weapon/nullrod/N = L.null_rod_check()
|
||||
var/obj/item/nullrod/N = L.null_rod_check()
|
||||
if(N)
|
||||
continue
|
||||
L.take_overall_damage(tick_damage*multiplier, tick_damage*multiplier)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//Supply Talisman: Has a few unique effects. Granted only to starter cultists.
|
||||
/obj/item/weapon/paper/talisman/supply
|
||||
/obj/item/paper/talisman/supply
|
||||
cultist_name = "Supply Talisman"
|
||||
cultist_desc = "A multi-use talisman that can create various objects. Intended to increase the cult's strength early on."
|
||||
invocation = null
|
||||
@@ -15,7 +15,7 @@
|
||||
/datum/cult_supply/construct_shell
|
||||
)
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/supply/invoke(mob/living/user, successfuluse = 1)
|
||||
var/list/dat = list()
|
||||
dat += "<B>There are [uses] bloody runes on the parchment.</B><BR>"
|
||||
dat += "Please choose the chant to be imbued into the fabric of reality.<BR>"
|
||||
@@ -28,7 +28,7 @@
|
||||
popup.open()
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply/Topic(href, href_list)
|
||||
/obj/item/paper/talisman/supply/Topic(href, href_list)
|
||||
if(QDELETED(src) || usr.incapacitated() || !in_range(src, usr))
|
||||
return
|
||||
|
||||
@@ -58,11 +58,11 @@
|
||||
to_chat(usr, "<span class='warning'>[src] crumbles to dust.</span>")
|
||||
burn()
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply/weak
|
||||
/obj/item/paper/talisman/supply/weak
|
||||
cultist_name = "Lesser Supply Talisman"
|
||||
uses = 2
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply/weak/Initialize(mapload)
|
||||
/obj/item/paper/talisman/supply/weak/Initialize(mapload)
|
||||
. = ..()
|
||||
// no runed metal from lesser talismans.
|
||||
possible_summons -= /datum/cult_supply/metal
|
||||
@@ -77,7 +77,7 @@
|
||||
id = "arcane_tome"
|
||||
invocation = "N'ath reth sh'yro eth d'raggathnor!"
|
||||
desc = "Summons an arcane tome, used to scribe runes."
|
||||
summon_type = /obj/item/weapon/tome
|
||||
summon_type = /obj/item/tome
|
||||
|
||||
/datum/cult_supply/metal
|
||||
id = "runed_metal"
|
||||
@@ -89,25 +89,25 @@
|
||||
id = "teleport_talisman"
|
||||
invocation = "Sas'so c'arta forbici!"
|
||||
desc = "Allows you to move to a selected teleportation rune."
|
||||
summon_type = /obj/item/weapon/paper/talisman/teleport
|
||||
summon_type = /obj/item/paper/talisman/teleport
|
||||
|
||||
/datum/cult_supply/talisman/emp
|
||||
id = "emp_talisman"
|
||||
invocation = "Ta'gh fara'qha fel d'amar det!"
|
||||
desc = "Allows you to destroy technology in a short range."
|
||||
summon_type = /obj/item/weapon/paper/talisman/emp
|
||||
summon_type = /obj/item/paper/talisman/emp
|
||||
|
||||
/datum/cult_supply/talisman/stun
|
||||
id = "stun_talisman"
|
||||
invocation = "Fuu ma'jin!"
|
||||
desc = "Allows you to stun a person by attacking them with the talisman. Does not work on people holding a holy weapon!"
|
||||
summon_type = /obj/item/weapon/paper/talisman/stun
|
||||
summon_type = /obj/item/paper/talisman/stun
|
||||
|
||||
/datum/cult_supply/talisman/veil
|
||||
id = "veil_talisman"
|
||||
invocation = "Kla'atu barada nikt'o!"
|
||||
desc = "Two use talisman, first use makes all nearby runes invisible, secnd use reveals nearby hidden runes."
|
||||
summon_type = /obj/item/weapon/paper/talisman/true_sight
|
||||
summon_type = /obj/item/paper/talisman/true_sight
|
||||
|
||||
/datum/cult_supply/soulstone
|
||||
id = "soulstone"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/weapon/paper/talisman
|
||||
/obj/item/paper/talisman
|
||||
var/cultist_name = "talisman"
|
||||
var/cultist_desc = "A basic talisman. It serves no purpose."
|
||||
var/invocation = "Naise meam!"
|
||||
@@ -6,7 +6,7 @@
|
||||
var/health_cost = 0 //The amount of health taken from the user when invoking the talisman
|
||||
var/creation_time = 100 //how long it takes an imbue rune to make this type of talisman
|
||||
|
||||
/obj/item/weapon/paper/talisman/examine(mob/user)
|
||||
/obj/item/paper/talisman/examine(mob/user)
|
||||
if(iscultist(user) || user.stat == DEAD)
|
||||
to_chat(user, "<b>Name:</b> [cultist_name]")
|
||||
to_chat(user, "<b>Effect:</b> [cultist_desc]")
|
||||
@@ -14,7 +14,7 @@
|
||||
else
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
|
||||
/obj/item/weapon/paper/talisman/attack_self(mob/living/user)
|
||||
/obj/item/paper/talisman/attack_self(mob/living/user)
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
return
|
||||
@@ -24,7 +24,7 @@
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/paper/talisman/proc/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/proc/invoke(mob/living/user, successfuluse = 1)
|
||||
. = successfuluse
|
||||
if(successfuluse) //if the calling whatever says we succeed, do the fancy stuff
|
||||
if(invocation)
|
||||
@@ -34,19 +34,19 @@
|
||||
C.apply_damage(health_cost, BRUTE, pick("l_arm", "r_arm"))
|
||||
|
||||
//Malformed Talisman: If something goes wrong.
|
||||
/obj/item/weapon/paper/talisman/malformed
|
||||
/obj/item/paper/talisman/malformed
|
||||
cultist_name = "malformed talisman"
|
||||
cultist_desc = "A talisman with gibberish scrawlings. No good can come from invoking this."
|
||||
invocation = "Ra'sha yoka!"
|
||||
|
||||
/obj/item/weapon/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1)
|
||||
to_chat(user, "<span class='cultitalic'>You feel a pain in your head. The Geometer is displeased.</span>")
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.apply_damage(10, BRUTE, "head")
|
||||
|
||||
//Rite of Translocation: Same as rune
|
||||
/obj/item/weapon/paper/talisman/teleport
|
||||
/obj/item/paper/talisman/teleport
|
||||
cultist_name = "Talisman of Teleportation"
|
||||
cultist_desc = "A single-use talisman that will teleport a user to a random rune of the same keyword."
|
||||
color = RUNE_COLOR_TELEPORT
|
||||
@@ -54,7 +54,7 @@
|
||||
health_cost = 5
|
||||
creation_time = 80
|
||||
|
||||
/obj/item/weapon/paper/talisman/teleport/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/teleport/invoke(mob/living/user, successfuluse = 1)
|
||||
var/list/potential_runes = list()
|
||||
var/list/teleportnames = list()
|
||||
for(var/R in GLOB.teleport_runes)
|
||||
@@ -86,7 +86,7 @@
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/summon_tome
|
||||
/obj/item/paper/talisman/summon_tome
|
||||
cultist_name = "Talisman of Tome Summoning"
|
||||
cultist_desc = "A one-use talisman that will call an untranslated tome from the archives of the Geometer."
|
||||
color = "#512727" // red-black
|
||||
@@ -94,15 +94,15 @@
|
||||
health_cost = 1
|
||||
creation_time = 30
|
||||
|
||||
/obj/item/weapon/paper/talisman/summon_tome/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/summon_tome/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
user.visible_message("<span class='warning'>[user]'s hand glows red for a moment.</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman!</span>")
|
||||
new /obj/item/weapon/tome(get_turf(user))
|
||||
new /obj/item/tome(get_turf(user))
|
||||
user.visible_message("<span class='warning'>A tome appears at [user]'s feet!</span>", \
|
||||
"<span class='cultitalic'>An arcane tome materializes at your feet.</span>")
|
||||
|
||||
/obj/item/weapon/paper/talisman/true_sight
|
||||
/obj/item/paper/talisman/true_sight
|
||||
cultist_name = "Talisman of Veiling"
|
||||
cultist_desc = "A multi-use talisman that hides nearby runes. On its second use, will reveal nearby runes."
|
||||
color = "#9c9c9c" // grey
|
||||
@@ -112,7 +112,7 @@
|
||||
uses = 6
|
||||
var/revealing = FALSE //if it reveals or not
|
||||
|
||||
/obj/item/weapon/paper/talisman/true_sight/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/true_sight/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
if(!revealing)
|
||||
user.visible_message("<span class='warning'>Thin grey dust falls from [user]'s hand!</span>", \
|
||||
@@ -128,14 +128,14 @@
|
||||
R.talismanreveal()
|
||||
|
||||
//Rite of Disruption: Weaker than rune
|
||||
/obj/item/weapon/paper/talisman/emp
|
||||
/obj/item/paper/talisman/emp
|
||||
cultist_name = "Talisman of Electromagnetic Pulse"
|
||||
cultist_desc = "A talisman that will cause a moderately-sized electromagnetic pulse."
|
||||
color = "#4d94ff" // light blue
|
||||
invocation = "Ta'gh fara'qha fel d'amar det!"
|
||||
health_cost = 5
|
||||
|
||||
/obj/item/weapon/paper/talisman/emp/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/emp/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
user.visible_message("<span class='warning'>[user]'s hand flashes a bright blue!</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman, emitting an EMP blast.</span>")
|
||||
@@ -143,14 +143,14 @@
|
||||
|
||||
|
||||
//Rite of Disorientation: Stuns and inhibit speech on a single target for quite some time
|
||||
/obj/item/weapon/paper/talisman/stun
|
||||
/obj/item/paper/talisman/stun
|
||||
cultist_name = "Talisman of Stunning"
|
||||
cultist_desc = "A talisman that will stun and inhibit speech on a single target. To use, attack target directly."
|
||||
color = "#ff0000" // red
|
||||
invocation = "Fuu ma'jin!"
|
||||
health_cost = 10
|
||||
|
||||
/obj/item/weapon/paper/talisman/stun/invoke(mob/living/user, successfuluse = 0)
|
||||
/obj/item/paper/talisman/stun/invoke(mob/living/user, successfuluse = 0)
|
||||
if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff
|
||||
return ..()
|
||||
if(iscultist(user))
|
||||
@@ -159,12 +159,12 @@
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/paper/talisman/stun/attack(mob/living/target, mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/stun/attack(mob/living/target, mob/living/user, successfuluse = 1)
|
||||
if(iscultist(user))
|
||||
invoke(user, 1)
|
||||
user.visible_message("<span class='warning'>[user] holds up [src], which explodes in a flash of red light!</span>", \
|
||||
"<span class='cultitalic'>You stun [target] with the talisman!</span>")
|
||||
var/obj/item/weapon/nullrod/N = locate() in target
|
||||
var/obj/item/nullrod/N = locate() in target
|
||||
if(N)
|
||||
target.visible_message("<span class='warning'>[target]'s holy weapon absorbs the talisman's light!</span>", \
|
||||
"<span class='userdanger'>Your holy weapon absorbs the blinding light!</span>")
|
||||
@@ -189,26 +189,26 @@
|
||||
|
||||
|
||||
//Rite of Arming: Equips cultist armor on the user, where available
|
||||
/obj/item/weapon/paper/talisman/armor
|
||||
/obj/item/paper/talisman/armor
|
||||
cultist_name = "Talisman of Arming"
|
||||
cultist_desc = "A talisman that will equip the invoker with cultist equipment if there is a slot to equip it to."
|
||||
color = "#33cc33" // green
|
||||
invocation = "N'ath reth sh'yro eth draggathnor!"
|
||||
creation_time = 80
|
||||
|
||||
/obj/item/weapon/paper/talisman/armor/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/armor/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
user.visible_message("<span class='warning'>Otherworldly armor suddenly appears on [user]!</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman, arming yourself!</span>")
|
||||
user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head)
|
||||
user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit)
|
||||
user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes)
|
||||
user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
|
||||
user.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), slot_back)
|
||||
user.drop_item()
|
||||
user.put_in_hands(new /obj/item/weapon/melee/cultblade(user))
|
||||
user.put_in_hands(new /obj/item/weapon/restraints/legcuffs/bola/cult(user))
|
||||
user.put_in_hands(new /obj/item/melee/cultblade(user))
|
||||
user.put_in_hands(new /obj/item/restraints/legcuffs/bola/cult(user))
|
||||
|
||||
/obj/item/weapon/paper/talisman/armor/attack(mob/living/target, mob/living/user)
|
||||
/obj/item/paper/talisman/armor/attack(mob/living/target, mob/living/user)
|
||||
if(iscultist(user) && iscultist(target))
|
||||
user.drop_item()
|
||||
invoke(target)
|
||||
@@ -218,14 +218,14 @@
|
||||
|
||||
|
||||
//Talisman of Horrors: Breaks the mind of the victim with nightmarish hallucinations
|
||||
/obj/item/weapon/paper/talisman/horror
|
||||
/obj/item/paper/talisman/horror
|
||||
cultist_name = "Talisman of Horrors"
|
||||
cultist_desc = "A talisman that will break the mind of the victim with nightmarish hallucinations."
|
||||
color = "#ffb366" // light orange
|
||||
invocation = "Lo'Nab Na'Dm!"
|
||||
creation_time = 80
|
||||
|
||||
/obj/item/weapon/paper/talisman/horror/afterattack(mob/living/target, mob/living/user)
|
||||
/obj/item/paper/talisman/horror/afterattack(mob/living/target, mob/living/user)
|
||||
if(iscultist(user) && (get_dist(user, target) < 7))
|
||||
to_chat(user, "<span class='cultitalic'>You disturb [target] with visions of madness!</span>")
|
||||
if(iscarbon(target))
|
||||
@@ -240,7 +240,7 @@
|
||||
|
||||
|
||||
//Talisman of Fabrication: Creates a construct shell out of 25 metal sheets, or converts plasteel into runed metal up to 25 times
|
||||
/obj/item/weapon/paper/talisman/construction
|
||||
/obj/item/paper/talisman/construction
|
||||
cultist_name = "Talisman of Construction"
|
||||
cultist_desc = "Use this talisman on at least twenty-five metal sheets to create an empty construct shell"
|
||||
invocation = "Ethra p'ni dedol!"
|
||||
@@ -248,21 +248,21 @@
|
||||
uses = 25
|
||||
creation_time = 80
|
||||
|
||||
/obj/item/weapon/paper/talisman/construction/attack_self(mob/living/user)
|
||||
/obj/item/paper/talisman/construction/attack_self(mob/living/user)
|
||||
if(iscultist(user))
|
||||
to_chat(user, "<span class='warning'>To use this talisman, place it upon a stack of metal sheets.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/construction/attack(obj/M,mob/living/user)
|
||||
/obj/item/paper/talisman/construction/attack(obj/M,mob/living/user)
|
||||
if(iscultist(user))
|
||||
to_chat(user, "<span class='cultitalic'>This talisman will only work on a stack of metal or plasteel sheets!</span>")
|
||||
log_game("Construct talisman failed - not a valid target")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/paper/talisman/construction/afterattack(obj/item/stack/sheet/target, mob/user, proximity_flag, click_parameters)
|
||||
/obj/item/paper/talisman/construction/afterattack(obj/item/stack/sheet/target, mob/user, proximity_flag, click_parameters)
|
||||
..()
|
||||
if(proximity_flag && iscultist(user))
|
||||
var/turf/T = get_turf(target)
|
||||
@@ -290,14 +290,14 @@
|
||||
|
||||
|
||||
//Talisman of Shackling: Applies special cuffs directly from the talisman
|
||||
/obj/item/weapon/paper/talisman/shackle
|
||||
/obj/item/paper/talisman/shackle
|
||||
cultist_name = "Talisman of Shackling"
|
||||
cultist_desc = "Use this talisman on a victim to handcuff them with dark bindings."
|
||||
invocation = "In'totum Lig'abis!"
|
||||
color = "#B27300" // burnt-orange
|
||||
uses = 6
|
||||
|
||||
/obj/item/weapon/paper/talisman/shackle/invoke(mob/living/user, successfuluse = 0)
|
||||
/obj/item/paper/talisman/shackle/invoke(mob/living/user, successfuluse = 0)
|
||||
if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff
|
||||
return ..()
|
||||
if(iscultist(user))
|
||||
@@ -306,7 +306,7 @@
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/paper/talisman/shackle/attack(mob/living/carbon/target, mob/living/user)
|
||||
/obj/item/paper/talisman/shackle/attack(mob/living/carbon/target, mob/living/user)
|
||||
if(iscultist(user) && istype(target))
|
||||
if(target.stat == DEAD)
|
||||
user.visible_message("<span class='cultitalic'>This talisman's magic does not affect the dead!</span>")
|
||||
@@ -315,7 +315,7 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/paper/talisman/shackle/proc/CuffAttack(mob/living/carbon/C, mob/living/user)
|
||||
/obj/item/paper/talisman/shackle/proc/CuffAttack(mob/living/carbon/C, mob/living/user)
|
||||
if(!C.handcuffed)
|
||||
invoke(user, 1)
|
||||
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
|
||||
@@ -323,7 +323,7 @@
|
||||
"<span class='userdanger'>[user] begins shaping a dark magic around your wrists!</span>")
|
||||
if(do_mob(user, C, 30))
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/cult/used(C)
|
||||
C.handcuffed = new /obj/item/restraints/handcuffs/energy/cult/used(C)
|
||||
C.update_handcuffed()
|
||||
to_chat(user, "<span class='notice'>You shackle [C].</span>")
|
||||
add_logs(user, C, "handcuffed")
|
||||
@@ -338,14 +338,14 @@
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/energy/cult //For the talisman of shackling
|
||||
/obj/item/restraints/handcuffs/energy/cult //For the talisman of shackling
|
||||
name = "cult shackles"
|
||||
desc = "Shackles that bind the wrists with sinister magic."
|
||||
trashtype = /obj/item/weapon/restraints/handcuffs/energy/used
|
||||
trashtype = /obj/item/restraints/handcuffs/energy/used
|
||||
origin_tech = "materials=2;magnets=5"
|
||||
flags_1 = DROPDEL_1
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/energy/cult/used/dropped(mob/user)
|
||||
/obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user)
|
||||
user.visible_message("<span class='danger'>[user]'s shackles shatter in a discharge of dark magic!</span>", \
|
||||
"<span class='userdanger'>Your [src] shatters in a discharge of dark magic!</span>")
|
||||
. = ..()
|
||||
|
||||
@@ -26,11 +26,11 @@
|
||||
src.visible_message("<span class='warning'>[src] seems to have been harmed by the purity of [attacker]'s clothes.</span>", "<span class='notice'>Unsullied white clothing is disrupting your form.</span>")
|
||||
return whiteness[U.type] + 1
|
||||
if(BANE_TOOLBOX)
|
||||
if(istype(weapon, /obj/item/weapon/storage/toolbox))
|
||||
if(istype(weapon, /obj/item/storage/toolbox))
|
||||
src.visible_message("<span class='warning'>The [weapon] seems unusually robust this time.</span>", "<span class='notice'>The [weapon] is your unmaking!</span>")
|
||||
return 2.5 // Will take four hits with a normal toolbox to crit.
|
||||
if(BANE_HARVEST)
|
||||
if(istype(weapon, /obj/item/weapon/reagent_containers/food/snacks/grown/))
|
||||
if(istype(weapon, /obj/item/reagent_containers/food/snacks/grown/))
|
||||
visible_message("<span class='warning'>The spirits of the harvest aid in the exorcism.</span>", "<span class='notice'>The harvest spirits are harming you.</span>")
|
||||
Knockdown(40)
|
||||
qdel(weapon)
|
||||
|
||||
@@ -444,8 +444,8 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/black(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_hands)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/pen(H), slot_l_store)
|
||||
H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), slot_hands)
|
||||
H.equip_to_slot_or_del(new /obj/item/pen(H), slot_l_store)
|
||||
if(SOULVALUE >= BLOOD_THRESHOLD)
|
||||
H.set_species(/datum/species/lizard, 1)
|
||||
H.underwear = "Nude"
|
||||
|
||||
@@ -117,7 +117,7 @@ GLOBAL_LIST_INIT(gang_outfit_pool, list(/obj/item/clothing/suit/jacket/leather,
|
||||
mob.dna.remove_mutation(CLOWNMUT)
|
||||
|
||||
var/obj/item/device/gangtool/gangtool = new(mob)
|
||||
var/obj/item/weapon/pen/gang/T = new(mob)
|
||||
var/obj/item/pen/gang/T = new(mob)
|
||||
var/obj/item/toy/crayon/spraycan/gang/SC = new(mob,gang)
|
||||
var/obj/item/clothing/glasses/hud/security/chameleon/C = new(mob,gang)
|
||||
|
||||
|
||||
@@ -174,16 +174,16 @@
|
||||
name = "Badass Belt"
|
||||
id = "belt"
|
||||
cost = 13
|
||||
item_path = /obj/item/weapon/storage/belt/military/gang
|
||||
item_path = /obj/item/storage/belt/military/gang
|
||||
|
||||
/obj/item/weapon/storage/belt/military/gang
|
||||
/obj/item/storage/belt/military/gang
|
||||
name = "badass belt"
|
||||
icon_state = "gangbelt"
|
||||
item_state = "gang"
|
||||
desc = "The belt buckle simply reads 'BAMF'."
|
||||
storage_slots = 1
|
||||
|
||||
/obj/item/weapon/storage/belt/military/gang/gang_contraband_value()
|
||||
/obj/item/storage/belt/military/gang/gang_contraband_value()
|
||||
return 4
|
||||
|
||||
///////////////////
|
||||
@@ -202,19 +202,19 @@
|
||||
name = "Shuriken"
|
||||
id = "shuriken"
|
||||
cost = 3
|
||||
item_path = /obj/item/weapon/throwing_star
|
||||
item_path = /obj/item/throwing_star
|
||||
|
||||
/datum/gang_item/weapon/switchblade
|
||||
name = "Switchblade"
|
||||
id = "switchblade"
|
||||
cost = 5
|
||||
item_path = /obj/item/weapon/switchblade
|
||||
item_path = /obj/item/switchblade
|
||||
|
||||
/datum/gang_item/weapon/surplus
|
||||
name = "Surplus Rifle"
|
||||
id = "surplus"
|
||||
cost = 8
|
||||
item_path = /obj/item/weapon/gun/ballistic/automatic/surplus
|
||||
item_path = /obj/item/gun/ballistic/automatic/surplus
|
||||
|
||||
/datum/gang_item/weapon/ammo/surplus_ammo
|
||||
name = "Surplus Rifle Ammo"
|
||||
@@ -226,19 +226,19 @@
|
||||
name = "Sawn-Off Improvised Shotgun"
|
||||
id = "sawn"
|
||||
cost = 6
|
||||
item_path = /obj/item/weapon/gun/ballistic/revolver/doublebarrel/improvised/sawn
|
||||
item_path = /obj/item/gun/ballistic/revolver/doublebarrel/improvised/sawn
|
||||
|
||||
/datum/gang_item/weapon/ammo/improvised_ammo
|
||||
name = "Box of Buckshot"
|
||||
id = "buckshot"
|
||||
cost = 5
|
||||
item_path = /obj/item/weapon/storage/box/lethalshot
|
||||
item_path = /obj/item/storage/box/lethalshot
|
||||
|
||||
/datum/gang_item/weapon/pistol
|
||||
name = "10mm Pistol"
|
||||
id = "pistol"
|
||||
cost = 30
|
||||
item_path = /obj/item/weapon/gun/ballistic/automatic/pistol
|
||||
item_path = /obj/item/gun/ballistic/automatic/pistol
|
||||
|
||||
/datum/gang_item/weapon/ammo/pistol_ammo
|
||||
name = "10mm Ammo"
|
||||
@@ -250,7 +250,7 @@
|
||||
name = "Black Market .50cal Sniper Rifle"
|
||||
id = "sniper"
|
||||
cost = 40
|
||||
item_path = /obj/item/weapon/gun/ballistic/automatic/sniper_rifle/gang
|
||||
item_path = /obj/item/gun/ballistic/automatic/sniper_rifle/gang
|
||||
|
||||
/datum/gang_item/weapon/ammo/sniper_ammo
|
||||
name = "Smuggled .50cal Sniper Rounds"
|
||||
@@ -277,7 +277,7 @@
|
||||
name = "Uzi SMG"
|
||||
id = "uzi"
|
||||
cost = 60
|
||||
item_path = /obj/item/weapon/gun/ballistic/automatic/mini_uzi
|
||||
item_path = /obj/item/gun/ballistic/automatic/mini_uzi
|
||||
|
||||
|
||||
/datum/gang_item/weapon/ammo/uzi_ammo
|
||||
@@ -304,38 +304,38 @@
|
||||
name = "Sharpener"
|
||||
id = "whetstone"
|
||||
cost = 3
|
||||
item_path = /obj/item/weapon/sharpener
|
||||
item_path = /obj/item/sharpener
|
||||
|
||||
|
||||
/datum/gang_item/equipment/emp
|
||||
name = "EMP Grenade"
|
||||
id = "EMP"
|
||||
cost = 5
|
||||
item_path = /obj/item/weapon/grenade/empgrenade
|
||||
item_path = /obj/item/grenade/empgrenade
|
||||
|
||||
/datum/gang_item/equipment/c4
|
||||
name = "C4 Explosive"
|
||||
id = "c4"
|
||||
cost = 7
|
||||
item_path = /obj/item/weapon/grenade/plastic/c4
|
||||
item_path = /obj/item/grenade/plastic/c4
|
||||
|
||||
/datum/gang_item/equipment/frag
|
||||
name = "Fragmentation Grenade"
|
||||
id = "frag nade"
|
||||
cost = 18
|
||||
item_path = /obj/item/weapon/grenade/syndieminibomb/concussion/frag
|
||||
item_path = /obj/item/grenade/syndieminibomb/concussion/frag
|
||||
|
||||
/datum/gang_item/equipment/stimpack
|
||||
name = "Black Market Stimulants"
|
||||
id = "stimpack"
|
||||
cost = 12
|
||||
item_path = /obj/item/weapon/reagent_containers/syringe/stimulants
|
||||
item_path = /obj/item/reagent_containers/syringe/stimulants
|
||||
|
||||
/datum/gang_item/equipment/implant_breaker
|
||||
name = "Implant Breaker"
|
||||
id = "implant_breaker"
|
||||
cost = 10
|
||||
item_path = /obj/item/weapon/implanter/gang
|
||||
item_path = /obj/item/implanter/gang
|
||||
spawn_msg = "<span class='notice'>The <b>implant breaker</b> is a single-use device that destroys all implants within the target before trying to recruit them to your gang. Also works on enemy gangsters.</span>"
|
||||
|
||||
/datum/gang_item/equipment/implant_breaker/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
|
||||
@@ -361,7 +361,7 @@
|
||||
name = "Recruitment Pen"
|
||||
id = "pen"
|
||||
cost = 50
|
||||
item_path = /obj/item/weapon/pen/gang
|
||||
item_path = /obj/item/pen/gang
|
||||
spawn_msg = "<span class='notice'>More <b>recruitment pens</b> will allow you to recruit gangsters faster. Only gang leaders can recruit with pens.</span>"
|
||||
|
||||
/datum/gang_item/equipment/pen/purchase(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
|
||||
@@ -431,7 +431,7 @@
|
||||
/datum/gang_item/equipment/dominator/purchase(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
|
||||
var/area/usrarea = get_area(user.loc)
|
||||
var/usrturf = get_turf(user.loc)
|
||||
if(initial(usrarea.name) == "Space" || isspaceturf(usrturf) || usr.z != ZLEVEL_STATION)
|
||||
if(initial(usrarea.name) == "Space" || isspaceturf(usrturf) || usr.z != ZLEVEL_STATION || !usrarea.valid_territory)
|
||||
to_chat(user, "<span class='warning'>You can only use this on the station!</span>")
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
* Gang Boss Pens
|
||||
*/
|
||||
/obj/item/weapon/pen/gang
|
||||
/obj/item/pen/gang
|
||||
origin_tech = "materials=2;syndicate=3"
|
||||
var/cooldown
|
||||
var/last_used = 0
|
||||
var/charges = 1
|
||||
|
||||
/obj/item/weapon/pen/gang/New()
|
||||
/obj/item/pen/gang/New()
|
||||
..()
|
||||
last_used = world.time
|
||||
|
||||
/obj/item/weapon/pen/gang/attack(mob/living/M, mob/user, stealth = TRUE)
|
||||
/obj/item/pen/gang/attack(mob/living/M, mob/user, stealth = TRUE)
|
||||
if(!istype(M))
|
||||
return
|
||||
if(ishuman(M) && ishuman(user) && M.stat != DEAD)
|
||||
@@ -44,7 +44,7 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/pen/gang/proc/cooldown(datum/gang/gang)
|
||||
/obj/item/pen/gang/proc/cooldown(datum/gang/gang)
|
||||
set waitfor = FALSE
|
||||
var/cooldown_time = 600+(600*gang.bosses.len) // 1recruiter=2mins, 2recruiters=3mins, 3recruiters=4mins
|
||||
|
||||
|
||||
@@ -310,7 +310,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
owner_AI.doomsday_device = DOOM
|
||||
owner_AI.doomsday_device.start()
|
||||
for(var/pinpointer in GLOB.pinpointer_list)
|
||||
var/obj/item/weapon/pinpointer/P = pinpointer
|
||||
var/obj/item/pinpointer/P = pinpointer
|
||||
P.switch_mode_to(TRACK_MALF_AI) //Pinpointers start tracking the AI wherever it goes
|
||||
qdel(src)
|
||||
|
||||
@@ -462,8 +462,8 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
|
||||
/datum/action/innate/ai/destroy_rcds/Activate()
|
||||
for(var/I in GLOB.rcd_list)
|
||||
if(!istype(I, /obj/item/weapon/construction/rcd/borg)) //Ensures that cyborg RCDs are spared.
|
||||
var/obj/item/weapon/construction/rcd/RCD = I
|
||||
if(!istype(I, /obj/item/construction/rcd/borg)) //Ensures that cyborg RCDs are spared.
|
||||
var/obj/item/construction/rcd/RCD = I
|
||||
RCD.detonate_pulse()
|
||||
to_chat(owner, "<span class='danger'>RCD detonation pulse emitted.</span>")
|
||||
owner.playsound_local(owner, 'sound/machines/twobeep.ogg', 50, 0)
|
||||
|
||||
@@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
var/threat = 0 // used for determining which meteors are most interesting
|
||||
var/lifetime = DEFAULT_METEOR_LIFETIME
|
||||
|
||||
var/list/meteordrop = list(/obj/item/weapon/ore/iron)
|
||||
var/list/meteordrop = list(/obj/item/ore/iron)
|
||||
var/dropamt = 2
|
||||
|
||||
/obj/effect/meteor/Move()
|
||||
@@ -170,8 +170,8 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
|
||||
#undef METEOR_MEDAL
|
||||
|
||||
/obj/effect/meteor/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/pickaxe))
|
||||
/obj/effect/meteor/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/pickaxe))
|
||||
make_debris()
|
||||
qdel(src)
|
||||
else
|
||||
@@ -209,7 +209,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
hits = 1
|
||||
hitpwr = 3
|
||||
meteorsound = 'sound/weapons/gunshot_smg.ogg'
|
||||
meteordrop = list(/obj/item/weapon/ore/glass)
|
||||
meteordrop = list(/obj/item/ore/glass)
|
||||
threat = 1
|
||||
|
||||
//Medium-sized
|
||||
@@ -242,7 +242,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
hits = 5
|
||||
heavy = 1
|
||||
meteorsound = 'sound/effects/bamf.ogg'
|
||||
meteordrop = list(/obj/item/weapon/ore/plasma)
|
||||
meteordrop = list(/obj/item/ore/plasma)
|
||||
threat = 20
|
||||
|
||||
/obj/effect/meteor/flaming/meteor_effect()
|
||||
@@ -254,7 +254,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
name = "glowing meteor"
|
||||
icon_state = "glowing"
|
||||
heavy = 1
|
||||
meteordrop = list(/obj/item/weapon/ore/uranium)
|
||||
meteordrop = list(/obj/item/ore/uranium)
|
||||
threat = 15
|
||||
|
||||
|
||||
@@ -272,13 +272,13 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
hits = 2
|
||||
heavy = 1
|
||||
meteorsound = 'sound/effects/blobattack.ogg'
|
||||
meteordrop = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human, /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant, /obj/item/organ/heart, /obj/item/organ/lungs, /obj/item/organ/tongue, /obj/item/organ/appendix/)
|
||||
meteordrop = list(/obj/item/reagent_containers/food/snacks/meat/slab/human, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant, /obj/item/organ/heart, /obj/item/organ/lungs, /obj/item/organ/tongue, /obj/item/organ/appendix/)
|
||||
var/meteorgibs = /obj/effect/gibspawner/generic
|
||||
threat = 2
|
||||
|
||||
/obj/effect/meteor/meaty/New()
|
||||
for(var/path in meteordrop)
|
||||
if(path == /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant)
|
||||
if(path == /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant)
|
||||
meteordrop -= path
|
||||
meteordrop += pick(subtypesof(path))
|
||||
|
||||
@@ -304,7 +304,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
//Meaty Ore Xeno edition
|
||||
/obj/effect/meteor/meaty/xeno
|
||||
color = "#5EFF00"
|
||||
meteordrop = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno, /obj/item/organ/tongue/alien)
|
||||
meteordrop = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno, /obj/item/organ/tongue/alien)
|
||||
meteorgibs = /obj/effect/gibspawner/xeno
|
||||
|
||||
/obj/effect/meteor/meaty/xeno/New()
|
||||
@@ -324,7 +324,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
hitpwr = 1
|
||||
heavy = 1
|
||||
meteorsound = 'sound/effects/bamf.ogg'
|
||||
meteordrop = list(/obj/item/weapon/ore/plasma)
|
||||
meteordrop = list(/obj/item/ore/plasma)
|
||||
threat = 50
|
||||
|
||||
/obj/effect/meteor/tunguska/Move()
|
||||
@@ -355,7 +355,7 @@ GLOBAL_LIST_INIT(meteorsSPOOKY, list(/obj/effect/meteor/pumpkin))
|
||||
hits = 10
|
||||
heavy = 1
|
||||
dropamt = 1
|
||||
meteordrop = list(/obj/item/clothing/head/hardhat/pumpkinhead, /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin)
|
||||
meteordrop = list(/obj/item/clothing/head/hardhat/pumpkinhead, /obj/item/reagent_containers/food/snacks/grown/pumpkin)
|
||||
threat = 100
|
||||
|
||||
/obj/effect/meteor/pumpkin/New()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user