Tg 2 11 sync (#215)
* first series of updates * datums * games folder * admin and atmosia stuffs * moar * mob updates borg riding * sprites and stuff * fixes for various things * oops. some missed fixes
This commit is contained in:
+18
-14
@@ -41,11 +41,26 @@
|
||||
if(luminosity)
|
||||
light = new(src)
|
||||
|
||||
var/initialized = SSobj.initialized
|
||||
if(initialized > INITIALIZATION_INSSOBJ)
|
||||
Initialize(initialized == INITIALIZATION_INNEW_MAPLOAD)
|
||||
var/do_initialize = SSobj.initialized
|
||||
if(do_initialize > INITIALIZATION_INSSOBJ)
|
||||
Initialize(do_initialize == INITIALIZATION_INNEW_MAPLOAD)
|
||||
//. = ..() //uncomment if you are dumb enough to add a /datum/New() proc
|
||||
|
||||
//Called after New if the map is being loaded. mapload = TRUE
|
||||
//Called from base of New if the map is being loaded. mapload = FALSE
|
||||
//This base must be called or derivatives must set initialized to TRUE to prevent repeat calls
|
||||
//Derivatives must not sleep
|
||||
//Returning TRUE while mapload is TRUE will cause the object to be initialized again with mapload = FALSE when everything else is done
|
||||
//(Useful for things that requires turfs to have air). This base may only be called once, however
|
||||
|
||||
//Note: the following functions don't call the base for optimization and must copypasta:
|
||||
// /turf/Initialize
|
||||
// /turf/open/space/Initialize
|
||||
/atom/proc/Initialize(mapload)
|
||||
if(initialized)
|
||||
stack_trace("Warning: [src]([type]) initialized multiple times!")
|
||||
initialized = TRUE
|
||||
|
||||
/atom/Destroy()
|
||||
if(alternate_appearances)
|
||||
for(var/aakey in alternate_appearances)
|
||||
@@ -435,17 +450,6 @@ var/list/blood_splatter_icons = list()
|
||||
sleep(1)
|
||||
stoplag()
|
||||
|
||||
//Called after New if the world is not loaded with TRUE
|
||||
//Called from base of New if the world is loaded with FALSE
|
||||
//This base must be called or derivatives must set initialized to TRUE to prevent repeat calls
|
||||
//Derivatives must not sleep
|
||||
/atom/proc/Initialize(mapload)
|
||||
#ifdef TESTING
|
||||
if(initialized)
|
||||
stack_trace("Warning: [src]([type]) initialized multiple times!")
|
||||
#endif
|
||||
initialized = TRUE
|
||||
|
||||
//the vision impairment to give to the mob whose perspective is set to that atom (e.g. an unfocused camera giving you an impaired vision when looking through it)
|
||||
/atom/proc/get_remote_view_fullscreens(mob/user)
|
||||
return
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
layer = OBJ_LAYER
|
||||
var/last_move = null
|
||||
var/anchored = 0
|
||||
var/throwing = 0
|
||||
var/datum/thrownthing/throwing = null
|
||||
var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported
|
||||
var/throw_range = 7
|
||||
var/mob/pulledby = null
|
||||
@@ -130,14 +130,12 @@
|
||||
/atom/movable/Bump(atom/A, yes) //the "yes" arg is to differentiate our Bump proc from byond's, without it every Bump() call would become a double Bump().
|
||||
if((A && yes))
|
||||
if(throwing)
|
||||
throwing = 0
|
||||
throw_impact(A)
|
||||
throwing.hit_atom(A)
|
||||
. = 1
|
||||
if(!A || QDELETED(A))
|
||||
return
|
||||
A.Bumped(src)
|
||||
|
||||
|
||||
/atom/movable/proc/forceMove(atom/destination)
|
||||
if(destination)
|
||||
if(pulledby)
|
||||
@@ -222,7 +220,7 @@
|
||||
/atom/movable/proc/checkpass(passflag)
|
||||
return pass_flags&passflag
|
||||
|
||||
/atom/movable/proc/throw_impact(atom/hit_atom)
|
||||
/atom/movable/proc/throw_impact(atom/hit_atom, throwingdatum)
|
||||
return hit_atom.hitby(src)
|
||||
|
||||
/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked)
|
||||
@@ -297,7 +295,7 @@
|
||||
if(pulledby)
|
||||
pulledby.stop_pulling()
|
||||
|
||||
throwing = 1
|
||||
throwing = TT
|
||||
if(spin)
|
||||
SpinAnimation(5, 1)
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
E.sight_flags -= SEE_MOBS
|
||||
E.flash_protect = 2
|
||||
user << "We adjust our eyes to protect them from bright lights."
|
||||
user.update_sight()
|
||||
else
|
||||
user << "We can't adjust our eyes if we don't have any!"
|
||||
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "arm_blade"
|
||||
item_state = "arm_blade"
|
||||
flags = ABSTRACT | NODROP
|
||||
flags = ABSTRACT | NODROP | DROPDEL
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
force = 25
|
||||
throwforce = 0 //Just to be on the safe side
|
||||
@@ -203,7 +203,6 @@
|
||||
..()
|
||||
if(can_drop)
|
||||
new /obj/item/weapon/melee/synthetic_arm_blade(get_turf(user))
|
||||
qdel(src)
|
||||
|
||||
/***************************************\
|
||||
|***********COMBAT TENTACLES*************|
|
||||
@@ -303,11 +302,10 @@
|
||||
for(var/obj/item/I in H.held_items)
|
||||
if(I.is_sharp())
|
||||
C.visible_message("<span class='danger'>[H] impales [C] with [H.p_their()] [I.name]!</span>", "<span class='userdanger'>[H] impales you with [H.p_their()] [I.name]!</span>")
|
||||
C.apply_damage(I.force*2, BRUTE, "chest")
|
||||
C.apply_damage(I.force, BRUTE, "chest")
|
||||
H.do_item_attack_animation(C, used_item = I)
|
||||
H.add_mob_blood(C)
|
||||
playsound(get_turf(H),I.hitsound,75,1)
|
||||
C.Weaken(4)
|
||||
return
|
||||
|
||||
/obj/item/projectile/tentacle/on_hit(atom/target, blocked = 0)
|
||||
@@ -355,7 +353,6 @@
|
||||
|
||||
if(INTENT_HARM)
|
||||
C.visible_message("<span class='danger'>[L] is thrown towards [H] by a tentacle!</span>","<span class='userdanger'>A tentacle grabs you and throws you towards [H]!</span>")
|
||||
C.Weaken(3)
|
||||
C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(src, .proc/tentacle_stab, H, C))
|
||||
return 1
|
||||
else
|
||||
|
||||
@@ -84,8 +84,6 @@ Credit where due:
|
||||
|
||||
/datum/game_mode
|
||||
var/list/servants_of_ratvar = list() //The Enlightened servants of Ratvar
|
||||
var/required_escapees = 0 //How many servants need to escape, if applicable
|
||||
var/required_silicon_converts = 0 //How many robotic lifeforms need to be converted, if applicable
|
||||
var/clockwork_objective = CLOCKCULT_GATEWAY //The objective that the servants must fulfill
|
||||
var/clockwork_explanation = "Construct a Gateway to the Celestial Derelict and free Ratvar." //The description of the current objective
|
||||
|
||||
@@ -141,20 +139,12 @@ Credit where due:
|
||||
|
||||
/datum/game_mode/clockwork_cult/proc/forge_clock_objectives() //Determine what objective that Ratvar's servants will fulfill
|
||||
var/list/possible_objectives = list(CLOCKCULT_ESCAPE, CLOCKCULT_GATEWAY)
|
||||
var/silicons_possible = FALSE
|
||||
for(var/mob/living/silicon/ai/S in living_mob_list)
|
||||
silicons_possible = TRUE
|
||||
if(silicons_possible)
|
||||
possible_objectives += CLOCKCULT_SILICONS
|
||||
clockwork_objective = pick(possible_objectives)
|
||||
switch(clockwork_objective)
|
||||
if(CLOCKCULT_ESCAPE)
|
||||
required_escapees = round(max(1, roundstart_player_count / 3)) //33% of the player count must be cultists
|
||||
clockwork_explanation = "Ensure that [required_escapees] servants of Ratvar escape from [station_name()]."
|
||||
clockwork_explanation = "Construct a Gateway to the Celestial Derelict and proselytize the entire station."
|
||||
if(CLOCKCULT_GATEWAY)
|
||||
clockwork_explanation = "Construct a Gateway to the Celestial Derelict and free Ratvar."
|
||||
if(CLOCKCULT_SILICONS)
|
||||
clockwork_explanation = "Ensure that all active silicon-based lifeforms on [station_name()] are servants of Ratvar and Application scripture is unlocked."
|
||||
return 1
|
||||
|
||||
/datum/game_mode/clockwork_cult/proc/greet_servant(mob/M) //Description of their role
|
||||
@@ -199,27 +189,8 @@ Credit where due:
|
||||
/datum/game_mode/clockwork_cult/proc/check_clockwork_victory()
|
||||
switch(clockwork_objective)
|
||||
if(CLOCKCULT_ESCAPE)
|
||||
var/surviving_servants = 0
|
||||
for(var/datum/mind/M in servants_of_ratvar)
|
||||
if(M.current && M.current.stat != DEAD && (M.current.onCentcom() || M.current.onSyndieBase()))
|
||||
surviving_servants++
|
||||
clockwork_explanation = "Ensure that [required_escapees] servant(s) of Ratvar escape from [station_name()].<br><i><b>[surviving_servants]</b> managed to escape!</i>"
|
||||
if(surviving_servants >= required_escapees)
|
||||
ticker.news_report = CULT_ESCAPE
|
||||
return TRUE
|
||||
if(CLOCKCULT_SILICONS)
|
||||
var/total_silicons = 0
|
||||
var/valid_silicons = 0
|
||||
for(var/mob/living/silicon/S in mob_list) //Only check robots and AIs
|
||||
if(isAI(S) || iscyborg(S))
|
||||
total_silicons++
|
||||
if(is_servant_of_ratvar(S) || S.stat == DEAD)
|
||||
valid_silicons++
|
||||
clockwork_explanation = "Ensure that all active silicon-based lifeforms on [station_name()] are servants of Ratvar and Application scripture is unlocked.<br>\
|
||||
<i><b>[valid_silicons]/[total_silicons]</b> silicons were killed or converted!"
|
||||
var/list/scripture_states = scripture_unlock_check()
|
||||
if(valid_silicons >= total_silicons && scripture_states[SCRIPTURE_APPLICATION])
|
||||
ticker.news_report = CLOCK_SILICONS
|
||||
if(clockwork_gateway_activated)
|
||||
ticker.news_report = CLOCK_PROSELYTIZATION
|
||||
return TRUE
|
||||
if(CLOCKCULT_GATEWAY)
|
||||
if(ratvar_awakens)
|
||||
@@ -241,18 +212,16 @@ Credit where due:
|
||||
feedback_set_details("round_end_result", "win - servants completed their objective ([clockwork_objective])")
|
||||
else
|
||||
var/half_victory = FALSE
|
||||
if(clockwork_objective == CLOCKCULT_GATEWAY)
|
||||
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = locate() in all_clockwork_objects
|
||||
if(G)
|
||||
half_victory = TRUE
|
||||
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = locate() in all_clockwork_objects
|
||||
if(G)
|
||||
half_victory = TRUE
|
||||
if(half_victory)
|
||||
text += "<span class='large_brass'><b>The crew escaped before Ratvar could rise, but the gateway was successfully constructed!</b></span>"
|
||||
text += "<span class='large_brass'><b>The crew escaped before [clockwork_objective == CLOCKCULT_GATEWAY ? "Ratvar could rise":"the station could be proselytized"], but the gateway \
|
||||
was successfully constructed!</b></span>"
|
||||
feedback_set_details("round_end_result", "halfwin - round ended before the gateway finished")
|
||||
else
|
||||
text += "<span class='userdanger'>Ratvar's servants have failed!</span>"
|
||||
feedback_set_details("round_end_result", "loss - servants failed their objective ([clockwork_objective])")
|
||||
if(clockwork_gateway_activated && clockwork_objective != CLOCKCULT_GATEWAY)
|
||||
ticker.news_report = CLOCK_PROSELYTIZATION
|
||||
text += "<br><b>The servants' objective was:</b> <br>[clockwork_explanation]"
|
||||
text += "<br>Ratvar's servants had <b>[clockwork_caches]</b> Tinkerer's Caches."
|
||||
text += "<br><b>Construction Value(CV)</b> was: <b>[clockwork_construction_value]</b>"
|
||||
|
||||
@@ -159,11 +159,10 @@
|
||||
|
||||
/obj/effect/clockwork/sigil/submission/accession/post_channel(mob/living/L)
|
||||
if(L.isloyal())
|
||||
var/mob/living/carbon/C = L
|
||||
delete_on_finish = TRUE
|
||||
C.visible_message("<span class='warning'>[C] visibly trembles!</span>", \
|
||||
L.visible_message("<span class='warning'>[L] visibly trembles!</span>", \
|
||||
"<span class='sevtug'>[text2ratvar("You will be mine and his. This puny trinket will not stop me.")]</span>")
|
||||
for(var/obj/item/weapon/implant/mindshield/M in C.implants)
|
||||
for(var/obj/item/weapon/implant/mindshield/M in L.implants)
|
||||
qdel(M)
|
||||
|
||||
|
||||
|
||||
@@ -159,7 +159,7 @@
|
||||
/obj/item/stack/tile/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
if(source)
|
||||
return FALSE
|
||||
return list("operation_time" = amount, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_FLOOR), "spawn_dir" = SOUTH)
|
||||
return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_FLOOR), "spawn_dir" = SOUTH)
|
||||
|
||||
//Airlock conversion
|
||||
/obj/machinery/door/airlock/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
@@ -263,42 +263,18 @@
|
||||
//Hitting a clockwork structure will try to repair it.
|
||||
/obj/structure/destructible/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
. = TRUE
|
||||
if(!can_be_repaired)
|
||||
user << "<span class='warning'>[src] cannot be repaired!</span>"
|
||||
return
|
||||
if(obj_integrity >= max_integrity)
|
||||
user << "<span class='warning'>[src] is at maximum integrity!</span>"
|
||||
return
|
||||
var/amount_to_heal = max_integrity - obj_integrity
|
||||
var/healing_for_cycle = min(amount_to_heal, repair_amount)
|
||||
var/power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
|
||||
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
|
||||
user << "<span class='warning'>You need at least <b>[power_required]W</b> power to start repairing [src], and at least \
|
||||
<b>[round(amount_to_heal*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]W</b> to fully repair it!</span>"
|
||||
var/list/repair_values = list()
|
||||
if(!proselytizer.proselytizer_repair_checks(repair_values, src, user))
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] starts covering [src] in glowing orange energy...</span>", \
|
||||
"<span class='alloy'>You start repairing [src]...</span>")
|
||||
//hugeass while because we need to re-check after the do_after
|
||||
proselytizer.repairing = src
|
||||
while(proselytizer && user && src && obj_integrity < max_integrity)
|
||||
amount_to_heal = max_integrity - obj_integrity
|
||||
if(amount_to_heal <= 0)
|
||||
while(proselytizer && user && src)
|
||||
if(!do_after(user, repair_values["healing_for_cycle"] * proselytizer.speed_multiplier, target = src, \
|
||||
extra_checks = CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytizer_repair_checks, repair_values, src, user, TRUE)))
|
||||
break
|
||||
healing_for_cycle = min(amount_to_heal, repair_amount)
|
||||
power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
|
||||
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)) || \
|
||||
!do_after(user, healing_for_cycle * proselytizer.speed_multiplier, target = src) || \
|
||||
!proselytizer || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
|
||||
break
|
||||
amount_to_heal = max_integrity - obj_integrity
|
||||
if(amount_to_heal <= 0)
|
||||
break
|
||||
healing_for_cycle = min(amount_to_heal, repair_amount)
|
||||
power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
|
||||
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
|
||||
break
|
||||
obj_integrity = Clamp(obj_integrity + healing_for_cycle, 0, max_integrity)
|
||||
proselytizer.modify_stored_power(-power_required)
|
||||
obj_integrity = Clamp(obj_integrity + repair_values["healing_for_cycle"], 0, max_integrity)
|
||||
proselytizer.modify_stored_power(-repair_values["power_required"])
|
||||
playsound(src, 'sound/machines/click.ogg', 50, 1)
|
||||
|
||||
if(proselytizer)
|
||||
@@ -309,42 +285,18 @@
|
||||
|
||||
//Proselytizer mob heal proc, to avoid as much copypaste as possible.
|
||||
/mob/living/proc/proselytizer_heal(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
if(!is_servant_of_ratvar(src))
|
||||
user << "<span class='warning'>[src] does not serve Ratvar!</span>"
|
||||
return FALSE
|
||||
if(health >= maxHealth || (flags & GODMODE))
|
||||
user << "<span class='warning'>[src == user ? "You" : "[src]"] [src == user ? "are" : "is"] at maximum health!</span>"
|
||||
return FALSE
|
||||
var/amount_to_heal = maxHealth - health
|
||||
var/healing_for_cycle = min(amount_to_heal, 4)
|
||||
var/power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
|
||||
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
|
||||
user << "<span class='warning'>You need at least <b>[power_required]W</b> power to start repairing[src == user ? " yourself" : " [src]"], and at least \
|
||||
<b>[round(amount_to_heal*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]W</b> to fully repair [src == user ? "yourself" : "[p_them()]"]!</span>"
|
||||
return FALSE
|
||||
var/list/repair_values = list()
|
||||
if(!proselytizer.proselytizer_repair_checks(repair_values, src, user))
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...</span>", \
|
||||
"<span class='alloy'>You start repairin[src == user ? "g yourself" : "g [src]"]...</span>")
|
||||
//hugeass while because we need to re-check after the do_after
|
||||
proselytizer.repairing = src
|
||||
while(proselytizer && user && src && health < maxHealth)
|
||||
amount_to_heal = maxHealth - health
|
||||
if(amount_to_heal <= 0)
|
||||
while(proselytizer && user && src)
|
||||
if(!do_after(user, repair_values["healing_for_cycle"] * proselytizer.speed_multiplier, target = src, \
|
||||
extra_checks = CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytizer_repair_checks, repair_values, src, user, TRUE)))
|
||||
break
|
||||
healing_for_cycle = min(amount_to_heal, 4)
|
||||
power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
|
||||
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)) || \
|
||||
!do_after(user, healing_for_cycle * proselytizer.speed_multiplier, target = src) || \
|
||||
!proselytizer || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
|
||||
break
|
||||
amount_to_heal = maxHealth - health
|
||||
if(amount_to_heal <= 0)
|
||||
break
|
||||
healing_for_cycle = min(amount_to_heal, 4)
|
||||
power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
|
||||
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
|
||||
break
|
||||
proselytizer_heal_tick(healing_for_cycle)
|
||||
proselytizer.modify_stored_power(-power_required)
|
||||
proselytizer_heal_tick(repair_values["healing_for_cycle"])
|
||||
proselytizer.modify_stored_power(-repair_values["power_required"])
|
||||
playsound(src, 'sound/machines/click.ogg', 50, 1)
|
||||
|
||||
if(proselytizer)
|
||||
@@ -382,14 +334,17 @@
|
||||
if(health < maxHealth && !(flags & GODMODE))
|
||||
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...</span>", \
|
||||
"<span class='alloy'>You start repairin[src == user ? "g yourself" : "g [src]"]...</span>")
|
||||
proselytizer.repairing = src
|
||||
if(do_after(user,80*proselytizer.speed_multiplier, target=src))
|
||||
adjustHealth(-maxHealth)
|
||||
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.</span>", \
|
||||
"<span class='alloy'>You finish repairin[src == user ? "g yourself" : "g [src]"].</span>")
|
||||
if(proselytizer)
|
||||
proselytizer.repairing = null
|
||||
else
|
||||
user << "<span class='warning'>[src == user ? "You" : "[src]"] [src == user ? "are" : "is"] at maximum health!</span>"
|
||||
|
||||
//Convert shards and replicant alloy directly to power
|
||||
//Convert shards and gear bits directly to power
|
||||
/obj/item/clockwork/alloy_shards/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -POWER_STANDARD, "spawn_dir" = SOUTH)
|
||||
|
||||
@@ -404,6 +359,3 @@
|
||||
|
||||
/obj/item/clockwork/alloy_shards/small/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.02), "spawn_dir" = SOUTH)
|
||||
|
||||
/obj/item/clockwork/component/replicant_alloy/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
|
||||
return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -CLOCKCULT_POWER_UNIT, "spawn_dir" = SOUTH)
|
||||
|
||||
@@ -196,22 +196,17 @@
|
||||
if(proselytize_values["power_cost"] > 0)
|
||||
proselytize_values["power_cost"] *= 2
|
||||
|
||||
if(!can_use_power(proselytize_values["power_cost"]))
|
||||
if(stored_power - proselytize_values["power_cost"] < 0)
|
||||
user << "<span class='warning'>You need <b>[proselytize_values["power_cost"]]W</b> power to proselytize [target]!</span>"
|
||||
else if(stored_power - proselytize_values["power_cost"] > max_power)
|
||||
user << "<span class='warning'>Your [name] contains too much power to proselytize [target]!</span>"
|
||||
var/target_type = target.type
|
||||
|
||||
if(!proselytize_checks(proselytize_values, target, target_type, user))
|
||||
return FALSE
|
||||
|
||||
proselytize_values["operation_time"] *= speed_multiplier
|
||||
|
||||
playsound(target, 'sound/machines/click.ogg', 50, 1)
|
||||
if(proselytize_values["operation_time"])
|
||||
var/target_type = target.type
|
||||
user.visible_message("<span class='warning'>[user]'s [name] begins tearing apart [target]!</span>", "<span class='brass'>You begin proselytizing [target]...</span>")
|
||||
if(!do_after(user, proselytize_values["operation_time"], target = target))
|
||||
return FALSE
|
||||
if(repairing || !can_use_power(proselytize_values["power_cost"]) || !target || target.type != target_type) //Check again to prevent bypassing via spamclick
|
||||
if(!do_after(user, proselytize_values["operation_time"], target = target, extra_checks = CALLBACK(src, .proc/proselytize_checks, proselytize_values, target, target_type, user, TRUE)))
|
||||
return FALSE
|
||||
user.visible_message("<span class='warning'>[user]'s [name] covers [target] in golden energy!</span>", "<span class='brass'>You proselytize [target].</span>")
|
||||
else
|
||||
@@ -234,3 +229,64 @@
|
||||
if(no_table_check)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/clockwork/clockwork_proselytizer/proc/proselytize_checks(list/proselytize_values, atom/target, expected_type, mob/user, silent) //checked constantly while proselytizing
|
||||
if(!islist(proselytize_values) || !target || QDELETED(target) || !user)
|
||||
return FALSE
|
||||
if(repairing)
|
||||
return FALSE
|
||||
if(target.type != expected_type)
|
||||
return FALSE
|
||||
if(can_use_power(RATVAR_POWER_CHECK))
|
||||
proselytize_values["power_cost"] = 0
|
||||
if(!can_use_power(proselytize_values["power_cost"]))
|
||||
if(stored_power - proselytize_values["power_cost"] < 0)
|
||||
if(!silent)
|
||||
user << "<span class='warning'>You need <b>[proselytize_values["power_cost"]]W</b> power to proselytize [target]!</span>"
|
||||
else if(stored_power - proselytize_values["power_cost"] > max_power)
|
||||
if(!silent)
|
||||
user << "<span class='warning'>Your [name] contains too much power to proselytize [target]!</span>"
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
//The repair check proc.
|
||||
//Is dark magic. Can probably kill you.
|
||||
/obj/item/clockwork/clockwork_proselytizer/proc/proselytizer_repair_checks(list/repair_values, atom/target, mob/user, silent) //Exists entirely to avoid an otherwise unreadable series of checks.
|
||||
if(!islist(repair_values) || !target || QDELETED(target) || !user)
|
||||
return FALSE
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(!is_servant_of_ratvar(L))
|
||||
if(!silent)
|
||||
user << "<span class='warning'>[L] does not serve Ratvar!</span>"
|
||||
return FALSE
|
||||
if(L.health >= L.maxHealth || (L.flags & GODMODE))
|
||||
if(!silent)
|
||||
user << "<span class='warning'>[L == user ? "You are" : "[L] is"] at maximum health!</span>"
|
||||
return FALSE
|
||||
repair_values["amount_to_heal"] = L.maxHealth - L.health
|
||||
else if(isobj(target))
|
||||
if(istype(target, /obj/structure/destructible/clockwork))
|
||||
var/obj/structure/destructible/clockwork/C = target
|
||||
if(!C.can_be_repaired)
|
||||
if(!silent)
|
||||
user << "<span class='warning'>[C] cannot be repaired!</span>"
|
||||
return FALSE
|
||||
var/obj/O = target
|
||||
if(O.obj_integrity >= O.max_integrity)
|
||||
if(!silent)
|
||||
user << "<span class='warning'>[O] is at maximum integrity!</span>"
|
||||
return FALSE
|
||||
repair_values["amount_to_heal"] = O.max_integrity - O.obj_integrity
|
||||
else
|
||||
return FALSE
|
||||
if(repair_values["amount_to_heal"] <= 0)
|
||||
return FALSE
|
||||
repair_values["healing_for_cycle"] = min(repair_values["amount_to_heal"], PROSELYTIZER_REPAIR_PER_TICK)
|
||||
repair_values["power_required"] = round(repair_values["healing_for_cycle"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
|
||||
if(!can_use_power(RATVAR_POWER_CHECK) && !can_use_power(repair_values["power_required"]))
|
||||
if(!silent)
|
||||
user << "<span class='warning'>You need at least <b>[repair_values["power_required"]]W</b> power to start repairin[target == user ? "g yourself" : "g [target]"], and at least \
|
||||
<b>[round(repair_values["amount_to_heal"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]W</b> to fully repair [target == user ? "yourself" : "[target.p_them()]"]!</span>"
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -179,7 +179,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
|
||||
if(!channel_time)
|
||||
return TRUE
|
||||
for(var/invocation in invocations)
|
||||
if(!check_special_requirements() || !do_after(invoker, channel_time / invocations.len, target = invoker) || !check_special_requirements())
|
||||
if(!do_after(invoker, channel_time / invocations.len, target = invoker, extra_checks = CALLBACK(src, .proc/check_special_requirements)))
|
||||
slab.busy = null
|
||||
return FALSE
|
||||
if(multiple_invokers_used)
|
||||
@@ -206,9 +206,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
|
||||
|
||||
/datum/clockwork_scripture/channeled/scripture_effects()
|
||||
for(var/i in 1 to chant_amount)
|
||||
if(!can_recite())
|
||||
break
|
||||
if(!do_after(invoker, chant_interval, target = invoker))
|
||||
if(!do_after(invoker, chant_interval, target = invoker, extra_checks = CALLBACK(src, .proc/can_recite)))
|
||||
break
|
||||
clockwork_say(invoker, text2ratvar(pick(chant_invocations)), whispered)
|
||||
if(!chant_effects(i))
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
///////////////
|
||||
|
||||
//Ark of the Clockwork Justiciar: Creates a Gateway to the Celestial Derelict, either summoning ratvar or proselytizing everything.
|
||||
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar
|
||||
/datum/clockwork_scripture/create_object/ark_of_the_clockwork_justiciar
|
||||
descname = "Structure, Win Condition"
|
||||
name = "Ark of the Clockwork Justiciar"
|
||||
desc = "Tears apart a rift in spacetime to Reebe, the Celestial Derelict.\n\
|
||||
@@ -15,19 +15,21 @@
|
||||
consumed_components = list(BELLIGERENT_EYE = 10, VANGUARD_COGWHEEL = 10, GEIS_CAPACITOR = 10, REPLICANT_ALLOY = 10, HIEROPHANT_ANSIBLE = 10)
|
||||
invokers_required = 5
|
||||
multiple_invokers_used = TRUE
|
||||
object_path = /obj/structure/destructible/clockwork/massive/celestial_gateway
|
||||
creator_message = null
|
||||
usage_tip = "The gateway is completely vulnerable to attack during its five-minute duration. It will periodically give indication of its general position to everyone on the station \
|
||||
as well as being loud enough to be heard throughout the entire sector. Defend it with your life!"
|
||||
tier = SCRIPTURE_JUDGEMENT
|
||||
sort_priority = 1
|
||||
|
||||
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/New()
|
||||
/datum/clockwork_scripture/create_object/ark_of_the_clockwork_justiciar/New()
|
||||
if(ticker && ticker.mode && ticker.mode.clockwork_objective != CLOCKCULT_GATEWAY)
|
||||
invocations = list("ARMORER! FRIGHT! AMPERAGE! VANGUARD! I CALL UPON YOU!!", \
|
||||
"THIS STATION WILL BE A BEACON OF HOPE IN THE DARKNESS OF SPACE!!", \
|
||||
"HELP US MAKE THIS SHOW ENGINE'S GLORY!!")
|
||||
..()
|
||||
|
||||
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/check_special_requirements()
|
||||
/datum/clockwork_scripture/create_object/ark_of_the_clockwork_justiciar/check_special_requirements()
|
||||
if(!slab.no_cost)
|
||||
if(ratvar_awakens)
|
||||
invoker << "<span class='big_brass'>\"I am already here, idiot.\"</span>"
|
||||
@@ -47,11 +49,4 @@
|
||||
else
|
||||
invoker << "<span class='warning'>Ratvar's recent banishment renders him too weak to be wrung forth from Reebe!</span>"
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/scripture_effects()
|
||||
var/turf/T = get_turf(invoker)
|
||||
if(T)
|
||||
new/obj/structure/destructible/clockwork/massive/celestial_gateway(T)
|
||||
return TRUE
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -9,8 +9,7 @@
|
||||
anchored = 1
|
||||
density = 1
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
var/repair_amount = 4 //how much a proselytizer can repair each cycle
|
||||
var/can_be_repaired = TRUE //if a proselytizer can repair it at all
|
||||
var/can_be_repaired = TRUE //if a proselytizer can repair it
|
||||
break_message = "<span class='warning'>The frog isn't a meme after all!</span>" //The message shown when a structure breaks
|
||||
break_sound = 'sound/magic/clockwork/anima_fragment_death.ogg' //The sound played when a structure breaks
|
||||
debris = list(/obj/item/clockwork/alloy_shards/large = 1, \
|
||||
@@ -72,9 +71,10 @@
|
||||
. *= min(max_integrity/max(obj_integrity, 1), 4)
|
||||
. = round(., 0.01)
|
||||
|
||||
/obj/structure/destructible/clockwork/can_be_unfasten_wrench(mob/user)
|
||||
/obj/structure/destructible/clockwork/can_be_unfasten_wrench(mob/user, silent)
|
||||
if(anchored && obj_integrity <= round(max_integrity * 0.25, 1))
|
||||
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
|
||||
if(!silent)
|
||||
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
|
||||
return FAILED_UNFASTEN
|
||||
return ..()
|
||||
|
||||
@@ -158,9 +158,10 @@
|
||||
var/powered = total_accessable_power()
|
||||
return powered == PROCESS_KILL ? 25 : powered //make sure we don't accidentally return the arbitrary PROCESS_KILL define
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/can_be_unfasten_wrench(mob/user)
|
||||
/obj/structure/destructible/clockwork/powered/can_be_unfasten_wrench(mob/user, silent)
|
||||
if(active)
|
||||
user << "<span class='warning'>[src] needs to be disabled before it can be unsecured!</span>"
|
||||
if(!silent)
|
||||
user << "<span class='warning'>[src] needs to be disabled before it can be unsecured!</span>"
|
||||
return FAILED_UNFASTEN
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -74,8 +74,6 @@
|
||||
hierophant_message("<span class='large_brass'><b>A gateway to the Celestial Derelict has been created in [gate_area.map_name]!</b></span>", FALSE, src)
|
||||
if(!objective_is_gateway)
|
||||
ratvar_portal = FALSE
|
||||
hierophant_message("<span class='big_brass'>This newly constructed gateway will not free Ratvar, \
|
||||
and will instead simply proselytize and convert everything and everyone on the station.</span>", TRUE)
|
||||
SSshuttle.registerHostileEnvironment(src)
|
||||
START_PROCESSING(SSprocessing, src)
|
||||
|
||||
@@ -210,13 +208,14 @@
|
||||
animate(glow, transform = matrix() * 3, alpha = 0, time = 5)
|
||||
var/turf/startpoint = get_turf(src)
|
||||
QDEL_IN(src, 3)
|
||||
clockwork_gateway_activated = TRUE
|
||||
if(ratvar_portal)
|
||||
sleep(3)
|
||||
clockwork_gateway_activated = TRUE
|
||||
new/obj/structure/destructible/clockwork/massive/ratvar(startpoint)
|
||||
else
|
||||
INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 0) //call the shuttle immediately
|
||||
sleep(3)
|
||||
clockwork_gateway_activated = TRUE
|
||||
send_to_playing_players("<span class='ratvar'>\"[text2ratvar("Behold")]!\"</span>\n<span class='inathneq_large'>\"[text2ratvar("See Engine's mercy")]!\"</span>\n\
|
||||
<span class='sevtug_large'>\"[text2ratvar("Observe Engine's design skills")]!\"</span>\n<span class='nezbere_large'>\"[text2ratvar("Behold Engine's light")]!!\"</span>\n\
|
||||
<span class='nzcrentr_large'>\"[text2ratvar("Gaze upon Engine's power")]!\"</span>")
|
||||
@@ -234,13 +233,8 @@
|
||||
dist = FALSE
|
||||
T.ratvar_act(dist)
|
||||
CHECK_TICK
|
||||
for(var/mob/living/silicon/robot/R in silicon_mobs)
|
||||
if(R && R.stat != DEAD && !is_servant_of_ratvar(R))
|
||||
add_servant_of_ratvar(R)
|
||||
for(var/i in ai_list)
|
||||
var/mob/living/silicon/ai/A = i
|
||||
if(A && A.stat != DEAD && !is_servant_of_ratvar(A))
|
||||
add_servant_of_ratvar(A)
|
||||
for(var/mob/living/L in living_mob_list)
|
||||
L.ratvar_act()
|
||||
for(var/I in all_clockwork_mobs)
|
||||
var/mob/M = I
|
||||
if(M.stat == CONSCIOUS)
|
||||
|
||||
@@ -25,9 +25,10 @@
|
||||
if(is_servant_of_ratvar(user) || isobserver(user))
|
||||
user << "<span class='nzcrentr_small'>It requires <b>[hierophant_cost]W</b> to broadcast over the Hierophant Network, and <b>[gateway_cost]W</b> to open a Spatial Gateway.</span>"
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/can_be_unfasten_wrench(mob/user)
|
||||
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/can_be_unfasten_wrench(mob/user, silent)
|
||||
if(active)
|
||||
user << "<span class='warning'>[src] is currently sustaining a gateway!</span>"
|
||||
if(!silent)
|
||||
user << "<span class='warning'>[src] is currently sustaining a gateway!</span>"
|
||||
return FAILED_UNFASTEN
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -32,14 +32,16 @@
|
||||
/obj/structure/destructible/clockwork/ocular_warden/hulk_damage()
|
||||
return 25
|
||||
|
||||
/obj/structure/destructible/clockwork/ocular_warden/can_be_unfasten_wrench(mob/user)
|
||||
/obj/structure/destructible/clockwork/ocular_warden/can_be_unfasten_wrench(mob/user, silent)
|
||||
if(anchored)
|
||||
if(obj_integrity <= max_integrity * 0.25)
|
||||
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
|
||||
if(!silent)
|
||||
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
|
||||
return FAILED_UNFASTEN
|
||||
else
|
||||
for(var/obj/structure/destructible/clockwork/ocular_warden/W in orange(3, src))
|
||||
user << "<span class='neovgre'>You sense another ocular warden too near this location. Activating this one this close would cause them to fight.</span>"
|
||||
if(!silent)
|
||||
user << "<span class='neovgre'>You sense another ocular warden too near this location. Activating this one this close would cause them to fight.</span>"
|
||||
return FAILED_UNFASTEN
|
||||
return SUCCESSFUL_UNFASTEN
|
||||
|
||||
|
||||
@@ -498,9 +498,9 @@ var/list/teleport_runes = list()
|
||||
sleep(40)
|
||||
if(src)
|
||||
color = "#FF0000"
|
||||
new /obj/singularity/narsie/large(T) //Causes Nar-Sie to spawn even if the rune has been removed
|
||||
if(cult_mode)
|
||||
cult_mode.eldergod = 0
|
||||
new /obj/singularity/narsie/large(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)))
|
||||
|
||||
@@ -196,9 +196,32 @@
|
||||
/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
return S.Integrate(src)
|
||||
|
||||
/obj/item/proc/IntegrateAmount() //returns the amount of resources gained when eating this item
|
||||
if(materials[MAT_METAL] || materials[MAT_GLASS])
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/gun/swarmer_act()//Stops you from eating the entire armory
|
||||
return FALSE
|
||||
|
||||
/obj/item/clockwork/alloy_shards/IntegrateAmount()
|
||||
return 10
|
||||
|
||||
/obj/item/stack/tile/brass/IntegrateAmount()
|
||||
return 5
|
||||
|
||||
/obj/item/clockwork/alloy_shards/medium/gear_bit/large/IntegrateAmount()
|
||||
return 4
|
||||
|
||||
/obj/item/clockwork/alloy_shards/large/IntegrateAmount()
|
||||
return 3
|
||||
|
||||
/obj/item/clockwork/alloy_shards/medium/IntegrateAmount()
|
||||
return 2
|
||||
|
||||
/obj/item/clockwork/alloy_shards/small/IntegrateAmount()
|
||||
return 1
|
||||
|
||||
/turf/open/floor/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor
|
||||
return FALSE
|
||||
|
||||
@@ -316,6 +339,10 @@
|
||||
S << "<span class='warning'>This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.</span>"
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/deepfryer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>This kitchen appliance should be preserved, it will make delicious unhealthy snacks for our masters in the future. Aborting.</span>"
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>"
|
||||
return FALSE
|
||||
@@ -362,6 +389,10 @@
|
||||
S << "<span class='warning'>This object is receiving unactivated swarmer shells to help us. Aborting.</span>"
|
||||
return FALSE
|
||||
|
||||
/obj/structure/destructible/clockwork/massive/celestial_gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>This object is multiplying existing resources. Aborting.</span>"
|
||||
return FALSE
|
||||
|
||||
/obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
. = ..()
|
||||
var/turf/here = get_turf(src)
|
||||
@@ -373,13 +404,12 @@
|
||||
|
||||
|
||||
/obj/item/device/unactivated_swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
if(S.resources + 50 > S.max_resources)
|
||||
S << "<span class='warning'>We have too many resources to reconsume this shell. Aborting.</span>"
|
||||
else
|
||||
..()
|
||||
S.resources += 49 //refund the whole thing
|
||||
..()
|
||||
return FALSE //would logically be TRUE, but we don't want AI swarmers eating player spawn chances.
|
||||
|
||||
/obj/item/device/unactivated_swarmer/IntegrateAmount()
|
||||
return 50
|
||||
|
||||
/obj/machinery/hydroponics/soil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S << "<span class='warning'>This object does not contain enough materials to work with.</span>"
|
||||
return FALSE
|
||||
@@ -396,13 +426,13 @@
|
||||
return 0
|
||||
return new fabrication_object(loc)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/proc/Integrate(obj/item/target)
|
||||
if(resources >= max_resources)
|
||||
var/resource_gain = target.IntegrateAmount()
|
||||
if(resources + resource_gain > max_resources)
|
||||
src << "<span class='warning'>We cannot hold more materials!</span>"
|
||||
return TRUE
|
||||
if((target.materials[MAT_METAL]) || (target.materials[MAT_GLASS]))
|
||||
resources++
|
||||
if(resource_gain)
|
||||
resources += resource_gain
|
||||
do_attack_animation(target)
|
||||
changeNext_move(CLICK_CD_MELEE)
|
||||
var/obj/effect/overlay/temp/swarmer/integrate/I = new /obj/effect/overlay/temp/swarmer/integrate(get_turf(target))
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
U.hidden_uplink.telecrystals = CHALLENGE_TELECRYSTALS
|
||||
U.hidden_uplink.set_gamemode(/datum/game_mode/nuclear)
|
||||
config.shuttle_refuel_delay = max(config.shuttle_refuel_delay, CHALLENGE_SHUTTLE_DELAY)
|
||||
feedback_set("nuclear_challenge_mode",1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/device/nuclear_challenge/proc/check_allowed(mob/living/user)
|
||||
|
||||
@@ -20,7 +20,7 @@ var/bomb_set
|
||||
density = 1
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
|
||||
var/timer_set = 60
|
||||
var/timer_set = 90
|
||||
var/default_timer_set = 90
|
||||
var/minimum_timer_set = 90
|
||||
var/maximum_timer_set = 3600
|
||||
|
||||
@@ -72,6 +72,7 @@
|
||||
/obj/machinery/door/firedoor/attack_hand(mob/user)
|
||||
if(operating || !density)
|
||||
return
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
|
||||
user.visible_message("[user] bangs on \the [src].",
|
||||
"You bang on \the [src].")
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
return
|
||||
var/area/A = get_area(src)
|
||||
A.firealert(src)
|
||||
playsound(src.loc, 'sound/ambience/signal.ogg', 75, 0)
|
||||
playsound(src.loc, 'goon/sound/machinery/FireAlarm.ogg', 75, 0)
|
||||
|
||||
/obj/machinery/firealarm/proc/alarm_in(time)
|
||||
addtimer(CALLBACK(src, .proc/alarm), time)
|
||||
|
||||
@@ -356,13 +356,13 @@ Class Procs:
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/proc/can_be_unfasten_wrench(mob/user)
|
||||
/obj/proc/can_be_unfasten_wrench(mob/user, silent) //if we can unwrench this object; returns SUCCESSFUL_UNFASTEN and FAILED_UNFASTEN, which are both TRUE, or CANT_UNFASTEN, which isn't.
|
||||
if(!isfloorturf(loc) && !anchored)
|
||||
user << "<span class='warning'>[src] needs to be on the floor to be secured!</span>"
|
||||
return FAILED_UNFASTEN
|
||||
return SUCCESSFUL_UNFASTEN
|
||||
|
||||
/obj/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20)
|
||||
/obj/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20) //try to unwrench an object in a WONDERFUL DYNAMIC WAY
|
||||
if(istype(W) && !(flags & NODECONSTRUCT))
|
||||
var/can_be_unfasten = can_be_unfasten_wrench(user)
|
||||
if(!can_be_unfasten || can_be_unfasten == FAILED_UNFASTEN)
|
||||
@@ -372,10 +372,7 @@ Class Procs:
|
||||
playsound(loc, W.usesound, 50, 1)
|
||||
var/prev_anchored = anchored
|
||||
//as long as we're the same anchored state and we're either on a floor or are anchored, toggle our anchored state
|
||||
if(!time || (do_after(user, time*W.toolspeed, target = src) && anchored == prev_anchored))
|
||||
can_be_unfasten = can_be_unfasten_wrench(user)
|
||||
if(!can_be_unfasten || can_be_unfasten == FAILED_UNFASTEN)
|
||||
return can_be_unfasten
|
||||
if(!time || do_after(user, time*W.toolspeed, target = src, extra_checks = CALLBACK(src, .proc/unfasten_wrench_check, prev_anchored, user)))
|
||||
user << "<span class='notice'>You [anchored ? "un" : ""]secure [src].</span>"
|
||||
anchored = !anchored
|
||||
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
@@ -383,6 +380,13 @@ Class Procs:
|
||||
return FAILED_UNFASTEN
|
||||
return CANT_UNFASTEN
|
||||
|
||||
/obj/proc/unfasten_wrench_check(prev_anchored, mob/user) //for the do_after, this checks if unfastening conditions are still valid
|
||||
if(anchored != prev_anchored)
|
||||
return FALSE
|
||||
if(can_be_unfasten_wrench(user, TRUE) != SUCCESSFUL_UNFASTEN) //if we aren't explicitly successful, cancel the fuck out
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/proc/exchange_parts(mob/user, obj/item/weapon/storage/part_replacer/W)
|
||||
if(!istype(W))
|
||||
return
|
||||
|
||||
@@ -123,6 +123,8 @@
|
||||
switch(mode)
|
||||
if(1,2,4,5)
|
||||
user << "The display says:<br>\t<xmp>[message1]</xmp><br>\t<xmp>[message2]</xmp>"
|
||||
if(mode == 1 && SSshuttle.emergency)
|
||||
user << "Current Shuttle: [SSshuttle.emergency.name]"
|
||||
|
||||
|
||||
/obj/machinery/status_display/proc/set_message(m1, m2)
|
||||
|
||||
@@ -762,7 +762,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
|
||||
|
||||
/obj/machinery/vending/cigarette
|
||||
name = "\improper ShadyCigs Deluxe"
|
||||
desc = "If you want to get cancer, might as well do it in style"
|
||||
desc = "If you want to get cancer, might as well do it in style."
|
||||
product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!"
|
||||
product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs."
|
||||
icon_state = "cigs"
|
||||
|
||||
+41
-37
@@ -358,8 +358,11 @@
|
||||
occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 3)
|
||||
else
|
||||
occupant.clear_alert("mech damage")
|
||||
|
||||
if(occupant.loc != src) //something went wrong
|
||||
var/actual_loc = occupant.loc
|
||||
if(istype(actual_loc, /obj/item/device/mmi))
|
||||
var/obj/item/device/mmi/M = actual_loc
|
||||
actual_loc = M.mecha
|
||||
if(actual_loc != src) //something went wrong
|
||||
occupant.clear_alert("charge")
|
||||
occupant.clear_alert("mech damage")
|
||||
RemoveActions(occupant, human_occupant=1)
|
||||
@@ -859,57 +862,58 @@
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/mecha/proc/mmi_move_inside(obj/item/device/mmi/mmi_as_oc,mob/user)
|
||||
/obj/mecha/proc/mmi_move_inside(obj/item/device/mmi/mmi_as_oc, mob/user)
|
||||
if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client)
|
||||
user << "<span class='warning'>Consciousness matrix not detected!</span>"
|
||||
return 0
|
||||
return FALSE
|
||||
else if(mmi_as_oc.brainmob.stat)
|
||||
user << "<span class='warning'>Beta-rhythm below acceptable level!</span>"
|
||||
return 0
|
||||
return FALSE
|
||||
else if(occupant)
|
||||
user << "<span class='warning'>Occupant detected!</span>"
|
||||
return 0
|
||||
else if(dna_lock && (!mmi_as_oc.brainmob.stored_dna || dna_lock!=mmi_as_oc.brainmob.stored_dna.unique_enzymes))
|
||||
return FALSE
|
||||
else if(dna_lock && (!mmi_as_oc.brainmob.stored_dna || (dna_lock != mmi_as_oc.brainmob.stored_dna.unique_enzymes)))
|
||||
user << "<span class='warning'>Access denied. [name] is secured with a DNA lock.</span>"
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
visible_message("<span class='notice'>[user] starts to insert an MMI into [name].</span>")
|
||||
|
||||
if(do_after(user, 40, target = src))
|
||||
if(!occupant)
|
||||
return mmi_moved_inside(mmi_as_oc,user)
|
||||
return mmi_moved_inside(mmi_as_oc, user)
|
||||
else
|
||||
user << "<span class='warning'>Occupant detected!</span>"
|
||||
else
|
||||
user << "<span class='notice'>You stop inserting the MMI.</span>"
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/obj/mecha/proc/mmi_moved_inside(obj/item/device/mmi/mmi_as_oc,mob/user)
|
||||
if(mmi_as_oc && user in range(1))
|
||||
if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client)
|
||||
user << "<span class='notice'>Consciousness matrix not detected!</span>"
|
||||
return 0
|
||||
else if(mmi_as_oc.brainmob.stat)
|
||||
user << "<span class='warning'>Beta-rhythm below acceptable level!</span>"
|
||||
return 0
|
||||
if(!user.transferItemToLoc(mmi_as_oc, src))
|
||||
user << "<span class='warning'>\the [mmi_as_oc] is stuck to your hand, you cannot put it in \the [src]!</span>"
|
||||
return
|
||||
var/mob/brainmob = mmi_as_oc.brainmob
|
||||
occupant = brainmob
|
||||
brainmob.forceMove(src) //should allow relaymove
|
||||
brainmob.reset_perspective(src)
|
||||
brainmob.canmove = 1
|
||||
mmi_as_oc.mecha = src
|
||||
icon_state = initial(icon_state)
|
||||
setDir(dir_in)
|
||||
log_message("[mmi_as_oc] moved in as pilot.")
|
||||
if(!internal_damage)
|
||||
occupant << sound('sound/mecha/nominal.ogg',volume=50)
|
||||
GrantActions(brainmob)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
/obj/mecha/proc/mmi_moved_inside(obj/item/device/mmi/mmi_as_oc, mob/user)
|
||||
if(!(Adjacent(mmi_as_oc) && Adjacent(user)))
|
||||
return FALSE
|
||||
if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client)
|
||||
user << "<span class='notice'>Consciousness matrix not detected!</span>"
|
||||
return FALSE
|
||||
else if(mmi_as_oc.brainmob.stat)
|
||||
user << "<span class='warning'>Beta-rhythm below acceptable level!</span>"
|
||||
return FALSE
|
||||
if(!user.transferItemToLoc(mmi_as_oc, src))
|
||||
user << "<span class='warning'>\the [mmi_as_oc] is stuck to your hand, you cannot put it in \the [src]!</span>"
|
||||
return FALSE
|
||||
var/mob/brainmob = mmi_as_oc.brainmob
|
||||
mmi_as_oc.mecha = src
|
||||
occupant = brainmob
|
||||
brainmob.forceMove(src) //should allow relaymove
|
||||
brainmob.reset_perspective(src)
|
||||
brainmob.remote_control = src
|
||||
brainmob.update_canmove()
|
||||
icon_state = initial(icon_state)
|
||||
update_icon()
|
||||
setDir(dir_in)
|
||||
log_message("[mmi_as_oc] moved in as pilot.")
|
||||
if(!internal_damage)
|
||||
occupant << sound('sound/mecha/nominal.ogg',volume=50)
|
||||
GrantActions(brainmob)
|
||||
return TRUE
|
||||
|
||||
/obj/mecha/container_resist(mob/living/user)
|
||||
go_out()
|
||||
@@ -1046,4 +1050,4 @@ var/year_integer = text2num(year) // = 2013???
|
||||
/obj/mecha/update_remote_sight(mob/living/user)
|
||||
if(occupant_sight_flags)
|
||||
if(user == occupant)
|
||||
user.sight |= occupant_sight_flags
|
||||
user.sight |= occupant_sight_flags
|
||||
@@ -43,10 +43,6 @@
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/mecha/working/ripley/mmi_moved_inside(obj/item/device/mmi/mmi_as_oc,mob/user)
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/mecha/working/ripley/update_icon()
|
||||
..()
|
||||
if (hides)
|
||||
@@ -178,4 +174,4 @@
|
||||
cargo -= O
|
||||
else
|
||||
if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded.
|
||||
user << "<span class='warning'>You fail to push [O] out of [src]!</span>"
|
||||
user << "<span class='warning'>You fail to push [O] out of [src]!</span>"
|
||||
@@ -104,9 +104,9 @@ list(name = "- Carbon Dioxide", desc = " This informational poster teaches the v
|
||||
icon = 'icons/obj/contraband.dmi'
|
||||
force = 0
|
||||
resistance_flags = FLAMMABLE
|
||||
var/serial_number = 0
|
||||
var/serial = 0
|
||||
var/obj/structure/sign/poster/resulting_poster = null //The poster that will be created is initialised and stored through contraband/poster's constructor
|
||||
var/official = 0
|
||||
var/rolled_official = 0
|
||||
|
||||
|
||||
/obj/item/weapon/poster/contraband
|
||||
@@ -118,20 +118,20 @@ list(name = "- Carbon Dioxide", desc = " This informational poster teaches the v
|
||||
name = "motivational poster"
|
||||
icon_state = "rolled_legit"
|
||||
desc = "An official Nanotrasen-issued poster to foster a compliant and obedient workforce. It comes with state-of-the-art adhesive backing, for easy pinning to any vertical surface."
|
||||
official = 1
|
||||
rolled_official = 1
|
||||
|
||||
/obj/item/weapon/poster/New(turf/loc, given_serial = 0)
|
||||
if(given_serial == 0)
|
||||
if(!official)
|
||||
serial_number = rand(1, NUM_OF_POSTER_DESIGNS)
|
||||
resulting_poster = new(serial_number,official)
|
||||
if(!rolled_official)
|
||||
serial = rand(1, NUM_OF_POSTER_DESIGNS)
|
||||
resulting_poster = new(serial,rolled_official)
|
||||
else
|
||||
serial_number = rand(1, NUM_OF_POSTER_DESIGNS_LEGIT)
|
||||
resulting_poster = new(serial_number,official)
|
||||
serial = rand(1, NUM_OF_POSTER_DESIGNS_LEGIT)
|
||||
resulting_poster = new(serial,rolled_official)
|
||||
else
|
||||
serial_number = given_serial
|
||||
serial = given_serial
|
||||
//We don't give it a resulting_poster because if we called it with a given_serial it means that we're rerolling an already used poster.
|
||||
name += " - No. [serial_number]"
|
||||
name += " - No. [serial]"
|
||||
..(loc)
|
||||
|
||||
|
||||
@@ -182,8 +182,10 @@ list(name = "- Carbon Dioxide", desc = " This informational poster teaches the v
|
||||
var/placespeed = 37 // don't change this, otherwise the animation will not sync to the progress bar
|
||||
|
||||
/obj/structure/sign/poster/New(serial,rolled_official)
|
||||
serial_number = serial
|
||||
official = rolled_official
|
||||
if (!serial_number)
|
||||
serial_number = serial
|
||||
if(!official)
|
||||
official = rolled_official
|
||||
if(serial_number == loc)
|
||||
if(!official)
|
||||
serial_number = rand(1, NUM_OF_POSTER_DESIGNS) //This is for the mappers that want individual posters without having to use rolled posters.
|
||||
@@ -259,7 +261,7 @@ list(name = "- Carbon Dioxide", desc = " This informational poster teaches the v
|
||||
var/temp_loc = get_turf(user)
|
||||
flick("poster_being_set",D)
|
||||
D.loc = src
|
||||
D.official = P.official
|
||||
D.official = P.rolled_official
|
||||
qdel(P) //delete it now to cut down on sanity checks afterwards. Agouri's code supports rerolling it anyway
|
||||
playsound(D.loc, 'sound/items/poster_being_created.ogg', 100, 1)
|
||||
|
||||
|
||||
@@ -234,7 +234,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
|
||||
var/obj/item/weapon/storage/S = loc
|
||||
S.remove_from_storage(src, user.loc)
|
||||
|
||||
throwing = 0
|
||||
if(throwing)
|
||||
throwing.finalize(FALSE)
|
||||
if(loc == user)
|
||||
if(!user.dropItemToGround(src))
|
||||
return
|
||||
@@ -255,7 +256,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
|
||||
var/obj/item/weapon/storage/S = loc
|
||||
S.remove_from_storage(src, user.loc)
|
||||
|
||||
throwing = 0
|
||||
if(throwing)
|
||||
throwing.finalize(FALSE)
|
||||
if(loc == user)
|
||||
if(!user.dropItemToGround(src))
|
||||
return
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#define STATION_RENAME_TIME_LIMIT 3000
|
||||
|
||||
/obj/item/station_charter
|
||||
name = "station charter"
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
@@ -33,7 +35,7 @@
|
||||
if(used)
|
||||
user << "This charter has already been used to name the station."
|
||||
return
|
||||
if(!ignores_timeout && (world.time-round_start_time > CHALLENGE_TIME_LIMIT)) //5 minutes
|
||||
if(!ignores_timeout && (world.time-round_start_time > STATION_RENAME_TIME_LIMIT)) //5 minutes
|
||||
user << "The crew has already settled into the shift. \
|
||||
It probably wouldn't be good to rename the station right now."
|
||||
return
|
||||
@@ -93,3 +95,5 @@
|
||||
|
||||
if(!unlimited_uses)
|
||||
used = TRUE
|
||||
|
||||
#undef STATION_RENAME_TIME_LIMIT
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
origin_tech = "engineering=2;bluespace=1"
|
||||
var/translate_binary = 0
|
||||
var/translate_hive = 0
|
||||
var/syndie = 0
|
||||
var/centcom = 0
|
||||
var/list/channels = list()
|
||||
|
||||
@@ -273,9 +273,6 @@
|
||||
if(keyslot2.translate_binary)
|
||||
src.translate_binary = 1
|
||||
|
||||
if(keyslot2.translate_hive)
|
||||
src.translate_hive = 1
|
||||
|
||||
if(keyslot2.syndie)
|
||||
src.syndie = 1
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
var/broadcasting = 0
|
||||
var/listening = 1
|
||||
var/translate_binary = 0
|
||||
var/translate_hive = 0
|
||||
var/freerange = 0 // 0 - Sanitize frequencies, 1 - Full range
|
||||
var/list/channels = list() //see communications.dm for full list. First channes is a "default" for :h
|
||||
var/obj/item/device/encryptionkey/keyslot //To allow the radio to accept encryption keys.
|
||||
@@ -58,7 +57,6 @@
|
||||
/obj/item/device/radio/proc/recalculateChannels()
|
||||
channels = list()
|
||||
translate_binary = 0
|
||||
translate_hive = 0
|
||||
syndie = 0
|
||||
centcom = 0
|
||||
|
||||
@@ -72,9 +70,6 @@
|
||||
if(keyslot.translate_binary)
|
||||
translate_binary = 1
|
||||
|
||||
if(keyslot.translate_hive)
|
||||
translate_hive = 1
|
||||
|
||||
if(keyslot.syndie)
|
||||
syndie = 1
|
||||
|
||||
|
||||
@@ -272,12 +272,17 @@
|
||||
|
||||
|
||||
/obj/item/device/tape/attackby(obj/item/I, mob/user, params)
|
||||
if(ruined && istype(I, /obj/item/weapon/screwdriver))
|
||||
user << "<span class='notice'>You start winding the tape back in...</span>"
|
||||
if(do_after(user, 120*I.toolspeed, target = src))
|
||||
user << "<span class='notice'>You wound the tape back in.</span>"
|
||||
fix()
|
||||
|
||||
if(ruined)
|
||||
var/delay = -1
|
||||
if (istype(I, /obj/item/weapon/screwdriver))
|
||||
delay = 120*I.toolspeed
|
||||
else if(istype(I, /obj/item/weapon/pen))
|
||||
delay = 120*1.5
|
||||
if (delay != -1)
|
||||
user << "<span class='notice'>You start winding the tape back in...</span>"
|
||||
if(do_after(user, delay, target = src))
|
||||
user << "<span class='notice'>You wound the tape back in.</span>"
|
||||
fix()
|
||||
|
||||
//Random colour tapes
|
||||
/obj/item/device/tape/random/New()
|
||||
|
||||
@@ -251,7 +251,7 @@
|
||||
//get amount from user
|
||||
var/min = 0
|
||||
var/max = src.get_amount()
|
||||
var/stackmaterial = input(user,"How many sheets do you wish to take out of this stack? (Maximum [max]") as num
|
||||
var/stackmaterial = round(input(user,"How many sheets do you wish to take out of this stack? (Maximum [max]") as num)
|
||||
if(stackmaterial == null || stackmaterial <= min || stackmaterial >= src.get_amount())
|
||||
return
|
||||
else
|
||||
|
||||
@@ -522,43 +522,39 @@ var/global/list/RPD_recipes=list(
|
||||
if(!user.IsAdvancedToolUser() || istype(A,/turf/open/space/transit))
|
||||
return ..()
|
||||
|
||||
//make sure what we're clicking is valid for the current mode
|
||||
var/is_paintable = (p_class == PAINT_MODE && istype(A, /obj/machinery/atmospherics/pipe))
|
||||
var/is_consumable = (p_class == EATING_MODE && (istype(A, /obj/item/pipe) || istype(A, /obj/item/pipe_meter) || istype(A, /obj/structure/disposalconstruct)))
|
||||
var/can_make_pipe = ((p_class == ATMOS_MODE || p_class == METER_MODE || p_class == DISPOSALS_MODE) && isturf(A))
|
||||
|
||||
if(!is_paintable && !is_consumable && !can_make_pipe)
|
||||
return ..()
|
||||
|
||||
//So that changing the menu settings doesn't affect the pipes already being built.
|
||||
var/queued_p_type = p_type
|
||||
var/queued_p_dir = p_dir
|
||||
var/queued_p_flipped = p_flipped
|
||||
|
||||
. = FALSE
|
||||
switch(p_class)
|
||||
if(PAINT_MODE) // Paint pipes
|
||||
if(!istype(A,/obj/machinery/atmospherics/pipe))
|
||||
// Avoid spewing errors about invalid mode -2 when clicking on stuff that aren't pipes.
|
||||
user << "<span class='warning'>\The [src]'s error light flickers! Perhaps you need to only use it on pipes and pipe meters?</span>"
|
||||
return
|
||||
switch(p_class) //if we've gotten this var, the target is valid
|
||||
if(PAINT_MODE) //Paint pipes
|
||||
var/obj/machinery/atmospherics/pipe/P = A
|
||||
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
|
||||
P.add_atom_colour(paint_colors[paint_color], FIXED_COLOUR_PRIORITY)
|
||||
P.pipe_color = paint_colors[paint_color]
|
||||
user.visible_message("<span class='notice'>[user] paints \the [P] [paint_color].</span>","<span class='notice'>You paint \the [P] [paint_color].</span>")
|
||||
//P.update_icon()
|
||||
P.update_node_icon()
|
||||
return
|
||||
if(EATING_MODE) // Eating pipes
|
||||
// Must click on an actual pipe or meter.
|
||||
if(!(istype(A,/obj/item/pipe) || istype(A,/obj/item/pipe_meter) || istype(A,/obj/structure/disposalconstruct)))
|
||||
// Avoid spewing errors about invalid mode -1 when clicking on stuff that aren't pipes.
|
||||
user << "<span class='warning'>The [src]'s error light flickers! Perhaps you need to only use it on pipes and pipe meters?</span>"
|
||||
return
|
||||
user << "<span class='notice'>You start destroying pipe...</span>"
|
||||
|
||||
if(EATING_MODE) //Eating pipes
|
||||
user << "<span class='notice'>You start destroying a pipe...</span>"
|
||||
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 2, target = A))
|
||||
activate()
|
||||
qdel(A)
|
||||
|
||||
if(ATMOS_MODE)
|
||||
if(!isturf(A))
|
||||
user << "<span class='warning'>The [src]'s error light flickers!</span>"
|
||||
return
|
||||
user << "<span class='notice'>You start building pipes...</span>"
|
||||
if(ATMOS_MODE) //Making pipes
|
||||
user << "<span class='notice'>You start building a pipe...</span>"
|
||||
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 2, target = A))
|
||||
activate()
|
||||
@@ -567,21 +563,18 @@ var/global/list/RPD_recipes=list(
|
||||
P.update()
|
||||
P.add_fingerprint(usr)
|
||||
|
||||
if(METER_MODE)
|
||||
if(!isturf(A))
|
||||
user << "<span class='warning'>The [src]'s error light flickers!</span>"
|
||||
return 0
|
||||
if(METER_MODE) //Making pipe meters
|
||||
user << "<span class='notice'>You start building a meter...</span>"
|
||||
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 2, target = A))
|
||||
activate()
|
||||
new /obj/item/pipe_meter(A)
|
||||
|
||||
if(DISPOSALS_MODE)
|
||||
if(!isturf(A) || is_anchored_dense_turf(A))
|
||||
user << "<span class='warning'>The [src]'s error light flickers!</span>"
|
||||
if(DISPOSALS_MODE) //Making disposals pipes
|
||||
if(!is_anchored_dense_turf(A))
|
||||
user << "<span class='warning'>The [src]'s error light flickers; there's something in the way!</span>"
|
||||
return
|
||||
user << "<span class='notice'>You start building pipes...</span>"
|
||||
user << "<span class='notice'>You start building a disposals pipe...</span>"
|
||||
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 20, target = A))
|
||||
var/obj/structure/disposalconstruct/C = new (A, queued_p_type ,queued_p_dir)
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \
|
||||
"<span class='notice'>You throw [src]. It lands on [result]. [comment]</span>", \
|
||||
"<span class='italics'>You hear [src] rolling, it sounds like a [fake_result].</span>")
|
||||
else if(src.throwing == 0) //Dice was thrown and is coming to rest
|
||||
else if(!src.throwing) //Dice was thrown and is coming to rest
|
||||
visible_message("<span class='notice'>[src] rolls to a stop, landing on [result]. [comment]</span>")
|
||||
|
||||
/obj/item/weapon/dice/d4/Crossed(mob/living/carbon/human/H)
|
||||
|
||||
@@ -37,12 +37,11 @@
|
||||
|
||||
//What does the implant do upon injection?
|
||||
//return 1 if the implant injects
|
||||
//return -1 if the implant fails to inject
|
||||
//return 0 if there is no room for implant
|
||||
//return 0 if there is no room for implant / it fails
|
||||
/obj/item/weapon/implant/proc/implant(mob/living/target, mob/user, silent = 0)
|
||||
LAZYINITLIST(target.implants)
|
||||
if(!target.can_be_implanted() || !can_be_implanted_in(target))
|
||||
return -1
|
||||
return 0
|
||||
for(var/X in target.implants)
|
||||
if(istype(X, type))
|
||||
var/obj/item/weapon/implant/imp_e = X
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
target.visible_message("<span class='warning'>[target] seems to resist the implant!</span>", "<span class='warning'>You feel the influence of your enemies try to invade your mind!</span>")
|
||||
|
||||
qdel(src)
|
||||
return -1
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/implanter/gang
|
||||
name = "implanter (gang)"
|
||||
|
||||
@@ -24,14 +24,14 @@
|
||||
target.visible_message("<span class='warning'>[target] seems to resist the implant!</span>", "<span class='warning'>You feel something interfering with your mental conditioning, but you resist it!</span>")
|
||||
removed(target, 1)
|
||||
qdel(src)
|
||||
return -1
|
||||
return 0
|
||||
if(target.mind in ticker.mode.get_gangsters())
|
||||
ticker.mode.remove_gangster(target.mind)
|
||||
if(!silent)
|
||||
target.visible_message("<span class='warning'>[src] was destroyed in the process!</span>", "<span class='notice'>You feel a sense of peace and security. You are now protected from brainwashing.</span>")
|
||||
removed(target, 1)
|
||||
qdel(src)
|
||||
return -1
|
||||
return 0
|
||||
if(target.mind in ticker.mode.revolutionaries)
|
||||
ticker.mode.remove_revolutionary(target.mind)
|
||||
if(!silent)
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
M.visible_message("[user] has implanted [M].", "<span class='notice'>[user] implants you.</span>")
|
||||
imp = null
|
||||
update_icon()
|
||||
else
|
||||
user << "<span class='warning'>[src] fails to implant [M].</span>"
|
||||
|
||||
/obj/item/weapon/implanter/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/pen))
|
||||
|
||||
@@ -574,7 +574,6 @@
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
playsound(loc, "rustle", 50, 1, -5)
|
||||
user.visible_message("<span class='notice'>[user] hugs \the [src].</span>","<span class='notice'>You hug \the [src].</span>")
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/box/hug/medical/New()
|
||||
..()
|
||||
|
||||
@@ -34,6 +34,10 @@
|
||||
new /obj/item/device/flashlight/flare(src)
|
||||
new /obj/item/device/radio/off(src)
|
||||
|
||||
/obj/item/weapon/storage/toolbox/emergency/old
|
||||
name = "rusty red toolbox"
|
||||
item_state = "toolbox_red_old"
|
||||
|
||||
/obj/item/weapon/storage/toolbox/mechanical
|
||||
name = "mechanical toolbox"
|
||||
icon_state = "blue"
|
||||
@@ -48,6 +52,10 @@
|
||||
new /obj/item/device/analyzer(src)
|
||||
new /obj/item/weapon/wirecutters(src)
|
||||
|
||||
/obj/item/weapon/storage/toolbox/mechanical/old
|
||||
name = "rusty blue toolbox"
|
||||
item_state = "toolbox_blue_old"
|
||||
|
||||
/obj/item/weapon/storage/toolbox/electrical
|
||||
name = "electrical toolbox"
|
||||
icon_state = "yellow"
|
||||
|
||||
@@ -306,3 +306,7 @@
|
||||
..()
|
||||
for(var/i in 1 to 3)
|
||||
new/obj/item/weapon/grenade/chem_grenade/ez_clean(src)
|
||||
|
||||
/obj/item/weapon/storage/box/hug/reverse_revolver/New()
|
||||
..()
|
||||
new /obj/item/weapon/gun/ballistic/revolver/reverse(src)
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
var/gas_type = "o2"
|
||||
var/on = FALSE
|
||||
var/stabilizers = FALSE
|
||||
var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not
|
||||
var/datum/effect_system/trail_follow/ion/ion_trail
|
||||
|
||||
/obj/item/weapon/tank/jetpack/New()
|
||||
@@ -133,6 +134,7 @@
|
||||
volume = 1
|
||||
slot_flags = null
|
||||
gas_type = null
|
||||
full_speed = FALSE
|
||||
var/datum/gas_mixture/temp_air_contents
|
||||
var/obj/item/weapon/tank/internals/tank = null
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@
|
||||
if(throwing) // you keep some momentum when getting out of a thrown closet
|
||||
step(AM, dir)
|
||||
if(throwing)
|
||||
throwing = 0
|
||||
throwing.finalize(FALSE)
|
||||
|
||||
/obj/structure/closet/proc/take_contents()
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -438,3 +438,7 @@
|
||||
for(var/atom/A in contents)
|
||||
A.ex_act(severity, target)
|
||||
CHECK_TICK
|
||||
|
||||
/obj/structure/closet/singularity_act()
|
||||
dump_contents()
|
||||
..()
|
||||
|
||||
@@ -107,6 +107,15 @@
|
||||
cur_acc[cur_note] = "#" // so shift is never required
|
||||
else
|
||||
cur_oct[cur_note] = text2num(ni)
|
||||
if(user.dizziness > 0 && prob(user.dizziness / 2))
|
||||
cur_note = Clamp(cur_note + rand(round(-user.dizziness / 10), round(user.dizziness / 10)), 1, 7)
|
||||
if(user.dizziness > 0 && prob(user.dizziness / 5))
|
||||
if(prob(30))
|
||||
cur_acc[cur_note] = "#"
|
||||
else if(prob(42))
|
||||
cur_acc[cur_note] = "b"
|
||||
else if(prob(75))
|
||||
cur_acc[cur_note] = "n"
|
||||
playnote(cur_note, cur_acc[cur_note], cur_oct[cur_note])
|
||||
if(notes.len >= 2 && text2num(notes[2]))
|
||||
sleep(sanitize_tempo(tempo / text2num(notes[2])))
|
||||
|
||||
@@ -30,23 +30,20 @@
|
||||
/turf/closed/indestructible/splashscreen
|
||||
name = "Space Station 13"
|
||||
icon = 'icons/misc/fullscreen.dmi'
|
||||
icon_state = "title1"
|
||||
icon_state = "title"
|
||||
layer = FLY_LAYER
|
||||
var/titlescreen = TITLESCREEN
|
||||
|
||||
/turf/closed/indestructible/splashscreen/New()
|
||||
/turf/closed/indestructible/splashscreen/Initialize()
|
||||
..()
|
||||
icon_state = pick("title1","title2","title3","title4","title5")
|
||||
if(titlescreen)
|
||||
icon_state = titlescreen
|
||||
|
||||
/turf/closed/indestructible/riveted
|
||||
icon = 'icons/turf/walls/riveted.dmi'
|
||||
icon_state = "riveted"
|
||||
smooth = SMOOTH_TRUE
|
||||
|
||||
/turf/closed/indestructible/New()
|
||||
..()
|
||||
if(smooth)
|
||||
queue_smooth(src)
|
||||
|
||||
/turf/closed/indestructible/riveted/uranium
|
||||
icon = 'icons/turf/walls/uranium_wall.dmi'
|
||||
icon_state = "uranium"
|
||||
@@ -64,7 +61,7 @@
|
||||
smooth = SMOOTH_TRUE
|
||||
icon = 'icons/obj/smooth_structures/reinforced_window.dmi'
|
||||
|
||||
/turf/closed/indestructible/fakeglass/New()
|
||||
/turf/closed/indestructible/fakeglass/Initialize()
|
||||
..()
|
||||
icon_state = null //set the icon state to null, so our base state isn't visible
|
||||
var/image/I = image('icons/obj/structures.dmi', loc = src, icon_state = "grille")
|
||||
|
||||
@@ -29,22 +29,20 @@
|
||||
baseturf = /turf/open/indestructible/necropolis
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
|
||||
/turf/open/indestructible/necropolis/New()
|
||||
/turf/open/indestructible/necropolis/Initialize()
|
||||
..()
|
||||
if(prob(12))
|
||||
icon_state = "necro[rand(2,3)]"
|
||||
|
||||
/turf/open/indestructible/necropolis/air
|
||||
initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
|
||||
|
||||
/turf/open/indestructible/hierophant
|
||||
icon = 'icons/turf/floors/hierophant_floor.dmi'
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
baseturf = /turf/open/indestructible/hierophant
|
||||
smooth = SMOOTH_TRUE
|
||||
|
||||
/turf/open/indestructible/hierophant/New()
|
||||
..()
|
||||
if(smooth)
|
||||
queue_smooth(src)
|
||||
|
||||
/turf/open/indestructible/hierophant/two
|
||||
|
||||
/turf/open/indestructible/paper
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
L.adjustBruteLoss(30)
|
||||
|
||||
|
||||
/turf/open/chasm/straight_down/New()
|
||||
/turf/open/chasm/straight_down/Initialize()
|
||||
..()
|
||||
drop_x = x
|
||||
drop_y = y
|
||||
|
||||
@@ -33,7 +33,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
|
||||
var/list/broken_states
|
||||
var/list/burnt_states
|
||||
|
||||
/turf/open/floor/New()
|
||||
/turf/open/floor/Initialize(mapload)
|
||||
if (!broken_states)
|
||||
broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
|
||||
if (!burnt_states)
|
||||
@@ -43,6 +43,8 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
|
||||
icon_regular_floor = "floor"
|
||||
else
|
||||
icon_regular_floor = icon_state
|
||||
if(mapload)
|
||||
MakeDirty()
|
||||
|
||||
/turf/open/floor/ex_act(severity, target)
|
||||
var/shielded = is_shielded()
|
||||
@@ -179,10 +181,5 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
|
||||
if(.)
|
||||
ChangeTurf(/turf/open/floor/clockwork)
|
||||
|
||||
/turf/open/floor/Initialize(mapload)
|
||||
..()
|
||||
if(mapload)
|
||||
MakeDirty()
|
||||
|
||||
/turf/open/floor/acid_melt()
|
||||
ChangeTurf(baseturf)
|
||||
|
||||
@@ -36,10 +36,9 @@
|
||||
flags = NONE
|
||||
var/ore_type = /obj/item/weapon/ore/glass
|
||||
|
||||
/turf/open/floor/grass/New()
|
||||
/turf/open/floor/grass/Initialize()
|
||||
..()
|
||||
spawn(1)
|
||||
update_icon()
|
||||
update_icon()
|
||||
|
||||
/turf/open/floor/grass/attackby(obj/item/C, mob/user, params)
|
||||
if(istype(C, /obj/item/weapon/shovel) && params)
|
||||
@@ -76,7 +75,7 @@
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
slowdown = 0
|
||||
|
||||
/turf/open/floor/grass/snow/basalt/New()
|
||||
/turf/open/floor/grass/snow/basalt/Initialize()
|
||||
..()
|
||||
if(prob(15))
|
||||
icon_state = "basalt[rand(0, 12)]"
|
||||
@@ -96,10 +95,9 @@
|
||||
canSmoothWith = null
|
||||
flags = NONE
|
||||
|
||||
/turf/open/floor/carpet/New()
|
||||
/turf/open/floor/carpet/Initialize()
|
||||
..()
|
||||
spawn(1)
|
||||
update_icon()
|
||||
update_icon()
|
||||
|
||||
/turf/open/floor/carpet/update_icon()
|
||||
if(!..())
|
||||
@@ -131,6 +129,6 @@
|
||||
broken_states = list("damaged")
|
||||
plane = PLANE_SPACE
|
||||
|
||||
/turf/open/floor/fakespace/New()
|
||||
/turf/open/floor/fakespace/Initialize()
|
||||
..()
|
||||
icon_state = "[rand(0,25)]"
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
var/can_modify_colour = TRUE
|
||||
|
||||
|
||||
/turf/open/floor/light/New()
|
||||
/turf/open/floor/light/Initialize()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
|
||||
|
||||
/turf/open/floor/mineral/New()
|
||||
/turf/open/floor/mineral/Initialize()
|
||||
broken_states = list("[initial(icon_state)]_dam")
|
||||
..()
|
||||
if (!icons)
|
||||
@@ -221,7 +221,7 @@
|
||||
floor_tile = /obj/item/stack/tile/mineral/abductor
|
||||
icons = list("alienpod1", "alienpod2", "alienpod3", "alienpod4", "alienpod5", "alienpod6", "alienpod7", "alienpod8", "alienpod9")
|
||||
|
||||
/turf/open/floor/mineral/abductor/New()
|
||||
/turf/open/floor/mineral/abductor/Initialize()
|
||||
..()
|
||||
icon_state = "alienpod[rand(1,9)]"
|
||||
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
icon_state = "bcircuit"
|
||||
floor_tile = /obj/item/stack/tile/plasteel
|
||||
|
||||
/turf/open/floor/bluegrid/New()
|
||||
..()
|
||||
/turf/open/floor/bluegrid/Initialize()
|
||||
SSmapping.nuke_tiles += src
|
||||
..()
|
||||
|
||||
/turf/open/floor/bluegrid/Destroy()
|
||||
SSmapping.nuke_tiles -= src
|
||||
@@ -67,7 +67,7 @@
|
||||
icon_state = "plating"
|
||||
var/obj/effect/clockwork/overlay/floor/realappearence
|
||||
|
||||
/turf/open/floor/clockwork/New()
|
||||
/turf/open/floor/clockwork/Initialize()
|
||||
..()
|
||||
new /obj/effect/overlay/temp/ratvar/floor(src)
|
||||
new /obj/effect/overlay/temp/ratvar/beam(src)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
icon_state = "plating"
|
||||
intact = 0
|
||||
|
||||
/turf/open/floor/plating/New()
|
||||
/turf/open/floor/plating/Initialize()
|
||||
if (!broken_states)
|
||||
broken_states = list("platingdmg1", "platingdmg2", "platingdmg3")
|
||||
if (!burnt_states)
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
var/sand_type = /obj/item/weapon/ore/glass
|
||||
var/floor_variance = 20 //probability floor has a different icon state
|
||||
|
||||
/turf/open/floor/plating/asteroid/New()
|
||||
/turf/open/floor/plating/asteroid/Initialize()
|
||||
var/proper_name = name
|
||||
..()
|
||||
name = proper_name
|
||||
@@ -117,7 +117,7 @@
|
||||
/turf/open/floor/plating/asteroid/basalt/airless
|
||||
initial_gas_mix = "TEMP=2.7"
|
||||
|
||||
/turf/open/floor/plating/asteroid/basalt/New()
|
||||
/turf/open/floor/plating/asteroid/basalt/Initialize()
|
||||
..()
|
||||
switch(icon_state)
|
||||
if("basalt1", "basalt2", "basalt3") //5 and 9 are too dark to glow and make the amount of glows in tunnels too high
|
||||
@@ -176,7 +176,7 @@
|
||||
/turf/open/floor/plating/asteroid/airless/cave/volcanic/has_data //subtype for producing a tunnel with given data
|
||||
has_data = TRUE
|
||||
|
||||
/turf/open/floor/plating/asteroid/airless/cave/New(loc)
|
||||
/turf/open/floor/plating/asteroid/airless/cave/Initialize()
|
||||
if (!mob_spawn_list)
|
||||
mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goldgrub = 1, /mob/living/simple_animal/hostile/asteroid/goliath = 5, /mob/living/simple_animal/hostile/asteroid/basilisk = 4, /mob/living/simple_animal/hostile/asteroid/hivelord = 3)
|
||||
if (!megafauna_spawn_list)
|
||||
@@ -186,7 +186,8 @@
|
||||
|
||||
if(!has_data)
|
||||
produce_tunnel_from_data()
|
||||
..()
|
||||
else
|
||||
..() //do not continue after changeturfing or we will do a double initialize
|
||||
|
||||
/turf/open/floor/plating/asteroid/airless/cave/proc/get_cave_data(set_length, exclude_dir = -1)
|
||||
// If set_length (arg1) isn't defined, get a random length; otherwise assign our length to the length arg.
|
||||
|
||||
@@ -7,12 +7,6 @@
|
||||
baseturf = /turf/open/floor/plating/lava //lava all the way down
|
||||
slowdown = 2
|
||||
luminosity = 1
|
||||
var/static/list/safeties_typecache = list(/obj/structure/lattice/catwalk)
|
||||
//if anything matching this typecache is found in the lava, we don't burn things
|
||||
|
||||
/turf/open/floor/plating/lava/New()
|
||||
..()
|
||||
safeties_typecache = typecacheof(safeties_typecache)
|
||||
|
||||
/turf/open/floor/plating/lava/ex_act()
|
||||
return
|
||||
@@ -51,7 +45,9 @@
|
||||
|
||||
|
||||
/turf/open/floor/plating/lava/proc/is_safe()
|
||||
var/list/found_safeties = typecache_filter_list(contents, safeties_typecache)
|
||||
//if anything matching this typecache is found in the lava, we don't burn things
|
||||
var/static/list/lava_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk))
|
||||
var/list/found_safeties = typecache_filter_list(contents, lava_safeties_typecache)
|
||||
return LAZYLEN(found_safeties)
|
||||
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
name = "alien floor"
|
||||
icon_state = "alienpod1"
|
||||
|
||||
/turf/open/floor/plating/abductor/New()
|
||||
/turf/open/floor/plating/abductor/Initialize()
|
||||
..()
|
||||
icon_state = "alienpod[rand(1,9)]"
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
planetary_atmos = TRUE
|
||||
|
||||
/turf/open/floor/plating/ashplanet/New()
|
||||
/turf/open/floor/plating/ashplanet/Initialize()
|
||||
if(smooth)
|
||||
pixel_y = -4
|
||||
pixel_x = -4
|
||||
@@ -72,7 +72,7 @@
|
||||
icon_state = "wateryrock"
|
||||
slowdown = 2
|
||||
|
||||
/turf/open/floor/plating/ashplanet/wateryrock/New()
|
||||
/turf/open/floor/plating/ashplanet/wateryrock/Initialize()
|
||||
icon_state = "[icon_state][rand(1, 9)]"
|
||||
..()
|
||||
|
||||
@@ -113,7 +113,7 @@
|
||||
name = "iron sand"
|
||||
desc = "Like sand, but more <i>metal</i>."
|
||||
|
||||
/turf/open/floor/plating/ironsand/New()
|
||||
/turf/open/floor/plating/ironsand/Initialize()
|
||||
..()
|
||||
icon_state = "ironsand[rand(1,15)]"
|
||||
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
icon_state = "plating"
|
||||
var/obj/effect/clockwork/overlay/floor/bloodcult/realappearence
|
||||
|
||||
/turf/open/floor/engine/cult/New()
|
||||
/turf/open/floor/engine/cult/Initialize()
|
||||
..()
|
||||
new /obj/effect/overlay/temp/cult/turf/floor(src)
|
||||
realappearence = new /obj/effect/clockwork/overlay/floor/bloodcult(src)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
var/scan_state = null //Holder for the image we display when we're pinged by a mining scanner
|
||||
var/defer_change = 0
|
||||
|
||||
/turf/closed/mineral/New()
|
||||
/turf/closed/mineral/Initialize()
|
||||
if (!canSmoothWith)
|
||||
canSmoothWith = list(/turf/closed)
|
||||
pixel_y = -4
|
||||
@@ -139,7 +139,7 @@
|
||||
var/mineralChance = 13
|
||||
var/display_icon_state = "rock"
|
||||
|
||||
/turf/closed/mineral/random/New()
|
||||
/turf/closed/mineral/random/Initialize()
|
||||
if (!mineralSpawnChanceList)
|
||||
mineralSpawnChanceList = list(
|
||||
/turf/closed/mineral/uranium = 5, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 10,
|
||||
@@ -385,7 +385,7 @@
|
||||
var/activated_name = null
|
||||
var/activated_image = null
|
||||
|
||||
/turf/closed/mineral/gibtonite/New()
|
||||
/turf/closed/mineral/gibtonite/Initialize()
|
||||
det_time = rand(8,10) //So you don't know exactly when the hot potato will explode
|
||||
..()
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
sheet_amount = 1
|
||||
girder_type = /obj/structure/girder/cult
|
||||
|
||||
/turf/closed/wall/mineral/cult/New()
|
||||
/turf/closed/wall/mineral/cult/Initialize()
|
||||
new /obj/effect/overlay/temp/cult/turf(src)
|
||||
..()
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
var/obj/effect/clockwork/overlay/wall/realappearence
|
||||
var/obj/structure/destructible/clockwork/cache/linkedcache
|
||||
|
||||
/turf/closed/wall/clockwork/New()
|
||||
/turf/closed/wall/clockwork/Initialize()
|
||||
..()
|
||||
new /obj/effect/overlay/temp/ratvar/wall(src)
|
||||
new /obj/effect/overlay/temp/ratvar/beam(src)
|
||||
|
||||
@@ -15,15 +15,16 @@
|
||||
var/global/datum/gas_mixture/space/space_gas = new
|
||||
plane = PLANE_SPACE
|
||||
|
||||
/turf/open/space/New()
|
||||
/turf/open/space/Initialize()
|
||||
icon_state = SPACE_ICON_STATE
|
||||
air = space_gas
|
||||
|
||||
if(initialized)
|
||||
stack_trace("Warning: [src]([type]) initialized multiple times!")
|
||||
initialized = TRUE
|
||||
|
||||
/turf/open/space/Destroy(force)
|
||||
if(force)
|
||||
. = ..()
|
||||
else
|
||||
return QDEL_HINT_LETMELIVE
|
||||
if(requires_activation)
|
||||
SSair.add_to_active(src)
|
||||
|
||||
/turf/open/space/attack_ghost(mob/dead/observer/user)
|
||||
if(destination_z)
|
||||
|
||||
@@ -61,14 +61,12 @@
|
||||
/turf/open/space/transit/attackby()
|
||||
return
|
||||
|
||||
/turf/open/space/transit/New()
|
||||
/turf/open/space/transit/Initialize()
|
||||
..()
|
||||
update_icon()
|
||||
for(var/atom/movable/AM in src)
|
||||
throw_atom(AM)
|
||||
|
||||
|
||||
|
||||
/turf/open/space/transit/proc/update_icon()
|
||||
var/p = 9
|
||||
var/angle = 0
|
||||
|
||||
+12
-3
@@ -23,14 +23,17 @@
|
||||
var/explosion_id = 0
|
||||
|
||||
var/list/decals
|
||||
var/requires_activation //add to air processing after initialize?
|
||||
|
||||
/turf/SDQL_update(const/var_name, new_value)
|
||||
if(var_name == "x" || var_name == "y" || var_name == "z")
|
||||
return FALSE
|
||||
. = ..()
|
||||
|
||||
/turf/New()
|
||||
..()
|
||||
/turf/Initialize()
|
||||
if(initialized)
|
||||
stack_trace("Warning: [src]([type]) initialized multiple times!")
|
||||
initialized = TRUE
|
||||
|
||||
levelupdate()
|
||||
if(smooth)
|
||||
@@ -40,11 +43,17 @@
|
||||
for(var/atom/movable/AM in src)
|
||||
Entered(AM)
|
||||
|
||||
if(requires_activation)
|
||||
CalculateAdjacentTurfs()
|
||||
SSair.add_to_active(src)
|
||||
|
||||
/turf/proc/Initalize_Atmos(times_fired)
|
||||
CalculateAdjacentTurfs()
|
||||
|
||||
/turf/Destroy()
|
||||
visibilityChanged()
|
||||
initialized = FALSE
|
||||
requires_activation = FALSE
|
||||
..()
|
||||
return QDEL_HINT_HARDDEL_NOW
|
||||
|
||||
@@ -454,4 +463,4 @@
|
||||
/turf/proc/remove_decal(group)
|
||||
LAZYINITLIST(decals)
|
||||
overlays -= decals[group]
|
||||
decals[group] = null
|
||||
decals[group] = null
|
||||
|
||||
Reference in New Issue
Block a user