This commit is contained in:
Putnam3145
2022-05-17 13:22:40 -07:00
1311 changed files with 12771 additions and 10321 deletions
+1 -1
View File
@@ -92,7 +92,7 @@
update_icon()
return TRUE
/obj/machinery/ntnet_relay/Initialize()
/obj/machinery/ntnet_relay/Initialize(mapload)
uid = gl_uid++
component_parts = list()
+4 -4
View File
@@ -16,7 +16,7 @@
var/allow_creating_vr_mobs = TRUE //So you can have vr_sleepers that always spawn you as a specific person or 1 life/chance vr games
var/only_current_user_can_interact = FALSE
/obj/machinery/vr_sleeper/Initialize()
/obj/machinery/vr_sleeper/Initialize(mapload)
. = ..()
sparks = new /datum/effect_system/spark_spread()
sparks.set_up(2,0)
@@ -151,7 +151,7 @@
if(SOFT_CRIT)
status = "Barely Conscious"
data["vr_avatar"] += list("status" = status, "health" = vr_mob.health, "maxhealth" = vr_mob.maxHealth)
else
else
data["can_delete_avatar"] = FALSE
data["vr_avatar"] = FALSE
data["isliving"] = FALSE
@@ -207,7 +207,7 @@
var/vr_category = "default" //So we can have specific sleepers, eg: "Basketball VR Sleeper", etc.
var/vr_outfit = /datum/outfit/vr
/obj/effect/landmark/vr_spawn/Initialize()
/obj/effect/landmark/vr_spawn/Initialize(mapload)
. = ..()
LAZYADD(GLOB.vr_spawnpoints[vr_category], src)
@@ -235,7 +235,7 @@
var/area/vr_area
var/list/corpse_party
/obj/effect/vr_clean_master/Initialize()
/obj/effect/vr_clean_master/Initialize(mapload)
. = ..()
vr_area = get_base_area(src)
if(!vr_area)
+6 -1
View File
@@ -10,7 +10,6 @@ GLOBAL_PROTECT(admin_verbs_default)
/client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
/client/proc/secrets,
/client/proc/toggle_hear_radio, /*allows admins to hide all radio output*/
/client/proc/reload_admins,
@@ -124,6 +123,10 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
GLOBAL_PROTECT(admin_verbs_fun)
GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/podspawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character))
GLOBAL_PROTECT(admin_verbs_spawn)
GLOBAL_LIST_INIT(admin_verbs_sensitive, list(
/client/proc/investigate_show /*various admintools for investigation. Such as a singulo grief-log*/
))
GLOBAL_PROTECT(admin_verbs_sensitive)
GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer())
GLOBAL_PROTECT(admin_verbs_server)
/world/proc/AVerbsServer()
@@ -316,6 +319,8 @@ GLOBAL_PROTECT(admin_verbs_hideable)
add_verb(src, /client/proc/play_web_sound)
if(rights & R_SPAWN)
add_verb(src, GLOB.admin_verbs_spawn)
if(rights & R_SENSITIVE)
add_verb(src, GLOB.admin_verbs_sensitive)
/client/proc/remove_admin_verbs()
remove_verb(src, list(
+2 -2
View File
@@ -6,7 +6,7 @@
anchored = TRUE
var/popped = FALSE
/obj/effect/fun_balloon/Initialize()
/obj/effect/fun_balloon/Initialize(mapload)
. = ..()
SSobj.processing |= src
@@ -109,7 +109,7 @@
timeleft = 0
var/list/warp_points
/obj/effect/forcefield/arena_shuttle/Initialize()
/obj/effect/forcefield/arena_shuttle/Initialize(mapload)
. = ..()
for(var/obj/effect/landmark/shuttle_arena_safe/exit in GLOB.landmarks_list)
warp_points += exit
+2
View File
@@ -369,6 +369,8 @@
qdel(query_find_message_secret)
/proc/browse_messages(type, target_ckey, index, linkless = FALSE, filter, agegate = FALSE)
if((!usr || (target_ckey != usr.ckey)) && !check_rights(R_SENSITIVE))
return
if(!SSdbcore.Connect())
to_chat(usr, "<span class='danger'>Failed to establish database connection.</span>", confidential = TRUE)
return
+1 -1
View File
@@ -1577,7 +1577,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
duration = 9
pixel_z = 270
/obj/effect/temp_visual/fireball/Initialize()
/obj/effect/temp_visual/fireball/Initialize(mapload)
. = ..()
animate(src, pixel_z = 0, time = duration)
@@ -185,8 +185,8 @@ GLOBAL_LIST_EMPTY(antagonists)
// RegisterSignal(owner, COMSIG_MINDSHIELD_IMPLANTED, .proc/on_mindshield)
if(is_banned(owner.current) && replace_banned)
replace_banned_player()
// else if(owner.current.client?.holder && (CONFIG_GET(flag/auto_deadmin_antagonists) || owner.current.client.prefs?.toggles & DEADMIN_ANTAGONIST))
// owner.current.client.holder.auto_deadmin()
else if(owner.current.client?.holder && (CONFIG_GET(flag/auto_deadmin_antagonists) || owner.current.client.prefs?.deadmin & DEADMIN_ANTAGONIST))
owner.current.client.holder.auto_deadmin()
if(!soft_antag && owner.current.stat != DEAD)
owner.current.add_to_current_living_antags()
@@ -13,7 +13,7 @@
icon_state = "vest_stealth"
item_state = "armor"
blood_overlay_type = "armor"
armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70)
armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 15, BIO = 15, RAD = 15, FIRE = 70, ACID = 70)
actions_types = list(/datum/action/item_action/hands_free/activate)
allowed = list(
/obj/item/abductor,
@@ -27,10 +27,10 @@
var/stealth_active = 0
var/combat_cooldown = 10
var/datum/icon_snapshot/disguise
var/stealth_armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70)
var/combat_armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90)
var/stealth_armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 15, BIO = 15, RAD = 15, FIRE = 70, ACID = 70)
var/combat_armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 50, RAD = 50, FIRE = 90, ACID = 90)
/obj/item/clothing/suit/armor/abductor/vest/Initialize()
/obj/item/clothing/suit/armor/abductor/vest/Initialize(mapload)
. = ..()
stealth_armor = getArmor(arglist(stealth_armor))
combat_armor = getArmor(arglist(combat_armor))
@@ -19,7 +19,7 @@
var/mind_control_duration = 1800
var/active_mind_control = FALSE
/obj/item/organ/heart/gland/Initialize()
/obj/item/organ/heart/gland/Initialize(mapload)
. = ..()
icon_state = pick(list("health", "spider", "slime", "emp", "species", "egg", "vent", "mindshock", "viral"))
@@ -8,7 +8,7 @@
mind_control_duration = 1200
var/list/possible_reagents = list()
/obj/item/organ/heart/gland/chem/Initialize()
/obj/item/organ/heart/gland/chem/Initialize(mapload)
. = ..()
for(var/R in subtypesof(/datum/reagent/drug) + subtypesof(/datum/reagent/medicine) + typesof(/datum/reagent/toxin))
possible_reagents += R
@@ -12,7 +12,7 @@
//TODO : replace with presets or spectrum
return rgb(rand(0,255),rand(0,255),rand(0,255))
/obj/machinery/abductor/gland_dispenser/Initialize()
/obj/machinery/abductor/gland_dispenser/Initialize(mapload)
. = ..()
gland_types = subtypesof(/obj/item/organ/heart/gland)
gland_types = shuffle(gland_types)
@@ -49,7 +49,7 @@
icon_state = "teleport"
duration = 80
/obj/effect/temp_visual/teleport_abductor/Initialize()
/obj/effect/temp_visual/teleport_abductor/Initialize(mapload)
. = ..()
var/datum/effect_system/spark_spread/S = new
S.set_up(10,0,loc)
@@ -46,10 +46,10 @@
else
adjustFireLoss(5)
/mob/living/simple_animal/hostile/blob/CanPass(atom/movable/mover, turf/target)
/mob/living/simple_animal/hostile/blob/CanAllowThrough(atom/movable/mover, turf/target)
. = ..()
if(istype(mover, /obj/structure/blob))
return 1
return ..()
return TRUE
/mob/living/simple_animal/hostile/blob/Process_Spacemove(movement_dir = 0)
for(var/obj/structure/blob/B in range(1, src))
@@ -221,7 +221,7 @@
hud_type = /datum/hud/blobbernaut
var/independent = FALSE
/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize()
/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize(mapload)
. = ..()
if(independent)
pass_flags &= ~PASSBLOB
@@ -4,7 +4,7 @@
icon_state = "blank_blob"
desc = "A huge, pulsating yellow mass."
max_integrity = 400
armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 5, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 90) // Last stand
armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 5, BOMB = 70, BIO = 0, RAD = 0, FIRE = 75, ACID = 90) // Last stand
explosion_block = 6
point_return = -1
health_regen = 0 //we regen in Life() instead of when pulsed
@@ -47,7 +47,7 @@
/obj/structure/blob/core/ex_act(severity, target, origin)
var/damage = 50 - 10 * severity //remember, the core takes half brute damage, so this is 20/15/10 damage based on severity
take_damage(damage, BRUTE, "bomb", 0)
take_damage(damage, BRUTE, BOMB, 0)
/obj/structure/blob/core/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, overmind_reagent_trigger = 1)
. = ..()
@@ -6,7 +6,7 @@
max_integrity = 200
health_regen = 1
point_return = 25
armor = list("melee" = 10, "bullet" = 20, "laser" = 15, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
armor = list(MELEE = 10, BULLET = 20, LASER = 15, ENERGY = 10, BOMB = 40, BIO = 0, RAD = 0, FIRE = 90, ACID = 90)
var/list/spores = list()
var/mob/living/simple_animal/hostile/blob/blobbernaut/naut = null
var/max_spores = 3
@@ -4,12 +4,12 @@
icon_state = "blank_blob"
desc = "A large, pulsating yellow mass."
max_integrity = 200
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 65, "acid" = 90)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 65, ACID = 90)
health_regen = 3
point_return = 25
/obj/structure/blob/node/Initialize()
/obj/structure/blob/node/Initialize(mapload)
GLOB.blob_nodes += src
START_PROCESSING(SSobj, src)
. = ..()
@@ -5,7 +5,7 @@
desc = "A thin spire of slightly swaying tendrils."
max_integrity = 60
point_return = 15
armor = list("melee" = 10, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
armor = list(MELEE = 10, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 15, BIO = 0, RAD = 0, FIRE = 90, ACID = 90)
var/resource_delay = 0
/obj/structure/blob/resource/scannerreport()
@@ -9,7 +9,7 @@
explosion_block = 3
point_return = 4
atmosblock = TRUE
armor = list("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
armor = list(MELEE = 25, BULLET = 25, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, RAD = 0, FIRE = 90, ACID = 90)
var/weakened
/obj/structure/blob/shield/scannerreport()
@@ -28,7 +28,7 @@
desc = "[damaged_desc]"
atmosblock = FALSE
if(!weakened)
armor = armor.setRating("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
armor = armor.setRating(MELEE = 15, BULLET = 15, LASER = 5, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 90, ACID = 90)
weakened = TRUE
else
icon_state = initial(icon_state)
@@ -36,7 +36,7 @@
desc = initial(desc)
atmosblock = TRUE
if(weakened)
armor = armor.setRating("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
armor = armor.setRating(MELEE = 25, BULLET = 25, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, RAD = 0, FIRE = 90, ACID = 90)
weakened = FALSE
air_update_turf(1)
@@ -14,15 +14,15 @@
reagent = /datum/reagent/blob/blazing_oil
/datum/blobstrain/reagent/blazing_oil/extinguish_reaction(obj/structure/blob/B)
B.take_damage(1.5, BURN, "energy")
B.take_damage(1.5, BURN, ENERGY)
/datum/blobstrain/reagent/blazing_oil/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_type == BURN && damage_flag != "energy")
if(damage_type == BURN && damage_flag != ENERGY)
for(var/turf/open/T in range(1, B))
var/obj/structure/blob/C = locate() in T
if(!(C && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) && prob(80))
new /obj/effect/hotspot(T)
if(damage_flag == "fire")
if(damage_flag == FIRE)
return 0
return ..()
@@ -17,7 +17,7 @@
return damage * 1.25 //a laser will do 25 damage, which will kill any normal blob
/datum/blobstrain/reagent/electromagnetic_web/death_reaction(obj/structure/blob/B, damage_flag)
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser")
if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER)
empulse_using_range(B.loc, 5) //less than screen range, so you can stand out of range to avoid it
/datum/reagent/blob/electromagnetic_web
@@ -10,7 +10,7 @@
reagent = /datum/reagent/blob/energized_jelly
/datum/blobstrain/reagent/energized_jelly/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && B.obj_integrity - damage <= 0 && prob(10))
if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && B.obj_integrity - damage <= 0 && prob(10))
do_sparks(rand(2, 4), FALSE, B)
return ..()
@@ -19,7 +19,7 @@
/datum/blobstrain/reagent/energized_jelly/emp_reaction(obj/structure/blob/B, severity)
var/damage = rand(30, 50) - severity * rand(10, 15)
B.take_damage(damage, BURN, "energy")
B.take_damage(damage, BURN, ENERGY)
/datum/reagent/blob/energized_jelly
name = "Energized Jelly"
@@ -12,9 +12,9 @@
reagent = /datum/reagent/blob/explosive_lattice
/datum/blobstrain/reagent/explosive_lattice/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_flag == "bomb")
if(damage_flag == BOMB)
return 0
else if(damage_flag != "melee" && damage_flag != "bullet" && damage_flag != "laser")
else if(damage_flag != MELEE && damage_flag != BULLET && damage_flag != LASER)
return damage * 1.5
return ..()
@@ -13,12 +13,12 @@
reagent = /datum/reagent/blob/pressurized_slime
/datum/blobstrain/reagent/pressurized_slime/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") || damage_type != BURN)
if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) || damage_type != BURN)
extinguisharea(B, damage)
return ..()
/datum/blobstrain/reagent/pressurized_slime/death_reaction(obj/structure/blob/B, damage_flag)
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser")
if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER)
B.visible_message("<span class='boldwarning'>The blob ruptures, spraying the area with liquid!</span>")
extinguisharea(B, 50)
@@ -13,7 +13,7 @@
/datum/blobstrain/reagent/reactive_spines/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage && damage_type == BRUTE && B.obj_integrity - damage > 0) //is there any damage, is it brute, and will we be alive
if(damage_flag == "melee")
if(damage_flag == MELEE)
B.visible_message("<span class='boldwarning'>The blob retaliates, lashing out!</span>")
for(var/atom/A in range(1, B))
A.blob_act(B)
@@ -14,7 +14,7 @@
B.forceMove(T)
/datum/blobstrain/reagent/shifting_fragments/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage))
if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage))
var/list/blobstopick = list()
for(var/obj/structure/blob/OB in orange(1, B))
if((istype(OB, /obj/structure/blob/normal) || (istype(OB, /obj/structure/blob/shield) && prob(25))) && OB.overmind && OB.overmind.blobstrain.type == B.overmind.blobstrain.type)
@@ -11,7 +11,7 @@
message = "The blobs strike you"
/datum/blobstrain/reagent/synchronous_mesh/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") //the cause isn't fire or bombs, so split the damage
if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) //the cause isn't fire or bombs, so split the damage
var/damagesplit = 1 //maximum split is 9, reducing the damage each blob takes to 11% but doing that damage to 9 blobs
for(var/obj/structure/blob/C in orange(1, B))
if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) //if it doesn't have the same chemical or is a core or node, don't split damage to it
@@ -12,7 +12,7 @@
reagent = /datum/reagent/blob/zombifying_pods
/datum/blobstrain/reagent/zombifying_pods/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore.
if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore.
B.visible_message("<span class='warning'><b>A spore floats free of the blob!</b></span>")
var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc)
BS.overmind = B.overmind
@@ -4,14 +4,15 @@
icon = 'icons/mob/blob.dmi'
light_range = 2
desc = "A thick wall of writhing tendrils."
density = FALSE //this being false causes two bugs, being able to attack blob tiles behind other blobs and being unable to move on blob tiles in no gravity, but turning it to 1 causes the blob mobs to be unable to path through blobs, which is probably worse.
density = TRUE
opacity = 0
anchored = TRUE
layer = BELOW_MOB_LAYER
pass_flags_self = PASSBLOB
CanAtmosPass = ATMOS_PASS_PROC
var/point_return = 0 //How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed.
max_integrity = 30
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 70)
var/health_regen = 2 //how much health this blob regens when pulsed
var/pulse_timestamp = 0 //we got pulsed when?
var/heal_timestamp = 0 //we got healed when?
@@ -67,11 +68,6 @@
/obj/structure/blob/BlockThermalConductivity()
return atmosblock
/obj/structure/blob/CanPass(atom/movable/mover, turf/target)
if(istype(mover) && (mover.pass_flags & PASSBLOB))
return 1
return 0
/obj/structure/blob/CanAtmosPass(turf/T)
return !atmosblock
@@ -210,9 +206,9 @@
. = ..()
if(overmind)
if(overmind.blobstrain.tesla_reaction(src, power))
take_damage(power/400, BURN, "energy")
take_damage(power/400, BURN, ENERGY)
else
take_damage(power/400, BURN, "energy")
take_damage(power/400, BURN, ENERGY)
/obj/structure/blob/extinguish()
..()
@@ -12,7 +12,7 @@
var/nighttime_duration = 900 //15 Minutes
var/issued_XP = FALSE
/obj/effect/sunlight/Initialize()
/obj/effect/sunlight/Initialize(mapload)
. = ..()
/obj/effect/sunlight/proc/start_countdown()
@@ -54,7 +54,7 @@
resistance_flags = NONE
max_integrity = 100
integrity_failure = 0.5
armor = list("melee" = 50, "bullet" = 20, "laser" = 30, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 60)
armor = list(MELEE = 50, BULLET = 20, LASER = 30, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 70, ACID = 60)
/obj/structure/closet/crate/coffin/meatcoffin
name = "meat coffin"
@@ -69,7 +69,7 @@
material_drop = /obj/item/reagent_containers/food/snacks/meat/slab
material_drop_amount = 3
integrity_failure = 0.57
armor = list("melee" = 70, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100)
armor = list(MELEE = 70, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 70, BIO = 0, RAD = 0, FIRE = 70, ACID = 100)
/obj/structure/closet/crate/coffin/metalcoffin
name = "metal coffin"
@@ -85,7 +85,7 @@
material_drop_amount = 5
max_integrity = 200
integrity_failure = 0.25
armor = list("melee" = 40, "bullet" = 15, "laser" = 50, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 60)
armor = list(MELEE = 40, BULLET = 15, LASER = 50, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 70, ACID = 60)
//////////////////////////////////////////////
@@ -302,7 +302,7 @@
firing_effect_type = null
var/obj/item/gun/magic/tentacle/gun //the item that shot it
/obj/item/ammo_casing/magic/tentacle/Initialize()
/obj/item/ammo_casing/magic/tentacle/Initialize(mapload)
gun = loc
. = ..()
@@ -321,7 +321,7 @@
var/chain
var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it
/obj/item/projectile/tentacle/Initialize()
/obj/item/projectile/tentacle/Initialize(mapload)
source = loc
. = ..()
@@ -503,10 +503,10 @@
item_flags = DROPDEL
clothing_flags = STOPSPRESSUREDAMAGE //Not THICKMATERIAL 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/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.
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 90) //No armor at all.
mutantrace_variation = NONE
/obj/item/clothing/suit/space/changeling/Initialize()
/obj/item/clothing/suit/space/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
if(ismob(loc))
@@ -524,10 +524,10 @@
desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front."
item_flags = DROPDEL
clothing_flags = STOPSPRESSUREDAMAGE
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 90)
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
/obj/item/clothing/head/helmet/space/changeling/Initialize()
/obj/item/clothing/head/helmet/space/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -558,12 +558,12 @@
icon_state = "lingarmor"
item_flags = DROPDEL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
armor = list("melee" = 70, "bullet" = 60, "laser" = 30, "energy" = 40, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 50, "acid" = 90)
armor = list(MELEE = 70, BULLET = 60, LASER = 30, ENERGY = 40, BOMB = 10, BIO = 4, RAD = 0, FIRE = 50, ACID = 90)
flags_inv = HIDEJUMPSUIT
cold_protection = 0
heat_protection = 0
/obj/item/clothing/suit/armor/changeling/Initialize()
/obj/item/clothing/suit/armor/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
if(ismob(loc))
@@ -574,10 +574,10 @@
desc = "A tough, hard covering of black chitin with transparent chitin in front."
icon_state = "lingarmorhelmet"
item_flags = DROPDEL
armor = list("melee" = 70, "bullet" = 60, "laser" = 30, "energy" = 40, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 50, "acid" = 90)
armor = list(MELEE = 70, BULLET = 60, LASER = 30, ENERGY = 40, BOMB = 10, BIO = 4, RAD = 0, FIRE = 50, ACID = 90)
flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE
/obj/item/clothing/head/helmet/changeling/Initialize()
/obj/item/clothing/head/helmet/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -653,9 +653,9 @@
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 35, "bio" = 35, "rad" = 35, "fire" = 0, "acid" = 0)
armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 35, BIO = 35, RAD = 35, FIRE = 0, ACID = 0)
/obj/item/clothing/gloves/claws/Initialize()
/obj/item/clothing/gloves/claws/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -697,7 +697,7 @@
cold_protection = ARMS|HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 35, "bio" = 35, "rad" = 35, "fire" = 0, "acid" = 0)
armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 35, BIO = 35, RAD = 35, FIRE = 0, ACID = 0)
enhancement = 6 // first, do harm. all of it. all of the harm. just fuck em up.
wound_enhancement = 6
var/fast_enhancement = 6
@@ -727,7 +727,7 @@
to_chat(user, "<span class='notice'>[src] are now formed to allow for [fasthands ? "fast, precise strikes" : "crippling, damaging blows"].</span>")
addtimer(CALLBACK(src, .proc/use_buffs, user, TRUE), 0.1) // go fuckin get em
/obj/item/clothing/gloves/fingerless/pugilist/cling/Initialize()
/obj/item/clothing/gloves/fingerless/pugilist/cling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -12,7 +12,7 @@
/obj/item/clothing/glasses/changeling
name = "flesh"
/obj/item/clothing/glasses/changeling/Initialize()
/obj/item/clothing/glasses/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -27,7 +27,7 @@
/obj/item/clothing/under/changeling
name = "flesh"
/obj/item/clothing/under/changeling/Initialize()
/obj/item/clothing/under/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -43,7 +43,7 @@
name = "flesh"
allowed = list(/obj/item/changeling)
/obj/item/clothing/suit/changeling/Initialize()
/obj/item/clothing/suit/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -58,7 +58,7 @@
/obj/item/clothing/head/changeling
name = "flesh"
/obj/item/clothing/head/changeling/Initialize()
/obj/item/clothing/head/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -72,7 +72,7 @@
/obj/item/clothing/shoes/changeling
name = "flesh"
/obj/item/clothing/shoes/changeling/Initialize()
/obj/item/clothing/shoes/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -87,7 +87,7 @@
/obj/item/clothing/gloves/changeling
name = "flesh"
/obj/item/clothing/gloves/changeling/Initialize()
/obj/item/clothing/gloves/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -102,7 +102,7 @@
/obj/item/clothing/mask/changeling
name = "flesh"
/obj/item/clothing/mask/changeling/Initialize()
/obj/item/clothing/mask/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -119,7 +119,7 @@
slot_flags = ALL
allowed = list(/obj/item/changeling)
/obj/item/changeling/Initialize()
/obj/item/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -10,7 +10,7 @@
opacity = 0
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
/obj/effect/clockwork/Initialize()
/obj/effect/clockwork/Initialize(mapload)
. = ..()
GLOB.all_clockwork_objects += src
@@ -16,7 +16,7 @@
/obj/effect/clockwork/city_of_cogs_rift/singularity_pull()
return
/obj/effect/clockwork/city_of_cogs_rift/Initialize()
/obj/effect/clockwork/city_of_cogs_rift/Initialize(mapload)
. = ..()
visible_message("<span class='warning'>The air above [loc] shimmers and pops as a [name] forms there!</span>")
for(var/mob/M in GLOB.player_list)
@@ -32,7 +32,7 @@
smooth = SMOOTH_TRUE
layer = CLOSED_TURF_LAYER
/obj/effect/clockwork/overlay/wall/Initialize()
/obj/effect/clockwork/overlay/wall/Initialize(mapload)
. = ..()
queue_smooth_neighbors(src)
addtimer(CALLBACK(GLOBAL_PROC, .proc/queue_smooth, src), 1)
@@ -200,7 +200,7 @@
sigil_name = "Sigil of Transmission"
affects_servants = TRUE
/obj/effect/clockwork/sigil/transmission/Initialize()
/obj/effect/clockwork/sigil/transmission/Initialize(mapload)
. = ..()
update_icon()
@@ -229,7 +229,7 @@
else if(get_clockwork_power())
to_chat(L, "<span class='brass'>You feel a slight, static shock.</span>")
/obj/effect/clockwork/sigil/transmission/Initialize()
/obj/effect/clockwork/sigil/transmission/Initialize(mapload)
. = ..()
START_PROCESSING(SSobj, src)
@@ -8,7 +8,7 @@
density = TRUE
CanAtmosPass = ATMOS_PASS_NO
/obj/effect/clockwork/servant_blocker/Initialize()
/obj/effect/clockwork/servant_blocker/Initialize(mapload)
. = ..()
air_update_turf(TRUE)
@@ -17,7 +17,7 @@
var/is_stable = FALSE
var/busy = FALSE //If someone is already working on closing the gateway, only needed for stable gateways but in the parent to not need typecasting
/obj/effect/clockwork/spatial_gateway/Initialize()
/obj/effect/clockwork/spatial_gateway/Initialize(mapload)
. = ..()
addtimer(CALLBACK(src, .proc/check_setup), 1)
@@ -72,8 +72,11 @@ drain_amount: How much is drained by default; Influenced by a multiplier on most
cell.use(.)
spark_system.start()
/obj/mecha/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER)
if(!clockcult_user || (occupant && !is_servant_of_ratvar(occupant)))
/obj/vehicle/sealed/mecha/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER)
if(!clockcult_user || LAZYLEN(occupants))
for(var/mob/living/MB in occupants)
if(is_servant_of_ratvar(MB))
return
if(recursive)
var/succ = 0
for(var/atom/movable/target in contents) //Hiding in your mech won't save you.
@@ -8,7 +8,7 @@
icon_state = "rare_pepe"
w_class = WEIGHT_CLASS_SMALL
/obj/item/clockwork/Initialize()
/obj/item/clockwork/Initialize(mapload)
. = ..()
ratvar_act()
GLOB.all_clockwork_objects += src
@@ -172,7 +172,7 @@
var/randomspritemax = 2
var/sprite_shift = 9
/obj/item/clockwork/alloy_shards/Initialize()
/obj/item/clockwork/alloy_shards/Initialize(mapload)
. = ..()
if(randomsinglesprite)
replace_name_desc()
@@ -26,7 +26,7 @@
var/damage_per_combo = 2
var/maximum_combo_damage = 18 //33 damage on max stacks. Usually the target will already be dead by then but if they somehow aren't, better to have this capped
/obj/item/clockwork/brass_claw/Initialize()
/obj/item/clockwork/brass_claw/Initialize(mapload)
. = ..()
AddComponent(/datum/component/butchering, 60, 80)
@@ -7,7 +7,7 @@
item_state = "ratvarian_shield"
desc = "A resilient shield made out of brass.. It feels warm to the touch."
var/clockwork_desc = "A powerful shield of ratvarian making. It absorbs blocked attacks to charge devastating bashes."
armor = list("melee" = 80, "bullet" = 70, "laser" = -10, "energy" = -20, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
armor = list(MELEE = 80, BULLET = 70, LASER = -10, ENERGY = -20, BOMB = 60, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
shield_flags = SHIELD_FLAGS_DEFAULT | SHIELD_KINETIC_STRONG | SHIELD_ENERGY_WEAK
max_integrity = 300 //High integrity, extremely strong against melee / bullets, but still quite easy to destroy with lasers and energy
repair_material = /obj/item/stack/tile/brass
@@ -8,9 +8,9 @@
resistance_flags = FIRE_PROOF | ACID_PROOF
flags_inv = HIDEEARS|HIDEHAIR|HIDEFACE|HIDESNOUT
mutantrace_variation = STYLE_MUZZLE
armor = list("melee" = 50, "bullet" = 70, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "magic" = 60, "wound" = 65)
armor = list(MELEE = 50, BULLET = 70, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, MAGIC = 60, WOUND = 65)
/obj/item/clothing/head/helmet/clockwork/Initialize()
/obj/item/clothing/head/helmet/clockwork/Initialize(mapload)
. = ..()
ratvar_act()
GLOB.all_clockwork_objects += src
@@ -68,11 +68,11 @@
cold_protection = CHEST|GROIN|LEGS
heat_protection = CHEST|GROIN|LEGS
resistance_flags = FIRE_PROOF | ACID_PROOF
armor = list("melee" = 60, "bullet" = 70, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "magic" = 60, "wound" = 65)
armor = list(MELEE = 60, BULLET = 70, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, MAGIC = 60, WOUND = 65)
allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel, /obj/item/reagent_containers/food/drinks/bottle/holyoil)
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC
/obj/item/clothing/suit/armor/clockwork/Initialize()
/obj/item/clothing/suit/armor/clockwork/Initialize(mapload)
. = ..()
ratvar_act()
GLOB.all_clockwork_objects += src
@@ -135,9 +135,9 @@
siemens_coefficient = 0
permeability_coefficient = 0.05
resistance_flags = FIRE_PROOF | ACID_PROOF
armor = list("melee" = 80, "bullet" = 70, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "magic" = 70, "wound" = 85)
armor = list(MELEE = 80, BULLET = 70, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, MAGIC = 70, WOUND = 85)
/obj/item/clothing/gloves/clockwork/Initialize()
/obj/item/clothing/gloves/clockwork/Initialize(mapload)
. = ..()
ratvar_act()
GLOB.all_clockwork_objects += src
@@ -190,7 +190,7 @@
equip_delay_other = 30
resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/shoes/clockwork/Initialize()
/obj/item/clothing/shoes/clockwork/Initialize(mapload)
. = ..()
ratvar_act()
GLOB.all_clockwork_objects += src
@@ -106,7 +106,7 @@
if(!GLOB.ratvar_awakens)
SStgui.close_uis(src)
/obj/item/clockwork/slab/Initialize()
/obj/item/clockwork/slab/Initialize(mapload)
. = ..()
update_slab_info(src)
START_PROCESSING(SSobj, src)
@@ -11,7 +11,7 @@
var/creation_message = "<span class='brass'>The chassis shudders and hums to life!</span>"
var/construct_type //The construct this shell will create
/obj/item/clockwork/construct_chassis/Initialize()
/obj/item/clockwork/construct_chassis/Initialize(mapload)
. = ..()
var/area/A = get_area(src)
if(A && construct_type)
@@ -92,7 +92,7 @@
var/infinite_resources = FALSE //No.
var/static/obj/item/seasonal_hat //Share it with all other scarabs, since we're from the same cult!
/obj/item/clockwork/construct_chassis/cogscarab/Initialize()
/obj/item/clockwork/construct_chassis/cogscarab/Initialize(mapload)
. = ..()
if(GLOB.servants_active)
infinite_resources = FALSE //This check is relatively irrelevant until *someone* makes the infinite resources var default to true again, so, leaving it in.
@@ -12,7 +12,7 @@
item_flags = NOBLUDGEON
var/obj/machinery/power/apc/apc
/obj/item/clockwork/integration_cog/Initialize()
/obj/item/clockwork/integration_cog/Initialize(mapload)
. = ..()
transform *= 0.5 //little cog!
@@ -13,7 +13,7 @@
var/recharge_cooldown = 300 //divided by 10 if ratvar is alive
actions_types = list(/datum/action/item_action/clock/toggle_visor)
/obj/item/clothing/glasses/judicial_visor/Initialize()
/obj/item/clothing/glasses/judicial_visor/Initialize(mapload)
. = ..()
GLOB.all_clockwork_objects += src
blaster = new(src)
@@ -25,7 +25,7 @@
force_replace_ai_name = TRUE
overrides_aicore_laws = TRUE
/obj/item/mmi/posibrain/soul_vessel/Initialize()
/obj/item/mmi/posibrain/soul_vessel/Initialize(mapload)
. = ..()
radio.on = FALSE
laws = new /datum/ai_laws/ratvar()
@@ -12,7 +12,7 @@
visor_vars_to_toggle = NONE //we don't actually toggle anything we just set it
tint = 3 //this'll get reset, but it won't handle vision updates properly otherwise
/obj/item/clothing/glasses/wraith_spectacles/Initialize()
/obj/item/clothing/glasses/wraith_spectacles/Initialize(mapload)
. = ..()
GLOB.all_clockwork_objects += src
@@ -23,7 +23,7 @@
var/playstyle_string = "<span class='heavy_brass'>You are a bug, yell at whoever spawned you!</span>"
var/empower_string = "<span class='heavy_brass'>You have nothing to empower, yell at the coders!</span>" //Shown to the mob when the herald beacon activates
/mob/living/simple_animal/hostile/clockwork/Initialize()
/mob/living/simple_animal/hostile/clockwork/Initialize(mapload)
. = ..()
update_values()
@@ -34,7 +34,7 @@
Stay near your host to protect and heal them; being too far from your host will rapidly cause you massive damage. Recall to your host if you are too weak and believe you cannot continue \
fighting safely. As a final note, you should probably avoid harming any fellow servants of Ratvar.</span>"
/mob/living/simple_animal/hostile/clockwork/guardian/Initialize()
/mob/living/simple_animal/hostile/clockwork/guardian/Initialize(mapload)
. = ..()
true_name = pick(possible_true_names)
@@ -310,7 +310,7 @@ Judgement 80k power or nine converts
var/datum/progressbar/progbar
/datum/clockwork_scripture/ranged_ability/Destroy()
qdel(progbar)
progbar.end_progress()
return ..()
/datum/clockwork_scripture/ranged_ability/scripture_effects()
@@ -333,7 +333,7 @@ Judgement 80k power or nine converts
(allow_mobility || (can_recite() && T == get_turf(invoker))))
if(progbar)
if(slab.slab_ability.in_progress)
qdel(progbar)
progbar.end_progress()
else
progbar.update(end_time - world.time)
stoplag(1)
@@ -207,20 +207,20 @@
/datum/clockwork_scripture/create_object/summon_arbiter
descname = "Powerful Assault Mech"
name = "Summon Neovgre, the Anima Bulwark"
desc = "Calls forth the mighty Anima Bulwark, a mech with superior defensive and offensive capabilities. It will \
desc = "Calls forth the mighty Anima Bulwark, a two-person mech with superior defensive and offensive capabilities. It will \
steadily regenerate HP and triple its regeneration speed while standing \
on a clockwork tile. It will automatically draw power from nearby sigils of \
transmission should the need arise. Its Arbiter laser cannon can decimate foes \
from a range and is capable of smashing through any barrier presented to it. \
Be warned however, choosing to pilot Neovgre is a lifetime commitment, once you are \
in you cannot leave and when it is destroyed it will explode catastrophically, with you inside."
Be warned however, choosing to pilot or man Neovgre is a lifetime commitment, once you are \
in you cannot leave and when it is destroyed it will explode catastrophically, with everyone inside."
invocations = list("By the strength of the alloy...!!", "...call forth the Arbiter!!")
channel_time = 200 // This is a strong fucking weapon, 20 seconds channel time is getting off light I tell ya.
power_cost = 75000 //75 KW
usage_tip = "Neovgre is a powerful mech that will crush your enemies!"
invokers_required = 5
multiple_invokers_used = TRUE
object_path = /obj/mecha/combat/neovgre
object_path = /obj/vehicle/sealed/mecha/combat/neovgre
tier = SCRIPTURE_APPLICATION
primary_component = BELLIGERENT_EYE
sort_priority = 8
@@ -18,7 +18,7 @@
var/construction_value = 0 //How much value the structure contributes to the overall "power" of the structures on the station
var/immune_to_servant_attacks = FALSE //if we ignore attacks from servants of ratvar instead of taking damage
/obj/structure/destructible/clockwork/Initialize()
/obj/structure/destructible/clockwork/Initialize(mapload)
. = ..()
change_construction_value(construction_value)
GLOB.all_clockwork_objects += src
@@ -72,11 +72,6 @@
return FALSE
return ..()
/obj/structure/destructible/clockwork/mech_melee_attack(obj/mecha/M)
if(M.occupant && is_servant_of_ratvar(M.occupant) && immune_to_servant_attacks)
return FALSE
return ..()
/obj/structure/destructible/clockwork/proc/get_efficiency_mod()
if(GLOB.ratvar_awakens)
return 2
@@ -134,7 +129,7 @@
density = FALSE
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF | FREEZE_PROOF
/obj/structure/destructible/clockwork/massive/Initialize()
/obj/structure/destructible/clockwork/massive/Initialize(mapload)
. = ..()
GLOB.poi_list += src
@@ -5,7 +5,7 @@
clockwork_desc = "A trap that shouldn't exist, and you should report this as a bug."
var/list/wired_to
/obj/structure/destructible/clockwork/trap/Initialize()
/obj/structure/destructible/clockwork/trap/Initialize(mapload)
. = ..()
wired_to = list()
@@ -80,7 +80,7 @@
break_message = "<span class='warning'>The trigger breaks apart!</span>"
density = FALSE
/obj/structure/destructible/clockwork/trap/trigger/Initialize()
/obj/structure/destructible/clockwork/trap/trigger/Initialize(mapload)
. = ..()
for(var/obj/structure/destructible/clockwork/trap/T in get_turf(src))
if(!istype(T, /obj/structure/destructible/clockwork/trap/trigger))
@@ -33,7 +33,7 @@
var/recalls_remaining = 1
var/recalling
/obj/structure/destructible/clockwork/massive/celestial_gateway/Initialize()
/obj/structure/destructible/clockwork/massive/celestial_gateway/Initialize(mapload)
. = ..()
INVOKE_ASYNC(src, .proc/spawn_animation)
glow = new(get_turf(src))
@@ -199,7 +199,7 @@
/obj/structure/destructible/clockwork/massive/celestial_gateway/ex_act(severity, target, origin)
var/damage = max((obj_integrity * 0.7) / severity, 100) //requires multiple bombs to take down
take_damage(damage, BRUTE, "bomb", 0)
take_damage(damage, BRUTE, BOMB, 0)
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/get_arrival_time(var/deciseconds = TRUE)
if(seconds_until_activation)
@@ -301,7 +301,7 @@
for(var/obj/O in orange(1, src))
if(!O.pulledby && !iseffect(O) && O.density)
if(!step_away(O, src, 2) || get_dist(O, src) < 2)
O.take_damage(50, BURN, "bomb")
O.take_damage(50, BURN, BOMB)
O.update_icon()
conversion_pulse() //Converts the nearby area into clockcult-style
@@ -16,7 +16,7 @@
var/hierophant_cost = MIN_CLOCKCULT_POWER //how much it costs to broadcast with large text
var/gateway_cost = 2000 //how much it costs to open a gateway
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/Initialize()
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/Initialize(mapload)
. = ..()
toggle(1)
@@ -17,7 +17,7 @@
var/votes_needed = 0 //How many votes are needed to activate the beacon
var/available = FALSE //If the beacon can be used
/obj/structure/destructible/clockwork/heralds_beacon/Initialize()
/obj/structure/destructible/clockwork/heralds_beacon/Initialize(mapload)
. = ..()
voters = list()
START_PROCESSING(SSprocessing, src)
@@ -16,7 +16,7 @@
var/atom/movable/target
var/list/idle_messages = list(" sulkily glares around.", " lazily drifts from side to side.", " looks around for something to burn.", " slowly turns in circles.")
/obj/structure/destructible/clockwork/ocular_warden/Initialize()
/obj/structure/destructible/clockwork/ocular_warden/Initialize(mapload)
. = ..()
START_PROCESSING(SSfastprocess, src)
@@ -76,8 +76,8 @@
L.adjust_fire_stacks(damage_per_tick)
L.IgniteMob()
else if(ismecha(target))
var/obj/mecha/M = target
M.take_damage(damage_per_tick * get_efficiency_mod(), BURN, "melee", 1, get_dir(src, M))
var/obj/vehicle/sealed/mecha/M = target
M.take_damage(damage_per_tick * get_efficiency_mod(), BURN, MELEE, 1, get_dir(src, M))
new /obj/effect/temp_visual/ratvar/ocular_warden(get_turf(target))
@@ -91,8 +91,8 @@
var/mob/living/L = target
to_chat(L, "<span class='neovgre'>\"I SEE YOU!\"</span>\n<span class='userdanger'>[src]'s gaze [GLOB.ratvar_awakens ? "melts you alive" : "burns you"]!</span>")
else if(ismecha(target))
var/obj/mecha/M = target
to_chat(M.occupant, "<span class='neovgre'>\"I SEE YOU!\"</span>" )
var/obj/vehicle/sealed/mecha/M = target
to_chat(M.occupants, "<span class='neovgre'>\"I SEE YOU!\"</span>" )
else if(prob(0.5)) //Extremely low chance because of how fast the subsystem it uses processes
if(prob(50))
visible_message("<span class='notice'>[src][pick(idle_messages)]</span>")
@@ -131,8 +131,11 @@
. += L
var/list/viewcache = list()
for(var/N in GLOB.mechas_list)
var/obj/mecha/M = N
if(get_dist(M, src) <= sight_range && M.occupant && !is_servant_of_ratvar(M.occupant))
var/obj/vehicle/sealed/mecha/M = N
if(get_dist(M, src) <= sight_range && LAZYLEN(M.occupants))
for(var/mob/living/MB in M.occupants)
if(is_servant_of_ratvar(MB))
return
if(!length(viewcache))
for (var/obj/Z in view(sight_range, src))
viewcache += Z
@@ -17,7 +17,7 @@
var/convert_range = 10
obj_flags = CAN_BE_HIT | DANGEROUS_POSSESSION
/obj/structure/destructible/clockwork/massive/ratvar/Initialize()
/obj/structure/destructible/clockwork/massive/ratvar/Initialize(mapload)
. = ..()
GLOB.ratvar_awakens++
for(var/obj/O in GLOB.all_clockwork_objects)
@@ -16,7 +16,7 @@
var/ini_dir = null
/obj/structure/destructible/clockwork/reflector/Initialize()
/obj/structure/destructible/clockwork/reflector/Initialize(mapload)
. = ..()
allowed_projectile_typecache = typecacheof(allowed_projectile_typecache)
@@ -16,7 +16,7 @@
light_color = "#DAAA18"
var/star_light_star_bright = FALSE //If this stargazer can see starlight
/obj/structure/destructible/clockwork/stargazer/Initialize()
/obj/structure/destructible/clockwork/stargazer/Initialize(mapload)
. = ..()
START_PROCESSING(SSprocessing, src)
@@ -14,7 +14,7 @@
debris = list()
var/timerid
/obj/structure/destructible/clockwork/taunting_trail/Initialize()
/obj/structure/destructible/clockwork/taunting_trail/Initialize(mapload)
. = ..()
timerid = QDEL_IN(src, 15)
var/obj/structure/destructible/clockwork/taunting_trail/Tt = locate(/obj/structure/destructible/clockwork/taunting_trail) in loc
@@ -9,12 +9,14 @@
/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech/Crossed(atom/movable/AM)
. = ..()
if(!istype(AM,/obj/mecha/))
if(!istype(AM,/obj/vehicle/sealed/mecha/))
return
var/obj/mecha/M = AM
if(M.occupant && is_servant_of_ratvar(M.occupant))
return
var/obj/vehicle/sealed/mecha/M = AM
if(LAZYLEN(M.occupants))
for(var/mob/living/MB in M.occupants)
if(is_servant_of_ratvar(MB))
return
audible_message("<i>*click*</i>")
playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE)
activate()
@@ -13,7 +13,7 @@
var/wiggle_wiggle
var/mutable_appearance/impale_overlay //This is applied to any mob impaled so that they visibly have the skewer coming through their chest
/obj/structure/destructible/clockwork/trap/brass_skewer/Initialize()
/obj/structure/destructible/clockwork/trap/brass_skewer/Initialize(mapload)
. = ..()
START_PROCESSING(SSfastprocess, src)
@@ -68,9 +68,9 @@
mouse_opacity = MOUSE_OPACITY_OPAQUE //So players can interact with the tile it's on to pull them off
buckle_mob(squirrel, TRUE)
else
var/obj/mecha/M = locate() in get_turf(src)
var/obj/vehicle/sealed/mecha/M = locate() in get_turf(src)
if(M)
M.take_damage(50,BRUTE,"melee")
M.take_damage(50,BRUTE,MELEE)
M.visible_message("<span class='danger'>A massive brass spike erupts from the ground, penetrating \the [M] and shattering the trap into pieces!</span>")
addtimer(CALLBACK(src, .proc/take_damage, max_integrity), 1)
else
@@ -15,7 +15,7 @@
/obj/structure/destructible/clockwork/wall_gear/displaced
anchored = FALSE
/obj/structure/destructible/clockwork/wall_gear/Initialize()
/obj/structure/destructible/clockwork/wall_gear/Initialize(mapload)
. = ..()
new /obj/effect/temp_visual/ratvar/gear(get_turf(src))
+18 -18
View File
@@ -39,7 +39,7 @@
armour_penetration = 35
actions_types = list(/datum/action/item_action/cult_dagger)
/obj/item/melee/cultblade/dagger/Initialize()
/obj/item/melee/cultblade/dagger/Initialize(mapload)
. = ..()
var/image/I = image(icon = 'icons/effects/blood.dmi' , icon_state = null, loc = src)
I.override = TRUE
@@ -62,7 +62,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended")
/obj/item/melee/cultblade/Initialize()
/obj/item/melee/cultblade/Initialize(mapload)
. = ..()
AddComponent(/datum/component/butchering, 40, 100)
AddElement(/datum/element/sword_point)
@@ -87,7 +87,7 @@
item_flags = NEEDS_PERMIT | DROPDEL
flags_1 = NONE
/obj/item/melee/cultblade/ghost/Initialize()
/obj/item/melee/cultblade/ghost/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
@@ -131,7 +131,7 @@
var/spin_cooldown = 250
var/dash_toggled = TRUE
/obj/item/cult_bastard/Initialize()
/obj/item/cult_bastard/Initialize(mapload)
. = ..()
set_light(4)
jaunt = new(src)
@@ -297,7 +297,7 @@
desc = "A torn, dust-caked hood. Strange letters line the inside."
flags_inv = HIDEFACE|HIDEHAIR|HIDEEARS
flags_cover = HEADCOVERSEYES
armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 20, "bomb" = 65, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10)
armor = list(MELEE = 40, BULLET = 30, LASER = 40,ENERGY = 20, BOMB = 65, BIO = 10, RAD = 0, FIRE = 10, ACID = 10)
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
heat_protection = HEAD
@@ -310,7 +310,7 @@
item_state = "cultrobes"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 20, "bomb" = 65, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10)
armor = list(MELEE = 40, BULLET = 30, LASER = 40,ENERGY = 20, BOMB = 65, BIO = 10, RAD = 0, FIRE = 10, ACID = 10)
flags_inv = HIDEJUMPSUIT
cold_protection = CHEST|GROIN|LEGS|ARMS
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
@@ -326,7 +326,7 @@
/obj/item/clothing/head/culthood/alt/ghost
item_flags = DROPDEL
/obj/item/clothing/head/culthood/alt/ghost/Initialize()
/obj/item/clothing/head/culthood/alt/ghost/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
@@ -340,7 +340,7 @@
/obj/item/clothing/suit/cultrobes/alt/ghost
item_flags = DROPDEL
/obj/item/clothing/suit/cultrobes/alt/ghost/Initialize()
/obj/item/clothing/suit/cultrobes/alt/ghost/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
@@ -350,7 +350,7 @@
item_state = "magus"
desc = "A helm worn by the followers of Nar'Sie."
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEARS|HIDEEYES|HIDESNOUT
armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 10)
armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 10, ACID = 10)
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
mutantrace_variation = STYLE_MUZZLE
@@ -361,7 +361,7 @@
item_state = "magusred"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
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)
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
/obj/item/clothing/head/helmet/space/hardsuit/cult
@@ -369,7 +369,7 @@
desc = "A heavily-armored helmet worn by warriors of the Nar'Sien cult. It can withstand hard vacuum."
icon_state = "cult_helmet"
item_state = "cult_helmet"
armor = list("melee" = 60, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 40, "acid" = 75)
armor = list(MELEE = 60, BULLET = 50, LASER = 30,ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 40, ACID = 75)
brightness_on = 0
actions_types = list()
@@ -385,7 +385,7 @@
desc = "A heavily-armored exosuit worn by warriors of the Nar'Sien cult. It can withstand hard vacuum."
w_class = WEIGHT_CLASS_BULKY
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)
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/clothing/suit/space/hardsuit/cult/ComponentInitialize()
@@ -413,7 +413,7 @@
icon_state = "cult_armor"
item_state = "cult_armor"
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)
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/tome, /obj/item/melee/cultblade)
var/current_charges = 3
@@ -423,7 +423,7 @@
name = "empowered cultist armor"
desc = "Empowered garb which creates a powerful shield around the user."
icon_state = "cult_hoodalt"
armor = list("melee" = 50, "bullet" = 40, "laser" = 50,"energy" = 30, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 50, "acid" = 50)
armor = list(MELEE = 50, BULLET = 40, LASER = 50,ENERGY = 30, BOMB = 50, BIO = 30, RAD = 30, FIRE = 50, ACID = 50)
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
@@ -473,7 +473,7 @@
flags_inv = HIDEJUMPSUIT
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)
armor = list(MELEE = -50, BULLET = -50, LASER = -50,ENERGY = -50, BOMB = -50, BIO = -50, RAD = -50, FIRE = 0, ACID = 0)
slowdown = -1
hoodtype = /obj/item/clothing/head/hooded/berserkerhood
@@ -483,7 +483,7 @@
icon_state = "culthood"
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
armor = list("melee" = -50, "bullet" = -50, "laser" = -50, "energy" = -50, "bomb" = -50, "bio" = -50, "rad" = -50, "fire" = 0, "acid" = 0)
armor = list(MELEE = -50, BULLET = -50, LASER = -50, ENERGY = -50, BOMB = -50, BIO = -50, RAD = -50, FIRE = 0, ACID = 0)
/obj/item/clothing/suit/hooded/cultrobes/berserker/equipped(mob/living/user, slot)
..()
@@ -716,7 +716,7 @@
var/wielded = FALSE // track wielded status on item
/obj/item/cult_spear/Initialize()
/obj/item/cult_spear/Initialize(mapload)
. = ..()
RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
@@ -874,7 +874,7 @@
var/firing = FALSE
var/angle
/obj/item/blood_beam/Initialize()
/obj/item/blood_beam/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
@@ -89,7 +89,7 @@
var/static/image/radial_shell = image(icon = 'icons/obj/wizard.dmi', icon_state = "construct-cult")
var/static/image/radial_unholy_water = image(icon = 'icons/obj/drinks.dmi', icon_state = "holyflask")
/obj/structure/destructible/cult/talisman/Initialize()
/obj/structure/destructible/cult/talisman/Initialize(mapload)
. = ..()
radial_unholy_water.color = "#333333"
+1 -1
View File
@@ -5,7 +5,7 @@ This file contains the cult dagger and rune list code
*/
/obj/item/melee/cultblade/dagger/Initialize()
/obj/item/melee/cultblade/dagger/Initialize(mapload)
. = ..()
if(!LAZYLEN(GLOB.rune_types))
GLOB.rune_types = list()
+1 -1
View File
@@ -832,7 +832,7 @@ structure_check() searches for nearby cultist structures required for the invoca
var/ghost_limit = 3
var/ghosts = 0
/obj/effect/rune/manifest/Initialize()
/obj/effect/rune/manifest/Initialize(mapload)
. = ..()
+1 -1
View File
@@ -44,7 +44,7 @@
Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \
of intentionally harming a fellow devil.</B>"
/mob/living/simple_animal/imp/Initialize()
/mob/living/simple_animal/imp/Initialize(mapload)
..()
boost = world.time + 30
@@ -25,7 +25,7 @@
var/mob/living/oldform
var/list/devil_overlays[DEVIL_TOTAL_LAYERS]
/mob/living/carbon/true_devil/Initialize()
/mob/living/carbon/true_devil/Initialize(mapload)
create_bodyparts() //initialize bodyparts
create_internal_organs()
grant_all_languages()
@@ -8,7 +8,7 @@
///Used mainly for summoning ritual to prevent spamming the rune to create millions of monsters.
var/is_in_use = FALSE
/obj/effect/eldritch/Initialize()
/obj/effect/eldritch/Initialize(mapload)
. = ..()
var/image/I = image(icon = 'icons/effects/eldritch.dmi', icon_state = null, loc = src)
I.override = TRUE
@@ -216,7 +216,7 @@
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
alpha = 0
/obj/effect/broken_illusion/Initialize()
/obj/effect/broken_illusion/Initialize(mapload)
. = ..()
addtimer(CALLBACK(src,.proc/show_presence),15 SECONDS)
addtimer(CALLBACK(src,.proc/remove_presence),195 SECONDS)
@@ -295,7 +295,7 @@
///Tracked image
var/image/img
/obj/effect/reality_smash/Initialize()
/obj/effect/reality_smash/Initialize(mapload)
. = ..()
GLOB.reality_smash_track.smashes += src
img = image(icon, src, image_state, OBJ_LAYER)
@@ -8,7 +8,7 @@
var/mob/living/carbon/human/target
var/datum/antagonist/heretic/sac_targetter //The heretic who used this to acquire the current target - gets cleared when target gets sacrificed.
/obj/item/living_heart/Initialize()
/obj/item/living_heart/Initialize(mapload)
. = ..()
GLOB.living_heart_cache.Add(src) //Add is better than +=.
@@ -177,7 +177,7 @@
allowed = list(/obj/item/melee/sickly_blade, /obj/item/forbidden_book, /obj/item/living_heart)
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch
// slightly better than normal cult robes
armor = list("melee" = 50, "bullet" = 50, "laser" = 50,"energy" = 50, "bomb" = 35, "bio" = 20, "rad" = 0, "fire" = 20, "acid" = 20)
armor = list(MELEE = 50, BULLET = 50, LASER = 50,ENERGY = 50, BOMB = 35, BIO = 20, RAD = 0, FIRE = 20, ACID = 20)
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
/obj/item/reagent_containers/glass/beaker/eldritch
@@ -193,7 +193,7 @@
flags_inv = NONE
flags_cover = NONE
desc = "Black like tar, doesn't reflect any light. Runic symbols line the outside, with each flash you lose comprehension of what you are seeing."
armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
obj_flags = NONE | EXAMINE_SKIP
/obj/item/clothing/suit/hooded/cultrobes/void
@@ -205,7 +205,7 @@
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/void
flags_inv = NONE
// slightly worse than normal cult robes
armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
pocket_storage_component_path = /datum/component/storage/concrete/pockets/void_cloak
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
@@ -310,7 +310,7 @@
. += "This item can carve 'Grasping carving' - when stepped on it causes heavy damage to the legs and stuns for 5 seconds."
. += "This item can carve 'Mad carving' - when stepped on it causes dizzyness, jiterryness, temporary blindness, confusion , stuttering and slurring."
/obj/item/melee/rune_knife/Initialize()
/obj/item/melee/rune_knife/Initialize(mapload)
. = ..()
linked_action = new(src)
@@ -402,11 +402,11 @@
new /obj/effect/hotspot(T)
T.hotspot_expose(700,50,1)
// deals damage to mechs
for(var/obj/mecha/M in T.contents)
for(var/obj/vehicle/sealed/mecha/M in T.contents)
if(M in hit_list)
continue
hit_list += M
M.take_damage(45, BURN, "melee", 1)
M.take_damage(45, BURN, MELEE, 1)
sleep(1.5)
/obj/effect/proc_holder/spell/targeted/shapeshift/eldritch
@@ -702,7 +702,7 @@
duration = 1 MINUTES
layer = LOW_SIGIL_LAYER
/obj/effect/temp_visual/glowing_rune/Initialize()
/obj/effect/temp_visual/glowing_rune/Initialize(mapload)
. = ..()
pixel_y = rand(-6,6)
pixel_x = rand(-6,6)
+1 -1
View File
@@ -9,7 +9,7 @@ GLOBAL_LIST_EMPTY(gangster_cell_phones)
var/gang_id = "Grove Street Families"
var/activated = FALSE
/obj/item/gangster_cellphone/Initialize()
/obj/item/gangster_cellphone/Initialize(mapload)
. = ..()
GLOB.gangster_cell_phones += src
flags_1 |= HEAR_1
+1 -1
View File
@@ -52,7 +52,7 @@
You can attack any item or dead creature to consume it - creatures will fully restore your health. \
Finally, you can restore yourself to your original form while morphed by shift-clicking yourself.</b>"
/mob/living/simple_animal/hostile/morph/Initialize()
/mob/living/simple_animal/hostile/morph/Initialize(mapload)
. = ..()
src.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
@@ -32,7 +32,7 @@
var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "Vale")
/obj/item/borg_chameleon/Initialize()
/obj/item/borg_chameleon/Initialize(mapload)
. = ..()
friendlyName = pick(GLOB.ai_names)
@@ -31,7 +31,7 @@
var/proper_bomb = TRUE //Please
var/obj/effect/countdown/nuclearbomb/countdown
/obj/machinery/nuclearbomb/Initialize()
/obj/machinery/nuclearbomb/Initialize(mapload)
. = ..()
countdown = new(src)
GLOB.nuke_list += src
@@ -507,7 +507,7 @@
proper_bomb = FALSE
var/obj/structure/reagent_dispensers/beerkeg/keg
/obj/machinery/nuclearbomb/beer/Initialize()
/obj/machinery/nuclearbomb/beer/Initialize(mapload)
. = ..()
keg = new(src)
QDEL_NULL(core)
@@ -612,14 +612,14 @@ This is here to make the tiles around the station mininuke change when it's arme
icon_state = "nucleardisk"
persistence_replacement = /obj/item/disk/nuclear/fake
max_integrity = 250
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/fake = FALSE
var/turf/lastlocation
var/last_disk_move
var/process_tick = 0
/obj/item/disk/nuclear/Initialize()
/obj/item/disk/nuclear/Initialize(mapload)
. = ..()
AddElement(/datum/element/bed_tuckable, 6, -6, 0)
@@ -74,7 +74,7 @@
flags_1 = NONE
/obj/item/pinpointer/syndicate_cyborg/Initialize()
/obj/item/pinpointer/syndicate_cyborg/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT)
@@ -91,7 +91,7 @@
target = closest_operative
..()
/obj/item/pinpointer/spider_cyborg/Initialize()
/obj/item/pinpointer/spider_cyborg/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT)
@@ -70,7 +70,7 @@
var/slam_mode = FALSE
var/datum/action/cooldown/slam
/mob/living/simple_animal/slaughter/Initialize()
/mob/living/simple_animal/slaughter/Initialize(mapload)
..()
var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
AddSpell(bloodspell)
@@ -282,7 +282,7 @@
T = find_safe_turf()
for(var/mob/living/M in consumed_mobs)
if(!M)
continue
continue
M.forceMove(T)
if(M.revive(full_heal = TRUE, admin_revive = TRUE))
M.grab_ghost(force = TRUE)
+9 -8
View File
@@ -30,7 +30,7 @@
3. Biological resources will be harvested at a later date; do not harm them.
"}
/obj/effect/mob_spawn/swarmer/Initialize()
/obj/effect/mob_spawn/swarmer/Initialize(mapload)
. = ..()
var/area/A = get_area(src)
if(A)
@@ -106,7 +106,7 @@
var/resources = 0 //Resource points, generated by consuming metal/glass
var/max_resources = 100
/mob/living/simple_animal/hostile/swarmer/Initialize()
/mob/living/simple_animal/hostile/swarmer/Initialize(mapload)
. = ..()
remove_verb(src, /mob/living/verb/pulled)
for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
@@ -139,12 +139,12 @@
else
death()
/mob/living/simple_animal/hostile/swarmer/CanPass(atom/movable/O)
/mob/living/simple_animal/hostile/swarmer/CanAllowThrough(atom/movable/O)
. = ..()
if(istype(O, /obj/item/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other
return 1
if(isswarmer(O))
return 1
..()
////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S////
/mob/living/simple_animal/hostile/swarmer/AttackingTarget()
@@ -607,7 +607,7 @@
icon_state = "disintegrate"
duration = 10
/obj/effect/temp_visual/swarmer/disintegration/Initialize()
/obj/effect/temp_visual/swarmer/disintegration/Initialize(mapload)
. = ..()
playsound(loc, "sparks", 100, 1)
@@ -698,11 +698,12 @@
light_range = MINIMUM_USEFUL_LIGHT_RANGE
max_integrity = 50
/obj/structure/swarmer/blockade/CanPass(atom/movable/O)
/obj/structure/swarmer/blockade/CanAllowThrough(atom/movable/O)
. = ..()
if(isswarmer(O))
return 1
return TRUE
if(istype(O, /obj/item/projectile/beam/disabler))
return 1
return TRUE
/mob/living/simple_animal/hostile/swarmer/proc/CreateSwarmer()
set name = "Replicate"
@@ -355,7 +355,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
var/detonation_timer
var/next_announce
/obj/machinery/doomsday_device/Initialize()
/obj/machinery/doomsday_device/Initialize(mapload)
. = ..()
countdown = new(src)
@@ -444,6 +444,6 @@
duration = 40
pixel_x = 500
/obj/effect/temp_visual/tornado/Initialize()
/obj/effect/temp_visual/tornado/Initialize(mapload)
. = ..()
animate(src, pixel_x = -500, time = 40)
@@ -618,7 +618,7 @@
else
. += "It appears to have no author."
/obj/item/spellbook/Initialize()
/obj/item/spellbook/Initialize(mapload)
. = ..()
prepare_spells()
+17 -1
View File
@@ -228,6 +228,8 @@
give_genital(/obj/item/organ/genital/breasts)
if(dna.features["has_cock"])
give_genital(/obj/item/organ/genital/penis)
if(dna.features["has_butt"])
give_genital(/obj/item/organ/genital/butt)
/mob/living/carbon/human/proc/give_genital(obj/item/organ/genital/G)
if(!dna || (NOGENITALS in dna.species.species_traits) || getorganslot(initial(G.slot)))
@@ -285,6 +287,8 @@
S = GLOB.vagina_shapes_list[G.shape]
if(/obj/item/organ/genital/breasts)
S = GLOB.breasts_shapes_list[G.shape]
if(/obj/item/organ/genital/butt)
S = GLOB.butt_shapes_list[G.shape]
if(!S || S.icon_state == "none")
continue
@@ -317,6 +321,8 @@
genital_overlay.color = "#[dna.features["breasts_color"]]"
if("vag_color")
genital_overlay.color = "#[dna.features["vag_color"]]"
if("butt_color")
genital_overlay.color = "#[dna.features["butt_color"]]"
genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size][(dna.species.use_skintones && !dna.skin_tone_override) ? "_s" : ""]_[aroused_state]_[layertext]"
@@ -346,20 +352,30 @@
var/organCheck = locate(/obj/item/organ/genital) in internal_organs
var/breastCheck = getorganslot(ORGAN_SLOT_BREASTS)
var/willyCheck = getorganslot(ORGAN_SLOT_PENIS)
var/buttCheck = getorganslot(ORGAN_SLOT_BUTT)
var/ballCheck = getorganslot(ORGAN_SLOT_TESTICLES)
if(organCheck == FALSE)
if(ishuman(src) && dna.species.use_skintones)
dna.features["genitals_use_skintone"] = TRUE
if(src.dna.species.fixed_mut_color)
if(dna.species.fixed_mut_color)
dna.features["cock_color"] = "[dna.species.fixed_mut_color]"
dna.features["breasts_color"] = "[dna.species.fixed_mut_color]"
dna.features["butt_color"] = "[dna.species.fixed_mut_color]"
dna.features["testicles_color"] = "[dna.species.fixed_mut_color]"
return
//So people who haven't set stuff up don't get rainbow surprises.
dna.features["cock_color"] = "[dna.features["mcolor"]]"
dna.features["breasts_color"] = "[dna.features["mcolor"]]"
dna.features["butt_color"] = "[dna.features["mcolor"]]"
dna.features["testicles_color"] = "[dna.features["mcolor"]]"
else //If there's a new organ, make it the same colour.
if(breastCheck == FALSE)
dna.features["breasts_color"] = dna.features["cock_color"]
else if (willyCheck == FALSE)
dna.features["cock_color"] = dna.features["breasts_color"]
else if (buttCheck == FALSE)
dna.features["butt_color"] = dna.features["butt_color"]
else if (ballCheck == FALSE)
dna.features["testicles_color"] = dna.features["testicles_color"]
return TRUE
@@ -64,6 +64,10 @@
icon_state = "single"
name = "Single" //Single as "single pair", for clarity.
/datum/sprite_accessory/testicles/hidden
icon_state = "hidden"
name = "Hidden" //not sure why these were missing, but I'm pretty certain people might want these.
//Vaginas
/datum/sprite_accessory/vagina
icon = 'icons/obj/genitals/vagina_onmob.dmi'
@@ -119,3 +123,15 @@
/datum/sprite_accessory/breasts/sextuple
icon_state = "sextuple"
name = "Sextuple"
//BUTT BE HERE
/datum/sprite_accessory/butt
icon = 'icons/obj/genitals/butt_onmob.dmi'
icon_state = "butt"
name = "butt"
color_src = "butt_color"
//there literally shouldn't be any other ass types besides one because that'd be weird, this is just here to keep things consistent for the genital system.
/datum/sprite_accessory/butt/pair
icon_state = "pair"
name = "Pair"
+92
View File
@@ -0,0 +1,92 @@
/obj/item/organ/genital/butt
name = "butt"
desc = "You see a pair of asscheeks."
icon_state = "butt"
icon = 'icons/obj/genitals/butt.dmi'
zone = BODY_ZONE_PRECISE_GROIN
slot = ORGAN_SLOT_BUTT
w_class = 3
size = 0
var/size_name = "nonexistent"
shape = "Pair" //turn this into a default constant if for some inexplicable reason we get more than one butt type but I doubt it.
genital_flags = UPDATE_OWNER_APPEARANCE|GENITAL_UNDIES_HIDDEN
masturbation_verb = "massage"
var/size_cached = 0
var/prev_size //former size value, to allow update_size() to early return should be there no significant changes.
layer_index = BUTT_LAYER_INDEX
/obj/item/organ/genital/butt/on_life()
if(QDELETED(src))
return
if(!owner)
return
/obj/item/organ/genital/butt/modify_size(modifier, min = -INFINITY, max = BUTT_SIZE_MAX)
var/new_value = clamp(size_cached + modifier, min, max)
if(new_value == size_cached)
return
prev_size = size_cached
size_cached = new_value
size = round(size_cached)
update()
..()
/obj/item/organ/genital/butt/update_size()//wah
var/rounded_size = round(size)
if(size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!fixed
if(owner)
to_chat(owner, "<span class='warning'>You feel your asscheeks shrink down to an ordinary size.</span>")
QDEL_IN(src, 1)
return
if(owner) //Because byond doesn't count from 0, I have to do this.
var/mob/living/carbon/human/H = owner
var/r_prev_size = round(prev_size)
if (rounded_size > r_prev_size)
to_chat(H, "<span class='warning'>Your buttcheeks [pick("swell up to", "flourish into", "expand into", "plump up into", "grow eagerly into", "amplify into")] a larger pair.</span>")
else if (rounded_size < r_prev_size)
to_chat(H, "<span class='warning'>Your buttcheeks [pick("shrink down to", "decrease into", "wobble down into", "diminish into", "deflate into", "contracts into")] a smaller pair.</span>")
/obj/item/organ/genital/butt/update_appearance()
var/lowershape = lowertext(shape)
//Reflect the size of dat ass on examine.
switch(round(size))
if(1)
size_name = "average"
if(2)
size_name = "sizable"
if(3)
size_name = "squeezable"
if(4)
size_name = "hefty"
if(5)
size_name = pick("massive","extreme","enormous","very generous","humongous","big bubbly","dummy thicc")
else
size_name = "nonexistent"
desc = "You see a [lowershape] of [size_name] asscheeks."
var/icon_size = size
icon_state = "butt_[lowershape]_[icon_size]"
if(owner)
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
color = SKINTONE2HEX(H.skin_tone)
if(!H.dna.skin_tone_override)
icon_state += "_s"
else
color = "#[owner.dna.features["butt_color"]]"
/obj/item/organ/genital/butt/get_features(mob/living/carbon/human/H)
var/datum/dna/D = H.dna
if(D.species.use_skintones && D.features["genitals_use_skintone"])
color = SKINTONE2HEX(H.skin_tone)
else
color = "#[D.features["butt_color"]]"
size = D.features["butt_size"]
prev_size = size
toggle_visibility(D.features["butt_visibility"], FALSE)
+1 -1
View File
@@ -71,7 +71,7 @@
update_appearance()
return TRUE
/obj/item/dildo/Initialize()
/obj/item/dildo/Initialize(mapload)
. = ..()
if(random_color == TRUE)
var/randcolor = pick(GLOB.dildo_colors)
+3 -2
View File
@@ -12,7 +12,7 @@
var/turf/listeningTo
var/hearing_range = 3
/obj/item/assembly/infra/Initialize()
/obj/item/assembly/infra/Initialize(mapload)
. = ..()
beams = list()
START_PROCESSING(SSobj, src)
@@ -220,7 +220,8 @@
icon_state = "ibeam"
anchored = TRUE
density = FALSE
pass_flags = PASSTABLE|PASSGLASS|PASSGRILLE|LETPASSTHROW
pass_flags = PASSTABLE|PASSGLASS|PASSGRILLE
pass_flags_self = LETPASSTHROW
var/obj/item/assembly/infra/master
/obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj)
+1 -1
View File
@@ -10,7 +10,7 @@
var/sensitivity = 1
var/hearing_range = 3
/obj/item/assembly/prox_sensor/Initialize()
/obj/item/assembly/prox_sensor/Initialize(mapload)
. = ..()
proximity_monitor = new(src, 0)
START_PROCESSING(SSobj, src)
+1 -1
View File
@@ -41,7 +41,7 @@
playsound(user, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE)
qdel(src)
/obj/item/assembly/signaler/Initialize()
/obj/item/assembly/signaler/Initialize(mapload)
. = ..()
set_frequency(frequency)
+1 -1
View File
@@ -22,7 +22,7 @@
user.adjustOxyLoss(200)
user.death(0)
/obj/item/assembly/timer/Initialize()
/obj/item/assembly/timer/Initialize(mapload)
. = ..()
START_PROCESSING(SSobj, src)
@@ -41,3 +41,18 @@
low_alert_datum = /atom/movable/screen/alert/not_enough_tox
high_alert_category = "too_much_tox"
high_alert_datum = /atom/movable/screen/alert/too_much_tox
/datum/breathing_class/methane
gases = list(
GAS_METHANE = 1,
GAS_METHYL_BROMIDE = -0.7,
GAS_OXYGEN = -0.1,
GAS_PLUOXIUM = -0.8
)
products = list(
GAS_METHYL_BROMIDE = 1
)
low_alert_category = "not_enough_ch4"
low_alert_datum = /atom/movable/screen/alert/not_enough_ch4
high_alert_category = "too_much_ch4"
high_alert_datum = /atom/movable/screen/alert/too_much_ch4
+86 -38
View File
@@ -7,12 +7,18 @@
heat_penalty = 1
transmit_modifier = 1.5
/datum/gas/oxygen/generate_TLV()
return new/datum/tlv(16, 19, 40, 50)
/datum/gas/nitrogen
id = GAS_N2
specific_heat = 20
name = "Nitrogen"
powermix = -1
heat_penalty = -1.5
fire_burn_rate = 1
fire_temperature = 2300
fire_products = list(GAS_NITRIC = 2)
breath_alert_info = list(
not_enough_alert = list(
alert_category = "not_enough_nitro",
@@ -45,6 +51,9 @@
fusion_power = 3
enthalpy = -393500
/datum/gas/carbon_dioxide/generate_TLV()
return new/datum/tlv(-1, -1, 5, 10)
/datum/gas/plasma
id = GAS_PLASMA
specific_heat = 200
@@ -57,7 +66,7 @@
powermix = 1
fire_burn_rate = OXYGEN_BURN_RATE_BASE // named when plasma fires were the only fires, surely
fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST
fire_products = "plasma_fire"
fire_products = FIRE_PRODUCT_PLASMA
enthalpy = FIRE_PLASMA_ENERGY_RELEASED // 3000000, 3 megajoules, 3000 kj
/datum/gas/water_vapor
@@ -66,19 +75,13 @@
name = "Water Vapor"
gas_overlay = "water_vapor"
moles_visible = MOLES_GAS_VISIBLE
flags = GAS_FLAG_DANGEROUS
fusion_power = 8
heat_penalty = 8
enthalpy = -241800 // FIRE_HYDROGEN_ENERGY_RELEASED is actually what this was supposed to be
powermix = 1
breath_reagent = /datum/reagent/water
/datum/gas/hypernoblium
id = GAS_HYPERNOB
specific_heat = 2000
name = "Hyper-noblium"
gas_overlay = "freon"
moles_visible = MOLES_GAS_VISIBLE
/datum/gas/nitrous_oxide
id = GAS_NITROUS
specific_heat = 40
@@ -92,31 +95,6 @@
enthalpy = 81600
heat_resistance = 6
/datum/gas/nitryl
id = GAS_NITRYL
specific_heat = 20
name = "Nitryl"
gas_overlay = "nitryl"
moles_visible = MOLES_GAS_VISIBLE
flags = GAS_FLAG_DANGEROUS
fusion_power = 15
fire_products = list(GAS_N2 = 0.5)
enthalpy = 33200
oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50
/datum/gas/hydrogen
id = GAS_HYDROGEN
specific_heat = 10
name = "Hydrogen"
flags = GAS_FLAG_DANGEROUS
fusion_power = 0
powermix = 1
heat_penalty = 3
transmit_modifier = 10
fire_products = list(GAS_H2O = 1)
fire_burn_rate = 2
fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50
/datum/gas/tritium
id = GAS_TRITIUM
specific_heat = 10
@@ -134,6 +112,51 @@
fire_radiation_released = 50 // arbitrary number, basically 60 moles of trit burning will just barely start to harm you
fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50
/datum/gas/nitric_oxide
id = GAS_NITRIC
specific_heat = 20
name = "Nitric oxide"
flags = GAS_FLAG_DANGEROUS
odor = "sharp sweetness"
odor_strength = 1
fusion_power = 15
enthalpy = 91290
heat_resistance = 2
/datum/gas/nitryl
id = GAS_NITRYL
specific_heat = 20
name = "Nitrogen dioxide"
color = "#963"
moles_visible = MOLES_GAS_VISIBLE
flags = GAS_FLAG_DANGEROUS
fusion_power = 15
fire_products = list(GAS_N2 = 0.5)
enthalpy = 33200
oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50
/datum/gas/hypernoblium
id = GAS_HYPERNOB
specific_heat = 2000
name = "Hyper-noblium"
gas_overlay = "freon"
moles_visible = MOLES_GAS_VISIBLE
/datum/gas/hydrogen
id = GAS_HYDROGEN
specific_heat = 10
name = "Hydrogen"
flags = GAS_FLAG_DANGEROUS
moles_visible = MOLES_GAS_VISIBLE
color = "#ffe"
fusion_power = 0
powermix = 1
heat_penalty = 3
transmit_modifier = 10
fire_products = list(GAS_H2O = 1)
fire_burn_rate = 2
fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50
/datum/gas/bz
id = GAS_BZ
specific_heat = 20
@@ -149,6 +172,8 @@
/datum/gas/stimulum
id = GAS_STIMULUM
specific_heat = 5
odor = "the color blue" // fast
odor_strength = 10
name = "Stimulum"
fusion_power = 7
@@ -157,18 +182,23 @@
specific_heat = 80
name = "Pluoxium"
fusion_power = 10
oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST * 1000 // it is VERY stable
oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST * 25 // it is VERY stable
oxidation_rate = 8 // when it can oxidize, it can oxidize a LOT
enthalpy = -50000 // but it reduces the heat output a bit
enthalpy = -2000000 // but it reduces the heat output a great deal (plasma fires add 3000000 per mole)
powermix = -1
heat_penalty = -1
transmit_modifier = -5
heat_resistance = 3
/datum/gas/pluoxium/generate_TLV()
return new/datum/tlv(-1, -1, 5, 6)
/datum/gas/miasma
id = GAS_MIASMA
specific_heat = 20
fusion_power = 50
flags = GAS_FLAG_DANGEROUS
// snowflaked odor
name = "Miasma"
gas_overlay = "miasma"
moles_visible = MOLES_GAS_VISIBLE * 60
@@ -177,6 +207,9 @@
id = GAS_METHANE
specific_heat = 30
name = "Methane"
odor = "natural gas"
odor_strength = 2
flags = GAS_FLAG_DANGEROUS
powerloss_inhibition = 1
heat_resistance = 3
breath_results = GAS_METHYL_BROMIDE
@@ -215,14 +248,18 @@
fire_products = list(GAS_CO2 = 1, GAS_H2O = 1.5, GAS_BROMINE = 0.5)
enthalpy = -35400
fire_burn_rate = 4 / 7 // oh no
fire_temperature = 808 // its autoignition, it apparently doesn't spark readily, so i don't put it lower
fire_temperature = 808 // its autoignition; it apparently doesn't spark readily, so i don't put it lower
/datum/gas/bromine
id = GAS_BROMINE
specific_heat = 76
name = "Bromine"
flags = GAS_FLAG_DANGEROUS
flags = GAS_FLAG_DANGEROUS | GAS_FLAG_CHEMICAL
group = GAS_GROUP_CHEMICALS
color = "#6e1f00"
moles_visible = MOLES_GAS_VISIBLE
odor = "bromine" // it's a very recognizable smell
odor_strength = 0.1
enthalpy = 193 // yeah it's small but it's good to include it
breath_reagent = /datum/reagent/bromine
@@ -230,10 +267,21 @@
id = GAS_AMMONIA
specific_heat = 35
name = "Ammonia"
flags = GAS_FLAG_DANGEROUS
odor = "ammonia"
odor_strength = 0.01
flags = GAS_FLAG_DANGEROUS | GAS_FLAG_CHEMICAL
group = GAS_GROUP_CHEMICALS
enthalpy = -45900
breath_reagent = /datum/reagent/ammonia
fire_products = list(GAS_H2O = 1.5, GAS_N2 = 0.5)
fire_burn_rate = 4/3
fire_temperature = 924
/datum/gas/quark_matter
id = GAS_QCD
specific_heat = 10
name = "Quark Matter"
flags = GAS_FLAG_DANGEROUS
powermix = -1
transmit_modifier = -10
heat_penalty = -10
@@ -28,7 +28,7 @@
var/list/atmos_overlay_types //gas IDs of current active gas overlays
/turf/open/Initialize()
/turf/open/Initialize(mapload)
if(!blocks_air)
air = new(2500,src)
air.copy_from_turf(src)
+35 -6
View File
@@ -25,6 +25,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA
var/list/ids = list()
var/list/typepaths = list()
var/list/fusion_powers = list()
var/list/TLV = list()
var/list/breathing_classes = list()
var/list/breath_results = list()
var/list/breath_reagents = list()
@@ -39,13 +40,18 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA
var/list/supermatter = list()
var/list/groups_by_gas = list()
var/list/groups = list()
var/list/TLVs = list()
var/list/odors = list()
var/list/odor_strengths = list()
/datum/gas
var/id = ""
var/specific_heat = 0
var/name = ""
var/gas_overlay = "" //icon_state in icons/effects/atmospherics.dmi
var/color = "#ffff"
var/gas_overlay = "generic" //icon_state in icons/effects/atmospherics.dmi
var/color = "#ffff" // Tints the overlay by this color. Use instead of gas_overlay, usually (but not necessarily).
var/odor = null // Odor string. Null means none; if not null, anyone who breathes the gas will smell it.
var/odor_strength = INFINITY // How strong the odor is; minimal partial pressure to smell, so lower = more.
var/moles_visible = null
var/flags = NONE //currently used by canisters
var/group = null // groups for scrubber/filter listing
@@ -68,6 +74,12 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA
var/heat_resistance = 0 // makes the crystal more resistant against heat damage.
var/powerloss_inhibition = 0 // Reduces how much power the supermatter loses each tick
/datum/gas/proc/generate_TLV()
if(flags & GAS_FLAG_DANGEROUS)
return new/datum/tlv/dangerous
else
return new/datum/tlv(-1, -1, 1000, 1000)
/datum/gas/proc/breath(partial_pressure, light_threshold, heavy_threshold, moles, mob/living/carbon/C, obj/item/organ/lungs/lungs)
// This is only called on gases with the GAS_FLAG_BREATH_PROC flag. When possible, do NOT use this--
// greatly prefer just adding a reagent. This is mostly around for legacy reasons.
@@ -79,11 +91,15 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA
datums[g] = gas
specific_heats[g] = gas.specific_heat
names[g] = gas.name
TLVs[g] = gas.generate_TLV()
if(gas.moles_visible)
visibility[g] = gas.moles_visible
overlays[g] = new /list(FACTOR_GAS_VISIBLE_MAX)
for(var/i in 1 to FACTOR_GAS_VISIBLE_MAX)
overlays[g][i] = new /obj/effect/overlay/gas(gas.gas_overlay, i * 255 / FACTOR_GAS_VISIBLE_MAX)
var/obj/effect/overlay/gas/overlay = new(gas.gas_overlay)
overlay.color = gas.color
overlay.alpha = i * 255 / FACTOR_GAS_VISIBLE_MAX
overlays[g][i] = overlay
else
visibility[g] = 0
overlays[g] = 0
@@ -114,8 +130,11 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA
if(gas.group)
if(!(gas.group in groups))
groups[gas.group] = list()
groups[gas.group] += gas
groups[gas.group] += g
groups_by_gas[g] = gas.group
if(gas.odor)
odor_strengths[g] = gas.odor_strength
odors[g] = gas.odor
add_supermatter_properties(gas)
_auxtools_register_gas(gas)
if(done_initializing)
@@ -145,6 +164,17 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA
done_initializing = TRUE
finalize_gas_refs()
/datum/auxgm/proc/get_by_flag(flag)
var/static/list/gases_by_flag
if(!gases_by_flag)
gases_by_flag = list()
if(!(flag in gases_by_flag))
gases_by_flag += flag
gases_by_flag[flag] = list()
for(var/g in flags)
if(flags[g] & flag)
gases_by_flag[flag] += g
return gases_by_flag[flag]
GLOBAL_DATUM_INIT(gas_data, /datum/auxgm, new)
@@ -156,7 +186,6 @@ GLOBAL_DATUM_INIT(gas_data, /datum/auxgm, new)
appearance_flags = TILE_BOUND
vis_flags = NONE
/obj/effect/overlay/gas/New(state, alph)
/obj/effect/overlay/gas/New(state)
. = ..()
icon_state = state
alpha = alph
@@ -135,6 +135,7 @@ we use a hook instead
/datum/gas_mixture/proc/set_temperature(new_temp)
/datum/gas_mixture/proc/set_volume(new_volume)
/datum/gas_mixture/proc/get_moles(gas_type)
/datum/gas_mixture/proc/get_by_flag(flag)
/datum/gas_mixture/proc/set_moles(gas_type, moles)
// VV WRAPPERS - EXTOOLS HOOKED PROCS DO NOT TAKE ARGUMENTS FROM CALL() FOR SOME REASON.
@@ -152,13 +153,20 @@ we use a hook instead
/datum/gas_mixture/proc/scrub_into(datum/gas_mixture/target, ratio, list/gases)
/datum/gas_mixture/proc/mark_immutable()
/datum/gas_mixture/proc/get_gases()
/datum/gas_mixture/proc/add(amt)
/datum/gas_mixture/proc/subtract(amt)
/datum/gas_mixture/proc/multiply(factor)
/datum/gas_mixture/proc/divide(factor)
/datum/gas_mixture/proc/get_last_share()
/datum/gas_mixture/proc/clear()
/datum/gas_mixture/proc/adjust_moles(gas_type, amt = 0)
set_moles(gas_type, clamp(get_moles(gas_type) + amt,0,INFINITY))
/datum/gas_mixture/proc/adjust_moles_temp(gas_type, amt, temperature)
/datum/gas_mixture/proc/adjust_multi()
/datum/gas_mixture/proc/return_volume() //liters
/datum/gas_mixture/proc/thermal_energy() //joules
@@ -175,6 +183,10 @@ we use a hook instead
//Removes amount of gas from the gas_mixture
//Returns: gas_mixture with the gases removed
/datum/gas_mixture/proc/remove_by_flag(flag, amount)
//Removes amount of gas from the gas mixture by flag
//Returns: gas_mixture with gases that match the flag removed
/datum/gas_mixture/proc/transfer_to(datum/gas_mixture/target, amount)
//Transfers amount of gas to target. Equivalent to target.merge(remove(amount)) but faster.
@@ -235,6 +247,14 @@ we use a hook instead
//Makes every gas in the given list have the same pressure, temperature and gas proportions.
//Returns: null
/datum/gas_mixture/proc/__remove_by_flag()
/datum/gas_mixture/remove_by_flag(flag, amount)
var/datum/gas_mixture/removed = new type
__remove_by_flag(removed, flag, amount)
return removed
/datum/gas_mixture/proc/__remove()
/datum/gas_mixture/remove(amount)
var/datum/gas_mixture/removed = new type
@@ -5,10 +5,9 @@
for(var/r in subtypesof(/datum/gas_reaction))
var/datum/gas_reaction/reaction = r
if(initial(reaction.exclude))
continue
reaction = new r
. += reaction
if(!reaction.exclude)
. += reaction
sortTim(., /proc/cmp_gas_reaction)
/proc/cmp_gas_reaction(datum/gas_reaction/a, datum/gas_reaction/b) // compares lists of reactions by the maximum priority contained within the list
@@ -18,7 +17,6 @@
//regarding the requirements lists: the minimum or maximum requirements must be non-zero.
//when in doubt, use MINIMUM_MOLE_COUNT.
var/list/min_requirements
var/list/max_requirements
var/exclude = FALSE //do it this way to allow for addition/removal of reactions midmatch in the future
var/priority = 100 //lower numbers are checked/react later than higher numbers. if two reactions have the same priority they may happen in either order
var/name = "reaction"
@@ -716,3 +714,78 @@
if(result != NO_REACTION)
return list("success" = FALSE, "message" = "Miasma sterilization not stopping due to water vapor correctly!")
return ..()
/datum/gas_reaction/nitric_oxide
priority = -5
name = "Nitric oxide decomposition"
id = "nitric_oxide"
/datum/gas_reaction/nitric_oxide/init_reqs()
min_requirements = list(
"MAX_TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST+100,
GAS_NITRIC = MINIMUM_MOLE_COUNT
)
/datum/gas_reaction/nitric_oxide/react(datum/gas_mixture/air, datum/holder)
var/nitric = air.get_moles(GAS_NITRIC)
var/oxygen = air.get_moles(GAS_O2)
var/max_amount = max(nitric / 10, MINIMUM_MOLE_COUNT)
var/enthalpy = air.return_temperature() * (air.heat_capacity() + R_IDEAL_GAS_EQUATION * air.total_moles());
var/list/enthalpies = GLOB.gas_data.enthalpies
if(oxygen > MINIMUM_MOLE_COUNT)
var/reaction_amount = min(max_amount, oxygen)
air.adjust_moles(GAS_NITRIC, -reaction_amount*2)
air.adjust_moles(GAS_O2, -reaction_amount)
air.adjust_moles(GAS_NITRYL, reaction_amount*2)
enthalpy += (reaction_amount * -(enthalpies[GAS_NITRIC] - enthalpies[GAS_NITRYL]))
air.adjust_moles(GAS_NITRIC, -max_amount)
air.adjust_moles(GAS_O2, max_amount * 0.5)
air.adjust_moles(GAS_N2, max_amount * 0.5)
enthalpy += max_amount * -enthalpies[GAS_NITRIC]
air.set_temperature(enthalpy/(air.heat_capacity() + R_IDEAL_GAS_EQUATION * air.total_moles()))
return REACTING
/datum/gas_reaction/hagedorn
priority = -INFINITY
name = "Hagedorn decomposition"
id = "hagedorn"
/datum/gas_reaction/hagedorn/init_reqs()
min_requirements = list(
"TEMP" = 2e12 // 2 trillion kelvins
)
/datum/gas_reaction/hagedorn/react(datum/gas_mixture/air, datum/holder)
var/initial_energy = air.thermal_energy()
for(var/g in air.get_gases())
air.set_moles(g, 0)
air.set_moles(GAS_QCD, initial_energy / (air.return_temperature() * GLOB.gas_data.specific_heats[GAS_QCD]))
/datum/gas_reaction/dehagedorn
priority = 50
name = "Hagedorn condensation"
id = "dehagedorn"
/datum/gas_reaction/dehagedorn/init_reqs()
min_requirements = list(
"MAX_TEMP" = 1.99e12,
GAS_QCD = MINIMUM_MOLE_COUNT
)
/datum/gas_reaction/dehagedorn/react(datum/gas_mixture/air, datum/holder)
var/initial_energy = air.thermal_energy()
var/energy_remaining = initial_energy
air.set_moles(GAS_QCD, 0)
air.set_temperature(min(air.return_temperature(), 1.8e12))
var/new_temp = air.return_temperature()
var/list/gases = GLOB.gas_data.specific_heats.Copy()
gases -= GAS_QCD
gases -= GAS_TRITIUM // no refusing sorry
for(var/g in gases)
gases[g] = 10000 / gases[g]
while(energy_remaining > 0)
var/G = pick(gases)
air.adjust_moles(G, max(0.1, energy_remaining / (gases[G] * new_temp * 20)))
energy_remaining = initial_energy - air.thermal_energy()
air.adjust_heat(-energy_remaining)
return REACTING

Some files were not shown because too many files have changed in this diff Show More