Merge branch 'master' into upstream-merge-28681
This commit is contained in:
@@ -1,10 +0,0 @@
|
||||
diff a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm (rejected hunks)
|
||||
@@ -171,7 +171,7 @@
|
||||
return 0
|
||||
if(cooldown > world.time)
|
||||
if(!CM.active)
|
||||
- owner << "<span class='cultlarge'><b>You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can mark another target!</b></span>"
|
||||
+ to_chat(owner, "<span class='cultlarge'><b>You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can mark another target!</b></span>")
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
@@ -35,6 +35,7 @@ To draw a rune, use an arcane tome.
|
||||
var/scribe_damage = 0.1 //how much damage you take doing it
|
||||
|
||||
var/allow_excess_invokers = FALSE //if we allow excess invokers when being invoked
|
||||
var/invoke_damage = 0 //how much damage invokers take when invoking it
|
||||
var/construct_invoke = TRUE //if constructs can invoke it
|
||||
|
||||
var/req_keyword = 0 //If the rune requires a keyword - go figure amirite
|
||||
@@ -133,10 +134,13 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
|
||||
/obj/effect/rune/proc/invoke(var/list/invokers)
|
||||
//This proc contains the effects of the rune as well as things that happen afterwards. If you want it to spawn an object and then delete itself, have both here.
|
||||
if(invocation)
|
||||
for(var/M in invokers)
|
||||
var/mob/living/L = M
|
||||
for(var/M in invokers)
|
||||
var/mob/living/L = M
|
||||
if(invocation)
|
||||
L.say(invocation, language = /datum/language/common)
|
||||
if(invoke_damage)
|
||||
L.apply_damage(invoke_damage, BRUTE)
|
||||
to_chat(L, "<span class='cultitalic'>[src] saps your strength!</span>")
|
||||
do_invoke_glow()
|
||||
|
||||
/obj/effect/rune/proc/do_invoke_glow()
|
||||
@@ -159,6 +163,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
cultist_name = "malformed rune"
|
||||
cultist_desc = "a senseless rune written in gibberish. No good can come from invoking this."
|
||||
invocation = "Ra'sha yoka!"
|
||||
invoke_damage = 30
|
||||
|
||||
/obj/effect/rune/malformed/Initialize(mapload, set_keyword)
|
||||
. = ..()
|
||||
@@ -167,10 +172,6 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
|
||||
/obj/effect/rune/malformed/invoke(var/list/invokers)
|
||||
..()
|
||||
for(var/M in invokers)
|
||||
var/mob/living/L = M
|
||||
to_chat(L, "<span class='cultitalic'><b>You feel your life force draining. The Geometer is displeased.</b></span>")
|
||||
L.apply_damage(30, BRUTE)
|
||||
qdel(src)
|
||||
|
||||
/mob/proc/null_rod_check() //The null rod, if equipped, will protect the holder from the effects of most runes
|
||||
@@ -508,9 +509,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
/obj/effect/rune/raise_dead/examine(mob/user)
|
||||
..()
|
||||
if(iscultist(user) || user.stat == DEAD)
|
||||
var/revive_number = 0
|
||||
if(GLOB.sacrificed.len)
|
||||
revive_number = GLOB.sacrificed.len - revives_used
|
||||
var/revive_number = LAZYLEN(GLOB.sacrificed) - revives_used
|
||||
to_chat(user, "<b>Revives Remaining:</b> [revive_number]")
|
||||
|
||||
/obj/effect/rune/raise_dead/invoke(var/list/invokers)
|
||||
@@ -520,6 +519,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
var/mob/living/user = invokers[1]
|
||||
if(rune_in_use)
|
||||
return
|
||||
rune_in_use = TRUE
|
||||
for(var/mob/living/M in T.contents)
|
||||
if(iscultist(M) && M.stat == DEAD)
|
||||
potential_revive_mobs |= M
|
||||
@@ -527,18 +527,20 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
to_chat(user, "<span class='cultitalic'>There are no dead cultists on the rune!</span>")
|
||||
log_game("Raise Dead rune failed - no corpses to revive")
|
||||
fail_invoke()
|
||||
rune_in_use = FALSE
|
||||
return
|
||||
if(!GLOB.sacrificed.len || GLOB.sacrificed.len <= revives_used)
|
||||
if(LAZYLEN(GLOB.sacrificed) <= revives_used)
|
||||
to_chat(user, "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>")
|
||||
fail_invoke()
|
||||
rune_in_use = FALSE
|
||||
return
|
||||
if(potential_revive_mobs.len > 1)
|
||||
mob_to_revive = input(user, "Choose a cultist to revive.", "Cultist to Revive") as null|anything in potential_revive_mobs
|
||||
else
|
||||
mob_to_revive = potential_revive_mobs[1]
|
||||
if(!src || QDELETED(src) || rune_in_use || !validness_checks(mob_to_revive, user))
|
||||
rune_in_use = FALSE
|
||||
return
|
||||
rune_in_use = 1
|
||||
if(user.name == "Herbert West")
|
||||
invocation = "To life, to life, I bring them!"
|
||||
else
|
||||
@@ -550,34 +552,34 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
to_chat(mob_to_revive, "<span class='cultlarge'>\"PASNAR SAVRAE YAM'TOTH. Arise.\"</span>")
|
||||
mob_to_revive.visible_message("<span class='warning'>[mob_to_revive] draws in a huge breath, red light shining from [mob_to_revive.p_their()] eyes.</span>", \
|
||||
"<span class='cultlarge'>You awaken suddenly from the void. You're alive!</span>")
|
||||
rune_in_use = 0
|
||||
rune_in_use = FALSE
|
||||
|
||||
/obj/effect/rune/raise_dead/proc/validness_checks(mob/living/target_mob, mob/living/user)
|
||||
var/turf/T = get_turf(src)
|
||||
if(!user)
|
||||
return 0
|
||||
if(QDELETED(user))
|
||||
return FALSE
|
||||
if(!Adjacent(user) || user.incapacitated())
|
||||
return 0
|
||||
if(!target_mob)
|
||||
return FALSE
|
||||
if(QDELETED(target_mob))
|
||||
fail_invoke()
|
||||
return 0
|
||||
return FALSE
|
||||
if(!(target_mob in T.contents))
|
||||
to_chat(user, "<span class='cultitalic'>The cultist to revive has been moved!</span>")
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - revival target moved")
|
||||
return 0
|
||||
return FALSE
|
||||
var/mob/dead/observer/ghost = target_mob.get_ghost(TRUE)
|
||||
if(!ghost && (!target_mob.mind || !target_mob.mind.active))
|
||||
to_chat(user, "<span class='cultitalic'>The corpse to revive has no spirit!</span>")
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - revival target has no ghost")
|
||||
return 0
|
||||
return FALSE
|
||||
if(!GLOB.sacrificed.len || GLOB.sacrificed.len <= revives_used)
|
||||
to_chat(user, "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>")
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - too few sacrificed")
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/effect/rune/raise_dead/fail_invoke()
|
||||
..()
|
||||
@@ -592,7 +594,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
cultist_desc = "emits a large electromagnetic pulse, increasing in size for each cultist invoking it, hindering electronics and disabling silicons."
|
||||
invocation = "Ta'gh fara'qha fel d'amar det!"
|
||||
icon_state = "5"
|
||||
allow_excess_invokers = 1
|
||||
allow_excess_invokers = TRUE
|
||||
color = RUNE_COLOR_EMP
|
||||
|
||||
/obj/effect/rune/emp/invoke(var/list/invokers)
|
||||
@@ -624,10 +626,14 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
invocation = "Fwe'sh mah erl nyag r'ya!"
|
||||
icon_state = "7"
|
||||
color = RUNE_COLOR_DARKRED
|
||||
rune_in_use = 0 //One at a time, please!
|
||||
construct_invoke = 0
|
||||
rune_in_use = FALSE //One at a time, please!
|
||||
construct_invoke = FALSE
|
||||
var/mob/living/affecting = null
|
||||
|
||||
/obj/effect/rune/spirit/Destroy()
|
||||
affecting = null
|
||||
return ..()
|
||||
|
||||
/obj/effect/rune/spirit/examine(mob/user)
|
||||
..()
|
||||
if(affecting)
|
||||
@@ -651,41 +657,33 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
var/turf/T = get_turf(src)
|
||||
rune_in_use = TRUE
|
||||
affecting = user
|
||||
user.add_atom_colour(RUNE_COLOR_DARKRED, ADMIN_COLOUR_PRIORITY)
|
||||
user.visible_message("<span class='warning'>[user] freezes statue-still, glowing an unearthly red.</span>", \
|
||||
affecting.add_atom_colour(RUNE_COLOR_DARKRED, ADMIN_COLOUR_PRIORITY)
|
||||
affecting.visible_message("<span class='warning'>[affecting] freezes statue-still, glowing an unearthly red.</span>", \
|
||||
"<span class='cult'>You see what lies beyond. All is revealed. While this is a wondrous experience, your physical form will waste away in this state. Hurry...</span>")
|
||||
user.ghostize(1)
|
||||
while(user)
|
||||
if(!affecting)
|
||||
visible_message("<span class='warning'>[src] pulses gently before falling dark.</span>")
|
||||
affecting = null //In case it's assigned to a number or something
|
||||
rune_in_use = FALSE
|
||||
return
|
||||
affecting.ghostize(1)
|
||||
while(!QDELETED(affecting))
|
||||
affecting.apply_damage(0.1, BRUTE)
|
||||
if(!(user in T))
|
||||
user.visible_message("<span class='warning'>A spectral tendril wraps around [user] and pulls [user.p_them()] back to the rune!</span>")
|
||||
Beam(user,icon_state="drainbeam",time=2)
|
||||
user.forceMove(get_turf(src)) //NO ESCAPE :^)
|
||||
if(user.key)
|
||||
user.visible_message("<span class='warning'>[user] slowly relaxes, the glow around [user.p_them()] dimming.</span>", \
|
||||
if(!(affecting in T))
|
||||
user.visible_message("<span class='warning'>A spectral tendril wraps around [affecting] and pulls [affecting.p_them()] back to the rune!</span>")
|
||||
Beam(affecting, icon_state="drainbeam", time=2)
|
||||
affecting.forceMove(get_turf(src)) //NO ESCAPE :^)
|
||||
if(affecting.key)
|
||||
affecting.visible_message("<span class='warning'>[affecting] slowly relaxes, the glow around [affecting.p_them()] dimming.</span>", \
|
||||
"<span class='danger'>You are re-united with your physical form. [src] releases its hold over you.</span>")
|
||||
user.remove_atom_colour(ADMIN_COLOUR_PRIORITY, RUNE_COLOR_DARKRED)
|
||||
user.Weaken(3)
|
||||
rune_in_use = FALSE
|
||||
affecting = null
|
||||
return
|
||||
if(user.stat == UNCONSCIOUS)
|
||||
affecting.remove_atom_colour(ADMIN_COLOUR_PRIORITY, RUNE_COLOR_DARKRED)
|
||||
affecting.Weaken(3)
|
||||
break
|
||||
if(affecting.stat == UNCONSCIOUS)
|
||||
if(prob(1))
|
||||
var/mob/dead/observer/G = user.get_ghost()
|
||||
var/mob/dead/observer/G = affecting.get_ghost()
|
||||
to_chat(G, "<span class='cultitalic'>You feel the link between you and your body weakening... you must hurry!</span>")
|
||||
if(user.stat == DEAD)
|
||||
user.remove_atom_colour(ADMIN_COLOUR_PRIORITY, RUNE_COLOR_DARKRED)
|
||||
rune_in_use = FALSE
|
||||
affecting = null
|
||||
var/mob/dead/observer/G = user.get_ghost()
|
||||
else if(affecting.stat == DEAD)
|
||||
affecting.remove_atom_colour(ADMIN_COLOUR_PRIORITY, RUNE_COLOR_DARKRED)
|
||||
var/mob/dead/observer/G = affecting.get_ghost()
|
||||
to_chat(G, "<span class='cultitalic'><b>You suddenly feel your physical form pass on. [src]'s exertion has killed you!</b></span>")
|
||||
return
|
||||
break
|
||||
sleep(1)
|
||||
affecting = null
|
||||
rune_in_use = FALSE
|
||||
|
||||
//Rite of the Corporeal Shield: When invoked, becomes solid and cannot be passed. Invoke again to undo.
|
||||
@@ -726,9 +724,10 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
update_state()
|
||||
if(density)
|
||||
spread_density()
|
||||
user.visible_message("<span class='warning'>[user] [iscarbon(user) ? "places [user.p_their()] hands on":"stares intently at"] [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].</span>", \
|
||||
"<span class='cultitalic'>You channel your life energy into [src], [density ? "temporarily preventing" : "allowing"] passage above it.</span>")
|
||||
if(iscarbon(user))
|
||||
var/carbon_user = iscarbon(user)
|
||||
user.visible_message("<span class='warning'>[user] [carbon_user ? "places [user.p_their()] hands on":"stares intently at"] [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].</span>", \
|
||||
"<span class='cultitalic'>You channel [carbon_user ? "your life ":""]energy into [src], [density ? "temporarily preventing" : "allowing"] passage above it.</span>")
|
||||
if(carbon_user)
|
||||
var/mob/living/carbon/C = user
|
||||
C.apply_damage(2, BRUTE, pick("l_arm", "r_arm"))
|
||||
|
||||
@@ -775,7 +774,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
cultist_desc = "summons a single cultist to the rune. Requires 2 invokers."
|
||||
invocation = "N'ath reth sh'yro eth d'rekkathnor!"
|
||||
req_cultists = 2
|
||||
allow_excess_invokers = 1
|
||||
invoke_damage = 10
|
||||
icon_state = "5"
|
||||
color = RUNE_COLOR_SUMMON
|
||||
|
||||
@@ -812,7 +811,6 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
"<span class='cultitalic'><b>Overwhelming vertigo consumes you as you are hurled through the air!</b></span>")
|
||||
..()
|
||||
visible_message("<span class='warning'>A foggy shape materializes atop [src] and solidifes into [cultist_to_summon]!</span>")
|
||||
user.apply_damage(10, BRUTE, "head")
|
||||
cultist_to_summon.forceMove(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
@@ -825,7 +823,8 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
color = RUNE_COLOR_MEDIUMRED
|
||||
light_color = LIGHT_COLOR_LAVA
|
||||
req_cultists = 3
|
||||
construct_invoke = 0
|
||||
invoke_damage = 10
|
||||
construct_invoke = FALSE
|
||||
var/tick_damage = 25
|
||||
rune_in_use = FALSE
|
||||
|
||||
@@ -839,12 +838,8 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
rune_in_use = TRUE
|
||||
var/turf/T = get_turf(src)
|
||||
visible_message("<span class='warning'>[src] turns a bright, glowing orange!</span>")
|
||||
set_light(6)
|
||||
color = "#FC9B54"
|
||||
for(var/M in invokers)
|
||||
var/mob/living/L = M
|
||||
L.apply_damage(10, BRUTE, pick("l_arm", "r_arm"))
|
||||
to_chat(L, "<span class='cultitalic'>[src] saps your strength!</span>")
|
||||
set_light(6, 1, color)
|
||||
for(var/mob/living/L in viewers(T))
|
||||
if(!iscultist(L) && L.blood_volume)
|
||||
var/obj/item/weapon/nullrod/N = L.null_rod_check()
|
||||
@@ -856,23 +851,24 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
to_chat(L, "<span class='userdanger'>You feel an unholy darkness dimming the Justiciar's light!</span>")
|
||||
animate(src, color = "#FCB56D", time = 4)
|
||||
sleep(4)
|
||||
if(!src)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
do_area_burn(T, 0.5)
|
||||
animate(src, color = "#FFDF80", time = 5)
|
||||
sleep(5)
|
||||
if(!src)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
do_area_burn(T, 1)
|
||||
animate(src, color = "#FFFDF4", time = 6)
|
||||
sleep(6)
|
||||
if(!src)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
do_area_burn(T, 1.5)
|
||||
new /obj/effect/hotspot(T)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/rune/blood_boil/proc/do_area_burn(turf/T, multiplier)
|
||||
set_light(6, 1, color)
|
||||
for(var/mob/living/L in viewers(T))
|
||||
if(!iscultist(L) && L.blood_volume)
|
||||
var/obj/item/weapon/nullrod/N = L.null_rod_check()
|
||||
@@ -888,7 +884,8 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
cultist_desc = "manifests a spirit as a servant of the Geometer. The invoker must not move from atop the rune, and will take damage for each summoned spirit."
|
||||
invocation = "Gal'h'rfikk harfrandid mud'gib!" //how the fuck do you pronounce this
|
||||
icon_state = "6"
|
||||
construct_invoke = 0
|
||||
invoke_damage = 10
|
||||
construct_invoke = FALSE
|
||||
color = RUNE_COLOR_MEDIUMRED
|
||||
var/ghost_limit = 5
|
||||
var/ghosts = 0
|
||||
@@ -939,7 +936,6 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
..()
|
||||
ghosts++
|
||||
playsound(src, 'sound/magic/exit_blood.ogg', 50, 1)
|
||||
user.apply_damage(10, BRUTE)
|
||||
visible_message("<span class='warning'>A cloud of red mist forms above [src], and from within steps... a [new_human.gender == FEMALE ? "wo":""]man.</span>")
|
||||
to_chat(user, "<span class='cultitalic'>Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...</span>")
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/datum/game_mode/extended
|
||||
name = "secret extended"
|
||||
config_tag = "secret extended"
|
||||
config_tag = "secret_extended"
|
||||
required_players = 0
|
||||
|
||||
announce_span = "notice"
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
diff a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm (rejected hunks)
|
||||
@@ -170,35 +170,35 @@
|
||||
|
||||
gang.message_gangtools("[usr] is attempting to recall the emergency shuttle.")
|
||||
recalling = 1
|
||||
- to_chat(loc, "<span class='info'>\icon[src]Generating shuttle recall order with codes retrieved from last call signal...</span>")
|
||||
+ to_chat(loc, "<span class='info'>[bicon(src)]Generating shuttle recall order with codes retrieved from last call signal...</span>")
|
||||
|
||||
sleep(rand(100,300))
|
||||
|
||||
if(SSshuttle.emergency.mode != SHUTTLE_CALL) //Shuttle can only be recalled when it's moving to the station
|
||||
- to_chat(user, "<span class='warning'>\icon[src]Emergency shuttle cannot be recalled at this time.</span>")
|
||||
+ to_chat(user, "<span class='warning'>[bicon(src)]Emergency shuttle cannot be recalled at this time.</span>")
|
||||
recalling = 0
|
||||
return 0
|
||||
- to_chat(loc, "<span class='info'>\icon[src]Shuttle recall order generated. Accessing station long-range communication arrays...</span>")
|
||||
+ to_chat(loc, "<span class='info'>[bicon(src)]Shuttle recall order generated. Accessing station long-range communication arrays...</span>")
|
||||
|
||||
sleep(rand(100,300))
|
||||
|
||||
if(!gang.dom_attempts)
|
||||
- to_chat(user, "<span class='warning'>\icon[src]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.</span>")
|
||||
+ to_chat(user, "<span class='warning'>[bicon(src)]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.</span>")
|
||||
recalling = 0
|
||||
return 0
|
||||
|
||||
var/turf/userturf = get_turf(user)
|
||||
if(userturf.z != 1) //Shuttle can only be recalled while on station
|
||||
- to_chat(user, "<span class='warning'>\icon[src]Error: Device out of range of station communication arrays.</span>")
|
||||
+ to_chat(user, "<span class='warning'>[bicon(src)]Error: Device out of range of station communication arrays.</span>")
|
||||
recalling = 0
|
||||
return 0
|
||||
var/datum/station_state/end_state = new /datum/station_state()
|
||||
end_state.count()
|
||||
if((100 * start_state.score(end_state)) < 80) //Shuttle cannot be recalled if the station is too damaged
|
||||
- to_chat(user, "<span class='warning'>\icon[src]Error: Station communication systems compromised. Unable to establish connection.</span>")
|
||||
+ to_chat(user, "<span class='warning'>[bicon(src)]Error: Station communication systems compromised. Unable to establish connection.</span>")
|
||||
recalling = 0
|
||||
return 0
|
||||
- to_chat(loc, "<span class='info'>\icon[src]Comm arrays accessed. Broadcasting recall signal...</span>")
|
||||
+ to_chat(loc, "<span class='info'>[bicon(src)]Comm arrays accessed. Broadcasting recall signal...</span>")
|
||||
|
||||
sleep(rand(100,300))
|
||||
|
||||
@@ -210,7 +210,7 @@
|
||||
if(SSshuttle.cancelEvac(user))
|
||||
return 1
|
||||
|
||||
- to_chat(loc, "<span class='info'>\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time.</span>")
|
||||
+ to_chat(loc, "<span class='info'>[bicon(src)]No response recieved. Emergency shuttle cannot be recalled at this time.</span>")
|
||||
return 0
|
||||
|
||||
/obj/item/device/gangtool/proc/can_use(mob/living/carbon/human/user)
|
||||
@@ -42,8 +42,8 @@
|
||||
var/obj/effect/countdown/nuclearbomb/countdown
|
||||
var/static/bomb_set
|
||||
|
||||
/obj/machinery/nuclearbomb/New()
|
||||
..()
|
||||
/obj/machinery/nuclearbomb/Initialize()
|
||||
. = ..()
|
||||
countdown = new(src)
|
||||
GLOB.nuke_list += src
|
||||
core = new /obj/item/nuke_core(src)
|
||||
@@ -81,14 +81,14 @@
|
||||
/obj/machinery/nuclearbomb/syndicate
|
||||
//ui_style = "syndicate" // actually the nuke op bomb is a stole nt bomb
|
||||
|
||||
/obj/machinery/nuclearbomb/syndicate/New()
|
||||
/obj/machinery/nuclearbomb/syndicate/Initialize()
|
||||
. = ..()
|
||||
var/obj/machinery/nuclearbomb/existing = locate("syndienuke")
|
||||
if(existing)
|
||||
qdel(src)
|
||||
throw EXCEPTION("Attempted to spawn a syndicate nuke while one already exists at [existing.loc.x],[existing.loc.y],[existing.loc.z]")
|
||||
return 0
|
||||
tag = "syndienuke"
|
||||
return ..()
|
||||
|
||||
/obj/machinery/nuclearbomb/attackby(obj/item/I, mob/user, params)
|
||||
if (istype(I, /obj/item/weapon/disk/nuclear))
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
diff a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm (rejected hunks)
|
||||
@@ -413,10 +413,10 @@
|
||||
customrecepient.tnote += "<i><b>← From <a href='byond://?src=\ref[customrecepient];choice=Message;target=\ref[src]'>[customsender]</a> ([customjob]):</b></i><br>[custommessage]<br>"
|
||||
if (!customrecepient.silent)
|
||||
playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1)
|
||||
- customrecepient.audible_message("\icon[customrecepient] *[customrecepient.ttone]*", null, 3)
|
||||
+ customrecepient.audible_message("[bicon(customrecepient)] *[customrecepient.ttone]*", null, 3)
|
||||
if( customrecepient.loc && ishuman(customrecepient.loc) )
|
||||
var/mob/living/carbon/human/H = customrecepient.loc
|
||||
- to_chat(H, "\icon[customrecepient] <b>Message from [customsender] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=\ref[src];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)")
|
||||
+ to_chat(H, "[bicon(customrecepient)] <b>Message from [customsender] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=\ref[src];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)")
|
||||
log_pda("[usr]/([usr.ckey]) (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]")
|
||||
customrecepient.cut_overlays()
|
||||
customrecepient.add_overlay(image('icons/obj/pda.dmi', "pda-r"))
|
||||
@@ -426,10 +426,10 @@
|
||||
customrecepient.tnote += "<i><b>← From <a href='byond://?src=\ref[customrecepient];choice=Message;target=\ref[PDARec]'>[PDARec.owner]</a> ([customjob]):</b></i><br>[custommessage]<br>"
|
||||
if (!customrecepient.silent)
|
||||
playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1)
|
||||
- customrecepient.audible_message("\icon[customrecepient] *[customrecepient.ttone]*", null, 3)
|
||||
+ customrecepient.audible_message("[bicon(customrecepient)] *[customrecepient.ttone]*", null, 3)
|
||||
if( customrecepient.loc && ishuman(customrecepient.loc) )
|
||||
var/mob/living/carbon/human/H = customrecepient.loc
|
||||
- to_chat(H, "\icon[customrecepient] <b>Message from [PDARec.owner] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=\ref[customrecepient];choice=Message;skiprefresh=1;target=\ref[PDARec]'>Reply</a>)")
|
||||
+ to_chat(H, "[bicon(customrecepient)] <b>Message from [PDARec.owner] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=\ref[customrecepient];choice=Message;skiprefresh=1;target=\ref[PDARec]'>Reply</a>)")
|
||||
log_pda("[usr]/([usr.ckey]) (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]")
|
||||
customrecepient.cut_overlays()
|
||||
customrecepient.add_overlay(image('icons/obj/pda.dmi', "pda-r"))
|
||||
@@ -1,10 +0,0 @@
|
||||
diff a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm (rejected hunks)
|
||||
@@ -316,7 +316,7 @@
|
||||
// Create a radio headset for the sole purpose of using its icon
|
||||
var/obj/item/device/radio/headset/radio = new
|
||||
|
||||
- var/part_b = "</span><b> \icon[radio]\[[freq_text]\][part_b_extra]</b> <span class='message'>"
|
||||
+ var/part_b = "</span><b> [bicon(radio)]\[[freq_text]\][part_b_extra]</b> <span class='message'>"
|
||||
var/part_c = "</span></span>"
|
||||
|
||||
if (display_freq==SYND_FREQ)
|
||||
@@ -53,6 +53,7 @@
|
||||
var/extended_inventory = 0 //can we access the hidden inventory?
|
||||
var/scan_id = 1
|
||||
var/obj/item/weapon/coin/coin
|
||||
var/obj/item/stack/spacecash/bill
|
||||
|
||||
var/dish_quants = list() //used by the snack machine's custom compartment to count dishes.
|
||||
|
||||
@@ -118,10 +119,9 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/vending/Destroy()
|
||||
qdel(wires)
|
||||
wires = null
|
||||
qdel(coin)
|
||||
coin = null
|
||||
QDEL_NULL(wires)
|
||||
QDEL_NULL(coin)
|
||||
QDEL_NULL(bill)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/vending/snack/Destroy()
|
||||
@@ -311,6 +311,12 @@
|
||||
attack_hand(user)
|
||||
return
|
||||
else if(istype(W, /obj/item/weapon/coin))
|
||||
if(coin)
|
||||
to_chat(user, "<span class='warning'>[src] already has [coin] inserted</span>")
|
||||
return
|
||||
if(bill)
|
||||
to_chat(user, "<span class='warning'>[src] already has [bill] inserted</span>")
|
||||
return
|
||||
if(!premium.len)
|
||||
to_chat(user, "<span class='warning'>[src] doesn't have a coin slot.</span>")
|
||||
return
|
||||
@@ -320,6 +326,21 @@
|
||||
coin = W
|
||||
to_chat(user, "<span class='notice'>You insert [W] into [src].</span>")
|
||||
return
|
||||
else if(istype(W, /obj/item/stack/spacecash))
|
||||
if(coin)
|
||||
to_chat(user, "<span class='warning'>[src] already has [coin] inserted</span>")
|
||||
return
|
||||
if(bill)
|
||||
to_chat(user, "<span class='warning'>[src] already has [bill] inserted</span>")
|
||||
return
|
||||
var/obj/item/stack/S = W
|
||||
if(!premium.len)
|
||||
to_chat(user, "<span class='warning'>[src] doesn't have a bill slot.</span>")
|
||||
return
|
||||
S.use(1)
|
||||
bill = new S.type(src,1)
|
||||
to_chat(user, "<span class='notice'>You insert [W] into [src].</span>")
|
||||
return
|
||||
else if(istype(W, refill_canister) && refill_canister != null)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
to_chat(user, "<span class='notice'>It does nothing.</span>")
|
||||
@@ -386,9 +407,9 @@
|
||||
var/list/display_records = product_records
|
||||
if(extended_inventory)
|
||||
display_records = product_records + hidden_records
|
||||
if(coin)
|
||||
if(coin || bill)
|
||||
display_records = product_records + coin_records
|
||||
if(coin && extended_inventory)
|
||||
if((coin || bill) && extended_inventory)
|
||||
display_records = product_records + hidden_records + coin_records
|
||||
dat += "<ul>"
|
||||
for (var/datum/data/vending_product/R in display_records)
|
||||
@@ -403,11 +424,11 @@
|
||||
dat += "</ul>"
|
||||
dat += "</div>"
|
||||
if(premium.len > 0)
|
||||
dat += "<b>Coin slot:</b> "
|
||||
if (coin)
|
||||
dat += "[coin] <a href='byond://?src=\ref[src];remove_coin=1'>Remove</a>"
|
||||
dat += "<b>Change Return:</b> "
|
||||
if (coin || bill)
|
||||
dat += "[(coin ? coin : "")][(bill ? bill : "")] <a href='byond://?src=\ref[src];remove_coin=1'>Remove</a>"
|
||||
else
|
||||
dat += "<i>No coin</i> <span class='linkOff'>Remove</span>"
|
||||
dat += "<i>No money</i> <span class='linkOff'>Remove</span>"
|
||||
if(istype(src, /obj/machinery/vending/snack))
|
||||
dat += "<h3>Chef's Food Selection</h3>"
|
||||
dat += "<div class='statusDisplay'>"
|
||||
@@ -443,16 +464,24 @@
|
||||
return
|
||||
|
||||
if(href_list["remove_coin"])
|
||||
if(!coin)
|
||||
to_chat(usr, "<span class='notice'>There is no coin in this machine.</span>")
|
||||
if(!(coin || bill))
|
||||
to_chat(usr, "<span class='notice'>There is no money in this machine.</span>")
|
||||
return
|
||||
|
||||
coin.loc = loc
|
||||
if(!usr.get_active_held_item())
|
||||
usr.put_in_hands(coin)
|
||||
to_chat(usr, "<span class='notice'>You remove [coin] from [src].</span>")
|
||||
coin = null
|
||||
|
||||
if(coin)
|
||||
if(!usr.get_active_held_item())
|
||||
usr.put_in_hands(coin)
|
||||
else
|
||||
coin.forceMove(get_turf(src))
|
||||
to_chat(usr, "<span class='notice'>You remove [coin] from [src].</span>")
|
||||
coin = null
|
||||
if(bill)
|
||||
if(!usr.get_active_held_item())
|
||||
usr.put_in_hands(bill)
|
||||
else
|
||||
bill.forceMove(get_turf(src))
|
||||
to_chat(usr, "<span class='notice'>You remove [bill] from [src].</span>")
|
||||
bill = null
|
||||
|
||||
|
||||
usr.set_machine(src)
|
||||
|
||||
@@ -494,26 +523,25 @@
|
||||
vend_ready = 1
|
||||
return
|
||||
else if(R in coin_records)
|
||||
if(!coin)
|
||||
to_chat(usr, "<span class='warning'>You need to insert a coin to get this item!</span>")
|
||||
if(!(coin || bill))
|
||||
to_chat(usr, "<span class='warning'>You need to insert money to get this item!</span>")
|
||||
vend_ready = 1
|
||||
return
|
||||
if(coin.string_attached)
|
||||
if(coin && coin.string_attached)
|
||||
if(prob(50))
|
||||
if(usr.put_in_hands(coin))
|
||||
to_chat(usr, "<span class='notice'>You successfully pull [coin] out before [src] could swallow it.</span>")
|
||||
coin = null
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You couldn't pull [coin] out because your hands are full!</span>")
|
||||
qdel(coin)
|
||||
coin = null
|
||||
QDEL_NULL(coin)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You weren't able to pull [coin] out fast enough, the machine ate it, string and all!</span>")
|
||||
qdel(coin)
|
||||
coin = null
|
||||
QDEL_NULL(coin)
|
||||
else
|
||||
qdel(coin)
|
||||
coin = null
|
||||
QDEL_NULL(coin)
|
||||
QDEL_NULL(bill)
|
||||
|
||||
else if (!(R in product_records))
|
||||
vend_ready = 1
|
||||
message_admins("Vending machine exploit attempted by [key_name(usr, usr.client)]!")
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
var/datum/gas_mixture/cabin_air
|
||||
var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port = null
|
||||
|
||||
var/obj/item/device/radio/radio = null
|
||||
var/obj/item/device/radio/mech/radio
|
||||
var/list/trackers = list()
|
||||
|
||||
var/max_temperature = 25000
|
||||
@@ -117,6 +117,7 @@
|
||||
|
||||
hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD)
|
||||
|
||||
/obj/item/device/radio/mech //this has to go somewhere
|
||||
|
||||
/obj/mecha/Initialize()
|
||||
. = ..()
|
||||
@@ -155,11 +156,9 @@
|
||||
AI = M //AIs are loaded into the mech computer itself. When the mech dies, so does the AI. They can be recovered with an AI card from the wreck.
|
||||
else
|
||||
M.forceMove(loc)
|
||||
|
||||
if(prob(30))
|
||||
explosion(get_turf(loc), 0, 0, 1, 3)
|
||||
|
||||
if(wreckage)
|
||||
if(prob(30))
|
||||
explosion(get_turf(src), 0, 0, 1, 3)
|
||||
var/obj/structure/mecha_wreckage/WR = new wreckage(loc, AI)
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/E in equipment)
|
||||
if(E.salvageable && prob(30))
|
||||
|
||||
@@ -91,32 +91,34 @@
|
||||
/obj/mecha/working/ripley/mining
|
||||
desc = "An old, dusty mining Ripley."
|
||||
name = "\improper APLU \"Miner\""
|
||||
obj_integrity = 75 //Low starting health
|
||||
|
||||
/obj/mecha/working/ripley/mining/New()
|
||||
..()
|
||||
//Attach drill
|
||||
if(prob(25)) //Possible diamond drill... Feeling lucky?
|
||||
var/obj/item/mecha_parts/mecha_equipment/drill/diamonddrill/D = new /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill
|
||||
D.attach(src)
|
||||
else
|
||||
var/obj/item/mecha_parts/mecha_equipment/drill/D = new /obj/item/mecha_parts/mecha_equipment/drill
|
||||
D.attach(src)
|
||||
/obj/mecha/working/ripley/mining/Initialize()
|
||||
. = ..()
|
||||
if(cell)
|
||||
cell.charge = Floor(cell.charge * 0.25) //Starts at very low charge
|
||||
if(prob(70)) //Maybe add a drill
|
||||
if(prob(15)) //Possible diamond drill... Feeling lucky?
|
||||
var/obj/item/mecha_parts/mecha_equipment/drill/diamonddrill/D = new
|
||||
D.attach(src)
|
||||
else
|
||||
var/obj/item/mecha_parts/mecha_equipment/drill/D = new
|
||||
D.attach(src)
|
||||
|
||||
//Add possible plasma cutter
|
||||
if(prob(25))
|
||||
var/obj/item/mecha_parts/mecha_equipment/M = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma
|
||||
else //Add possible plasma cutter if no drill
|
||||
var/obj/item/mecha_parts/mecha_equipment/M = new
|
||||
M.attach(src)
|
||||
|
||||
//Add ore box to cargo
|
||||
cargo.Add(new /obj/structure/ore_box(src))
|
||||
|
||||
//Attach hydraulic clamp
|
||||
var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/HC = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp
|
||||
var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/HC = new
|
||||
HC.attach(src)
|
||||
for(var/obj/item/mecha_parts/mecha_tracking/B in trackers)//Deletes the beacon so it can't be found easily
|
||||
qdel(B)
|
||||
|
||||
var/obj/item/mecha_parts/mecha_equipment/mining_scanner/scanner = new /obj/item/mecha_parts/mecha_equipment/mining_scanner
|
||||
var/obj/item/mecha_parts/mecha_equipment/mining_scanner/scanner = new
|
||||
scanner.attach(src)
|
||||
|
||||
/obj/mecha/working/ripley/Exit(atom/movable/O)
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
/obj/structure/foamedmetal/attack_hand(mob/user)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
|
||||
to_chat(user, "<span class='warning'>You hit the metal foam but bounce off it!</span>")
|
||||
to_chat(user, "<span class='warning'>You hit [src] but bounce off it!</span>")
|
||||
playsound(src.loc, 'sound/weapons/tap.ogg', 100, 1)
|
||||
|
||||
/obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target, height=1.5)
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
item_state = "syringe_kit"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/result_path
|
||||
var/inverse = 0
|
||||
// For inverse dir frames like light fixtures.
|
||||
var/inverse = 0 // For inverse dir frames like light fixtures.
|
||||
var/pixel_shift //The amount of pixels
|
||||
|
||||
/obj/item/wallframe/proc/try_build(turf/on_wall, mob/user)
|
||||
if(get_dist(on_wall,user)>1)
|
||||
@@ -40,6 +40,16 @@
|
||||
ndir = turn(ndir, 180)
|
||||
|
||||
var/obj/O = new result_path(get_turf(user), ndir, TRUE)
|
||||
if(pixel_shift)
|
||||
switch(ndir)
|
||||
if(NORTH)
|
||||
O.pixel_y = pixel_shift
|
||||
if(SOUTH)
|
||||
O.pixel_y = -pixel_shift
|
||||
if(EAST)
|
||||
O.pixel_x = pixel_shift
|
||||
if(WEST)
|
||||
O.pixel_x = -pixel_shift
|
||||
after_attach(O)
|
||||
|
||||
qdel(src)
|
||||
|
||||
@@ -111,11 +111,13 @@
|
||||
/obj/item/device/pda/heads/rd
|
||||
name = "research director PDA"
|
||||
default_cartridge = /obj/item/weapon/cartridge/rd
|
||||
inserted_item = /obj/item/weapon/pen/fountain
|
||||
icon_state = "pda-rd"
|
||||
|
||||
/obj/item/device/pda/captain
|
||||
name = "captain PDA"
|
||||
default_cartridge = /obj/item/weapon/cartridge/captain
|
||||
inserted_item = /obj/item/weapon/pen/fountain/captain
|
||||
icon_state = "pda-captain"
|
||||
detonate = 0
|
||||
|
||||
@@ -127,6 +129,7 @@
|
||||
/obj/item/device/pda/quartermaster
|
||||
name = "quartermaster PDA"
|
||||
default_cartridge = /obj/item/weapon/cartridge/quartermaster
|
||||
inserted_item = /obj/item/weapon/pen/fountain
|
||||
icon_state = "pda-qm"
|
||||
|
||||
/obj/item/device/pda/shaftminer
|
||||
@@ -148,6 +151,7 @@
|
||||
/obj/item/device/pda/lawyer
|
||||
name = "lawyer PDA"
|
||||
default_cartridge = /obj/item/weapon/cartridge/lawyer
|
||||
inserted_item = /obj/item/weapon/pen/fountain
|
||||
icon_state = "pda-lawyer"
|
||||
ttone = "objection"
|
||||
|
||||
@@ -166,6 +170,7 @@
|
||||
icon_state = "pda-library"
|
||||
icon_alert = "pda-r-library"
|
||||
default_cartridge = /obj/item/weapon/cartridge/curator
|
||||
inserted_item = /obj/item/weapon/pen/fountain
|
||||
desc = "A portable microcomputer by Thinktronic Systems, LTD. This model is a WGW-11 series e-reader."
|
||||
note = "Congratulations, your station has chosen the Thinktronic 5290 WGW-11 Series E-reader and Personal Data Assistant!"
|
||||
silent = 1 //Quiet in the library!
|
||||
@@ -184,6 +189,7 @@
|
||||
/obj/item/device/pda/bar
|
||||
name = "bartender PDA"
|
||||
icon_state = "pda-bartender"
|
||||
inserted_item = /obj/item/weapon/pen/fountain
|
||||
|
||||
/obj/item/device/pda/atmos
|
||||
name = "atmospherics PDA"
|
||||
|
||||
@@ -10,15 +10,64 @@
|
||||
var/mob/living/silicon/ai/ai = list()
|
||||
var/last_tick //used to delay the powercheck
|
||||
dog_fashion = null
|
||||
var/unfastened = FALSE
|
||||
|
||||
/obj/item/device/radio/intercom/unscrewed
|
||||
unfastened = TRUE
|
||||
|
||||
/obj/item/device/radio/intercom/Initialize()
|
||||
/obj/item/device/radio/intercom/Initialize(mapload, ndir, building)
|
||||
. = ..()
|
||||
if(building)
|
||||
setDir(ndir)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/device/radio/intercom/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/radio/intercom/examine(mob/user)
|
||||
..()
|
||||
if(!unfastened)
|
||||
to_chat(user, "<span class='notice'>It's <b>screwed</b> and secured to the wall.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>It's <i>unscrewed</i> from the wall, and can be <b>detached</b>.</span>")
|
||||
|
||||
/obj/item/device/radio/intercom/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/weapon/screwdriver))
|
||||
var/obj/item/weapon/screwdriver/S = I
|
||||
if(unfastened)
|
||||
user.visible_message("<span class='notice'>[user] starts tightening [src]'s screws...</span>", "<span class='notice'>You start screwing in [src]...</span>")
|
||||
playsound(src, S.usesound, 50, 1)
|
||||
if(!do_after(user, 30 * S.toolspeed, target = src))
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] tightens [src]'s screws!</span>", "<span class='notice'>You tighten [src]'s screws.</span>")
|
||||
playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
|
||||
unfastened = FALSE
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] starts loosening [src]'s screws...</span>", "<span class='notice'>You start unscrewing [src]...</span>")
|
||||
playsound(src, S.usesound, 50, 1)
|
||||
if(!do_after(user, 60 * S.toolspeed, target = src))
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] loosens [src]'s screws!</span>", "<span class='notice'>You unscrew [src], loosening it from the wall.</span>")
|
||||
playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
|
||||
unfastened = TRUE
|
||||
return
|
||||
else if(istype(I, /obj/item/weapon/wrench))
|
||||
if(!unfastened)
|
||||
to_chat(user, "<span class='warning'>You need to unscrew [src] from the wall first!</span>")
|
||||
return
|
||||
var/obj/item/weapon/wrench/W = I
|
||||
user.visible_message("<span class='notice'>[user] starts unsecuring [src]...</span>", "<span class='notice'>You start unsecuring [src]...</span>")
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
if(!do_after(user, 80 * W.toolspeed, target = src))
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] unsecures [src]!</span>", "<span class='notice'>You detach [src] from the wall.</span>")
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
new/obj/item/wallframe/intercom(get_turf(src))
|
||||
qdel(src)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/device/radio/intercom/attack_ai(mob/user)
|
||||
interact(user)
|
||||
|
||||
@@ -69,3 +118,13 @@
|
||||
|
||||
/obj/item/device/radio/intercom/add_blood(list/blood_dna)
|
||||
return 0
|
||||
|
||||
//Created through the autolathe or through deconstructing intercoms. Can be applied to wall to make a new intercom on it!
|
||||
/obj/item/wallframe/intercom
|
||||
name = "intercom frame"
|
||||
desc = "A ready-to-go intercom. Just slap it on a wall and screw it in!"
|
||||
icon_state = "intercom"
|
||||
result_path = /obj/item/device/radio/intercom/unscrewed
|
||||
pixel_shift = 29
|
||||
inverse = TRUE
|
||||
materials = list(MAT_METAL = 75, MAT_GLASS = 25)
|
||||
|
||||
@@ -197,6 +197,8 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
|
||||
var/obj/item/bodypart/O = H.get_bodypart(picked_def_zone)
|
||||
if(!istype(O))
|
||||
return
|
||||
if(O.status == BODYPART_ROBOTIC)
|
||||
return
|
||||
var/feetCover = (H.wear_suit && H.wear_suit.body_parts_covered & FEET) || (H.w_uniform && H.w_uniform.body_parts_covered & FEET)
|
||||
if(H.shoes || feetCover || H.movement_type & FLYING || H.buckled)
|
||||
return
|
||||
|
||||
@@ -375,7 +375,7 @@ GLOBAL_LIST_INIT(adamantine_recipes, list(
|
||||
GLOBAL_LIST_INIT(abductor_recipes, list ( \
|
||||
/* new/datum/stack_recipe("alien chair", /obj/structure/chair, one_per_turf = 1, on_floor = 1), \ */
|
||||
new/datum/stack_recipe("alien bed", /obj/structure/bed/abductor, 2, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 1, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 2, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("alien table frame", /obj/structure/table_frame/abductor, 1, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("alien airlock assembly", /obj/structure/door_assembly/door_assembly_abductor, 4, time = 20, one_per_turf = 1, on_floor = 1), \
|
||||
null, \
|
||||
|
||||
@@ -148,6 +148,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
|
||||
new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2), \
|
||||
new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\
|
||||
new/datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 50, one_per_turf = 1, on_floor = 1),\
|
||||
new/datum/stack_recipe("wooden crate", /obj/structure/closet/crate/wooden, 6, time = 50, one_per_turf = 1, on_floor = 1),\
|
||||
new/datum/stack_recipe("baseball bat", /obj/item/weapon/melee/baseball_bat, 5, time = 15),\
|
||||
))
|
||||
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
diff a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm (rejected hunks)
|
||||
@@ -86,7 +86,7 @@
|
||||
var/dorm = 0 // determines if this ID has claimed a dorm already
|
||||
|
||||
/obj/item/weapon/card/id/attack_self(mob/user)
|
||||
- user.visible_message("<span class='notice'>[user] shows you: \icon[src] [src.name].</span>", \
|
||||
+ user.visible_message("<span class='notice'>[user] shows you: [bicon(src)] [src.name].</span>", \
|
||||
"<span class='notice'>You show \the [src.name].</span>")
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
@@ -262,7 +262,7 @@
|
||||
|
||||
/obj/item/weapon/nullrod/clown
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "honkrender"
|
||||
icon_state = "clownrender"
|
||||
item_state = "render"
|
||||
name = "clown dagger"
|
||||
desc = "Used for absolutely hilarious sacrifices."
|
||||
|
||||
@@ -62,6 +62,15 @@
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
|
||||
|
||||
/obj/item/weapon/storage/belt/utility/full/engi/PopulateContents()
|
||||
new /obj/item/weapon/screwdriver(src)
|
||||
new /obj/item/weapon/wrench(src)
|
||||
new /obj/item/weapon/weldingtool/largetank(src)
|
||||
new /obj/item/weapon/crowbar(src)
|
||||
new /obj/item/weapon/wirecutters(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
|
||||
|
||||
|
||||
/obj/item/weapon/storage/belt/utility/atmostech/PopulateContents()
|
||||
new /obj/item/weapon/screwdriver(src)
|
||||
|
||||
@@ -879,3 +879,11 @@
|
||||
/obj/item/weapon/storage/box/silver_sulf/PopulateContents()
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
|
||||
|
||||
|
||||
/obj/item/weapon/storage/box/fountainpens
|
||||
name = "box of fountain pens"
|
||||
|
||||
/obj/item/weapon/storage/box/fountainpens/PopulateContents()
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/weapon/pen/fountain(src)
|
||||
@@ -58,7 +58,7 @@
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/clothing/head/welding(src)
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/weapon/weldingtool/largetank(src)
|
||||
new /obj/item/weapon/weldingtool(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/engineering_personal
|
||||
name = "engineer's locker"
|
||||
|
||||
@@ -50,4 +50,28 @@
|
||||
else
|
||||
to_chat(user, "<span class='danger'>Access Denied.</span>")
|
||||
else
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/secure_closet/personal/proc/reset_lock(usr)
|
||||
if (opened && !broken)
|
||||
registered_name = null
|
||||
desc = initial(desc)
|
||||
to_chat(usr,"<span class='danger'>The lock has been reset.")
|
||||
else if(!opened)
|
||||
to_chat(usr,"<span class='danger'>The locker must be open!")
|
||||
else if(broken)
|
||||
to_chat(usr,"<span class='danger'>The lock is broken!")
|
||||
|
||||
/obj/structure/closet/secure_closet/personal/verb/verb_resetlock()
|
||||
set src in oview(1)
|
||||
set category = "Object"
|
||||
set name = "Reset Lock"
|
||||
|
||||
if(!usr.canmove || usr.stat || usr.restrained())
|
||||
return
|
||||
|
||||
if(iscarbon(usr) || issilicon(usr) || isdrone(usr))
|
||||
reset_lock(usr)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>This mob type can't use this verb.</span>")
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
/obj/structure/closet/crate/wooden
|
||||
name = "wooden crate"
|
||||
desc = "Works just as well as a metal one."
|
||||
material_drop = /obj/item/stack/sheet/mineral/wood
|
||||
material_drop_amount = 6
|
||||
icon_state = "wooden"
|
||||
|
||||
/obj/structure/closet/crate/wooden/toy
|
||||
name = "toy box"
|
||||
desc = "It has the words \"Clown + Mime\" written underneath of it with marker."
|
||||
|
||||
/obj/structure/closet/crate/wooden/toy/PopulateContents()
|
||||
. = ..()
|
||||
new /obj/item/device/megaphone/clown(src)
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/soda_cans/canned_laughter(src)
|
||||
new /obj/item/weapon/pneumatic_cannon/pie(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/pie/cream(src)
|
||||
new /obj/item/weapon/storage/crayons(src)
|
||||
@@ -91,6 +91,11 @@
|
||||
icon_state = "[icon_state][rand(1, 6)]"
|
||||
..()
|
||||
|
||||
/obj/structure/flora/tree/jungle/small
|
||||
pixel_y = 0
|
||||
pixel_x = -32
|
||||
icon = 'icons/obj/flora/jungletreesmall.dmi'
|
||||
|
||||
//grass
|
||||
/obj/structure/flora/grass
|
||||
name = "grass"
|
||||
@@ -381,5 +386,5 @@
|
||||
pixel_y = -16
|
||||
|
||||
/obj/structure/flora/rock/pile/largejungle/Initialize()
|
||||
..()
|
||||
icon_state = "[initial(icon_state)][rand(1,3)]"
|
||||
. = ..()
|
||||
icon_state = "[initial(icon_state)][rand(1,3)]"
|
||||
|
||||
@@ -1,21 +1,95 @@
|
||||
#define ENGINE_UNWRENCHED 0
|
||||
#define ENGINE_WRENCHED 1
|
||||
#define ENGINE_WELDED 2
|
||||
#define ENGINE_WELDTIME 200
|
||||
|
||||
/obj/structure/shuttle
|
||||
name = "shuttle"
|
||||
icon = 'icons/turf/shuttle.dmi'
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
obj_integrity = 500
|
||||
max_integrity = 500
|
||||
armor = list(melee = 100, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70) //default + ignores melee
|
||||
|
||||
/obj/structure/shuttle/engine
|
||||
name = "engine"
|
||||
density = 1
|
||||
anchored = 1
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/engine_power = 1
|
||||
var/state = ENGINE_WELDED //welding shmelding
|
||||
|
||||
//Ugh this is a lot of copypasta from emitters, welding need some boilerplate reduction
|
||||
/obj/structure/shuttle/engine/can_be_unfasten_wrench(mob/user, silent)
|
||||
if(state == ENGINE_WELDED)
|
||||
if(!silent)
|
||||
to_chat(user, "<span class='warning'>[src] is welded to the floor!</span>")
|
||||
return FAILED_UNFASTEN
|
||||
return ..()
|
||||
|
||||
/obj/structure/shuttle/engine/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20)
|
||||
. = ..()
|
||||
if(. == SUCCESSFUL_UNFASTEN)
|
||||
if(anchored)
|
||||
state = ENGINE_WRENCHED
|
||||
else
|
||||
state = ENGINE_UNWRENCHED
|
||||
|
||||
/obj/structure/shuttle/engine/attackby(obj/item/I, mob/user, params)
|
||||
add_fingerprint(user)
|
||||
if(default_unfasten_wrench(user, I))
|
||||
return
|
||||
else if(istype(I, /obj/item/weapon/weldingtool))
|
||||
var/obj/item/weapon/weldingtool/WT = I
|
||||
switch(state)
|
||||
if(ENGINE_UNWRENCHED)
|
||||
to_chat(user, "<span class='warning'>The [src.name] needs to be wrenched to the floor!</span>")
|
||||
if(EM_SECURED)
|
||||
if(WT.remove_fuel(0,user))
|
||||
playsound(loc, WT.usesound, 50, 1)
|
||||
user.visible_message("[user.name] starts to weld the [name] to the floor.", \
|
||||
"<span class='notice'>You start to weld \the [src] to the floor...</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
if(do_after(user,ENGINE_WELDTIME*WT.toolspeed, target = src) && WT.isOn())
|
||||
state = ENGINE_WELDED
|
||||
to_chat(user, "<span class='notice'>You weld \the [src] to the floor.</span>")
|
||||
alter_engine_power(engine_power)
|
||||
if(EM_WELDED)
|
||||
if(WT.remove_fuel(0,user))
|
||||
playsound(loc, WT.usesound, 50, 1)
|
||||
user.visible_message("[user.name] starts to cut the [name] free from the floor.", \
|
||||
"<span class='notice'>You start to cut \the [src] free from the floor...</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
if(do_after(user,ENGINE_WELDTIME*WT.toolspeed, target = src) && WT.isOn())
|
||||
state = ENGINE_WRENCHED
|
||||
to_chat(user, "<span class='notice'>You cut \the [src] free from the floor.</span>")
|
||||
alter_engine_power(-engine_power)
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/shuttle/engine/Destroy()
|
||||
if(state == ENGINE_WELDED)
|
||||
alter_engine_power(-engine_power)
|
||||
. = ..()
|
||||
|
||||
//Propagates the change to the shuttle.
|
||||
/obj/structure/shuttle/engine/proc/alter_engine_power(mod)
|
||||
if(mod == 0)
|
||||
return
|
||||
if(SSshuttle.is_in_shuttle_bounds(src))
|
||||
var/obj/docking_port/mobile/M = SSshuttle.get_containing_shuttle(src)
|
||||
if(M)
|
||||
M.alter_engines(mod)
|
||||
|
||||
/obj/structure/shuttle/engine/heater
|
||||
name = "heater"
|
||||
icon_state = "heater"
|
||||
engine_power = 0 // todo make these into 2x1 parts
|
||||
|
||||
/obj/structure/shuttle/engine/platform
|
||||
name = "platform"
|
||||
icon_state = "platform"
|
||||
engine_power = 0
|
||||
|
||||
/obj/structure/shuttle/engine/propulsion
|
||||
name = "propulsion"
|
||||
@@ -25,6 +99,10 @@
|
||||
/obj/structure/shuttle/engine/propulsion/burst
|
||||
name = "burst"
|
||||
|
||||
/obj/structure/shuttle/engine/propulsion/burst/cargo
|
||||
state = ENGINE_UNWRENCHED
|
||||
anchored = FALSE
|
||||
|
||||
/obj/structure/shuttle/engine/propulsion/burst/left
|
||||
name = "left"
|
||||
icon_state = "burst_l"
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
diff a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm (rejected hunks)
|
||||
@@ -46,7 +117,7 @@
|
||||
bound_height = 64
|
||||
appearance_flags = 0
|
||||
|
||||
-obj/structure/shuttle/engine/huge
|
||||
+/obj/structure/shuttle/engine/huge
|
||||
name = "engine"
|
||||
opacity = 1
|
||||
icon = 'icons/obj/3x3.dmi'
|
||||
@@ -116,6 +116,23 @@
|
||||
underlay_appearance.icon_state = "necro1"
|
||||
return TRUE
|
||||
|
||||
/turf/closed/indestructible/riveted/boss
|
||||
name = "stone wall"
|
||||
desc = "A thick, seemingly indestructible stone wall."
|
||||
icon = 'icons/turf/walls/boss_wall.dmi'
|
||||
icon_state = "wall"
|
||||
explosion_block = 50
|
||||
baseturf = /turf/closed/indestructible/riveted/boss
|
||||
|
||||
/turf/closed/indestructible/riveted/boss/hot
|
||||
icon = 'icons/turf/walls/boss_wall_hot.dmi'
|
||||
baseturf = /turf/closed/indestructible/riveted/boss/hot
|
||||
|
||||
/turf/closed/indestructible/riveted/boss/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
|
||||
underlay_appearance.icon = 'icons/turf/floors.dmi'
|
||||
underlay_appearance.icon_state = "basalt"
|
||||
return TRUE
|
||||
|
||||
/turf/closed/indestructible/riveted/hierophant
|
||||
name = "wall"
|
||||
desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern."
|
||||
|
||||
@@ -54,8 +54,16 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The plating is going to need some support! Place metal rods first.</span>")
|
||||
|
||||
/turf/open/chasm/proc/is_safe()
|
||||
//if anything matching this typecache is found in the chasm, we don't drop things
|
||||
var/static/list/chasm_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile))
|
||||
var/list/found_safeties = typecache_filter_list(contents, chasm_safeties_typecache)
|
||||
return LAZYLEN(found_safeties)
|
||||
|
||||
/turf/open/chasm/proc/drop_stuff(AM)
|
||||
. = 0
|
||||
if(is_safe())
|
||||
return FALSE
|
||||
var/thing_to_check = src
|
||||
if(AM)
|
||||
thing_to_check = list(AM)
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
|
||||
/turf/open/floor/plating/lava/proc/is_safe()
|
||||
//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/static/list/lava_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile))
|
||||
var/list/found_safeties = typecache_filter_list(contents, lava_safeties_typecache)
|
||||
return LAZYLEN(found_safeties)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user