mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-22 19:47:22 +01:00
Merge remote-tracking branch 'upstream/master' into updateicons
This commit is contained in:
@@ -1540,13 +1540,13 @@
|
||||
var/helptype = "ADMINHELP"
|
||||
if(is_mhelp)
|
||||
helptype = "MENTORHELP"
|
||||
var/take_msg = "<span class='notice'><b>[helptype]</b>: <b>[key_name(usr.client)]</b> is attending to <b>[key_name(M)]'s</b> question.</span>"
|
||||
var/take_msg = "<span class='notice'><b>[helptype]</b>: <b>[key_name_hidden(usr.client)]</b> is attending to <b>[key_name(M)]'s</b> question.</span>"
|
||||
for(var/client/X in GLOB.admins)
|
||||
if(check_rights(R_ADMIN, 0, X.mob))
|
||||
to_chat(X, take_msg)
|
||||
else if(is_mhelp && check_rights(R_MOD|R_MENTOR, 0, X.mob))
|
||||
to_chat(X, take_msg)
|
||||
to_chat(M, "<span class='notice'><b>Your question is being attended to by [key_name(usr.client, null, 0)]. Thanks for your patience!</b></span>")
|
||||
to_chat(M, "<span class='notice'><b>Your question is being attended to by [key_name_hidden(usr.client, null, 0)]. Thanks for your patience!</b></span>")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Unable to locate mob.</span>")
|
||||
|
||||
|
||||
@@ -193,9 +193,8 @@
|
||||
i.addResponse(src, msg) // Add this response to their open tickets.
|
||||
return
|
||||
|
||||
tickets = SStickets.checkForTicket(C)
|
||||
if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets
|
||||
tickets = SStickets.checkForTicket(C)
|
||||
tickets = SStickets.checkForTicket(src)
|
||||
if(tickets)
|
||||
for(var/datum/admin_ticket/i in tickets)
|
||||
i.addResponse(src, msg)
|
||||
|
||||
@@ -106,7 +106,6 @@ var/global/list/frozen_mob_list = list()
|
||||
M.can_move = 0
|
||||
M.overlays += adminomaly
|
||||
if(M.occupant)
|
||||
M.removeVerb(/obj/mecha/verb/eject)
|
||||
to_chat(M.occupant, "<b><font color= red>You have been frozen by <a href='?priv_msg=[usr.client.UID()]'>[key]</a></b></font>")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] froze [key_name(M.occupant)] in a [M.name]</span>")
|
||||
log_admin("[key_name(usr)] froze [key_name(M.occupant)] in a [M.name]")
|
||||
@@ -117,7 +116,6 @@ var/global/list/frozen_mob_list = list()
|
||||
M.can_move = 1
|
||||
M.overlays -= adminomaly
|
||||
if(M.occupant)
|
||||
M.addVerb(/obj/mecha/verb/eject)
|
||||
to_chat(M.occupant, "<b><font color= red>You have been unfrozen by <a href='?priv_msg=[usr.client.UID()]'>[key]</a></b></font>")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] unfroze [key_name(M.occupant)] in a [M.name]</span>")
|
||||
log_admin("[key_name(usr)] unfroze [key_name(M.occupant)] in a [M.name]")
|
||||
|
||||
@@ -35,7 +35,7 @@ client/proc/one_click_antag()
|
||||
if((M.mind.assigned_role in temp.restricted_jobs) || (M.client.prefs.species in temp.protected_species))
|
||||
return FALSE
|
||||
if(role) // Don't even bother evaluating if there's no role
|
||||
if(player_old_enough_antag(M.client,role) && (role in M.client.prefs.be_special) && (!jobban_isbanned(M, role)))
|
||||
if(player_old_enough_antag(M.client,role) && (role in M.client.prefs.be_special) && !M.client.skip_antag && (!jobban_isbanned(M, role)))
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
@@ -646,8 +646,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
var/atom/A = D
|
||||
var/coords = istype(A) ? "at ([A.x], [A.y], [A.z])" : ""
|
||||
if(alert(src, "Are you sure you want to delete:\n[D]\n[coords]?", "Confirmation", "Yes", "No") == "Yes")
|
||||
log_admin("[key_name(usr)] deleted [D][coords]")
|
||||
message_admins("[key_name_admin(usr)] deleted [D][coords]", 1)
|
||||
log_admin("[key_name(usr)] deleted [D] [coords]")
|
||||
message_admins("[key_name_admin(usr)] deleted [D] [coords]", 1)
|
||||
feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
if(isturf(D))
|
||||
var/turf/T = D
|
||||
|
||||
@@ -9,6 +9,9 @@ var/global/datum/prizes/global_prizes = new
|
||||
prizes += new itempath()
|
||||
|
||||
/datum/prizes/proc/PlaceOrder(var/obj/machinery/prize_counter/prize_counter, var/itemID)
|
||||
if(!prize_counter.Adjacent(usr))
|
||||
to_chat(usr, "<span class='warning'>You need to be closer!</span>")
|
||||
return
|
||||
if(!prize_counter)
|
||||
return 0
|
||||
var/datum/prize_item/item = global_prizes.prizes[itemID]
|
||||
@@ -76,7 +79,7 @@ var/global/datum/prizes/global_prizes = new
|
||||
/datum/prize_item/cards
|
||||
name = "Deck of Cards"
|
||||
desc = "Anyone fancy a game of 52-card Pickup?"
|
||||
typepath = /obj/item/toy/cards/deck
|
||||
typepath = /obj/item/deck/cards
|
||||
cost = 25
|
||||
|
||||
/datum/prize_item/crayons
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
|
||||
var/bomb_name = "bomb" // used for naming bombs / mines
|
||||
|
||||
var/secured = 1
|
||||
var/secured = TRUE
|
||||
var/list/attached_overlays = null
|
||||
var/obj/item/assembly_holder/holder = null
|
||||
var/cooldown = 0 //To prevent spam
|
||||
var/cooldown = FALSE //To prevent spam
|
||||
var/wires = WIRE_RECEIVE | WIRE_PULSE
|
||||
var/datum/wires/connected = null // currently only used by timer/signaler
|
||||
|
||||
@@ -31,10 +31,10 @@
|
||||
/obj/item/assembly/proc/activate() //What the device does when turned on
|
||||
return
|
||||
|
||||
/obj/item/assembly/proc/pulsed(radio = 0) //Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs
|
||||
/obj/item/assembly/proc/pulsed(radio = FALSE) //Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs
|
||||
return
|
||||
|
||||
/obj/item/assembly/proc/pulse(radio = 0) //Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct
|
||||
/obj/item/assembly/proc/pulse(radio = FALSE) //Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct
|
||||
return
|
||||
|
||||
/obj/item/assembly/proc/toggle_secure() //Code that has to happen when the assembly is un\secured goes here
|
||||
@@ -58,10 +58,10 @@
|
||||
/obj/item/assembly/process_cooldown()
|
||||
cooldown--
|
||||
if(cooldown <= 0)
|
||||
return 0
|
||||
return FALSE
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/Destroy()
|
||||
if(istype(loc, /obj/item/assembly_holder) || istype(holder))
|
||||
@@ -73,14 +73,14 @@
|
||||
holder = null
|
||||
return ..()
|
||||
|
||||
/obj/item/assembly/pulsed(radio = 0)
|
||||
/obj/item/assembly/pulsed(radio = FALSE)
|
||||
if(holder && (wires & WIRE_RECEIVE))
|
||||
activate()
|
||||
if(radio && (wires & WIRE_RADIO_RECEIVE))
|
||||
activate()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/pulse(radio = 0)
|
||||
/obj/item/assembly/pulse(radio = FALSE)
|
||||
if(holder && (wires & WIRE_PULSE))
|
||||
holder.process_activation(src, 1, 0)
|
||||
if(holder && (wires & WIRE_PULSE_SPECIAL))
|
||||
@@ -88,15 +88,15 @@
|
||||
if(istype(loc, /obj/item/grenade)) // This is a hack. Todo: Manage this better -Sayu
|
||||
var/obj/item/grenade/G = loc
|
||||
G.prime() // Adios, muchachos
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/activate()
|
||||
if(!secured || (cooldown > 0))
|
||||
return 0
|
||||
if(!secured || cooldown > 0)
|
||||
return FALSE
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/toggle_secure()
|
||||
secured = !secured
|
||||
@@ -107,13 +107,13 @@
|
||||
holder = new /obj/item/assembly_holder(get_turf(src))
|
||||
if(holder.attach(A, src, user))
|
||||
to_chat(user, "<span class='notice'>You attach [A] to [src]!</span>")
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/assembly/attackby(obj/item/W, mob/user, params)
|
||||
if(isassembly(W))
|
||||
var/obj/item/assembly/A = W
|
||||
if((!A.secured) && (!secured))
|
||||
if(!A.secured && !secured)
|
||||
attach_assembly(A, user)
|
||||
return
|
||||
if(isscrewdriver(W))
|
||||
@@ -129,7 +129,7 @@
|
||||
|
||||
/obj/item/assembly/examine(mob/user)
|
||||
..()
|
||||
if((in_range(src, user) || loc == user))
|
||||
if(in_range(src, user) || loc == user)
|
||||
if(secured)
|
||||
to_chat(user, "[src] is ready!")
|
||||
else
|
||||
@@ -140,7 +140,7 @@
|
||||
return
|
||||
user.set_machine(src)
|
||||
interact(user)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/interact(mob/user)
|
||||
return
|
||||
@@ -24,11 +24,11 @@
|
||||
overlays += bombassembly.overlays
|
||||
overlays += "bomb_assembly"
|
||||
|
||||
/obj/item/onetankbomb/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
/obj/item/onetankbomb/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/analyzer))
|
||||
bombtank.attackby(W, user, params)
|
||||
return
|
||||
if(istype(W, /obj/item/wrench) && !status) //This is basically bomb assembly code inverted. apparently it works.
|
||||
if(iswrench(W) && !status) //This is basically bomb assembly code inverted. apparently it works.
|
||||
|
||||
to_chat(user, "<span class='notice'>You disassemble [src].</span>")
|
||||
|
||||
@@ -42,21 +42,23 @@
|
||||
|
||||
qdel(src)
|
||||
return
|
||||
if((istype(W, /obj/item/weldingtool) && W:welding))
|
||||
if(!status)
|
||||
status = 1
|
||||
investigate_log("[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", INVESTIGATE_BOMB)
|
||||
msg_admin_attack("[key_name_admin(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", ATKLOG_FEW)
|
||||
log_game("[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature - T0C]")
|
||||
to_chat(user, "<span class='notice'>A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited.</span>")
|
||||
else
|
||||
status = 0
|
||||
investigate_log("[key_name(user)] unwelded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", INVESTIGATE_BOMB)
|
||||
to_chat(user, "<span class='notice'>The hole has been closed.</span>")
|
||||
if(iswelder(W))
|
||||
var/obj/item/weldingtool/WT = W
|
||||
if(WT.welding)
|
||||
if(!status)
|
||||
status = TRUE
|
||||
investigate_log("[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", INVESTIGATE_BOMB)
|
||||
msg_admin_attack("[key_name_admin(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", ATKLOG_FEW)
|
||||
log_game("[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature - T0C]")
|
||||
to_chat(user, "<span class='notice'>A pressure hole has been bored to [bombtank] valve. [bombtank] can now be ignited.</span>")
|
||||
else
|
||||
status = FALSE
|
||||
investigate_log("[key_name(user)] unwelded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", INVESTIGATE_BOMB)
|
||||
to_chat(user, "<span class='notice'>The hole has been closed.</span>")
|
||||
add_fingerprint(user)
|
||||
..()
|
||||
|
||||
/obj/item/onetankbomb/attack_self(mob/user as mob) //pressing the bomb accesses its assembly
|
||||
/obj/item/onetankbomb/attack_self(mob/user) //pressing the bomb accesses its assembly
|
||||
bombassembly.attack_self(user, 1)
|
||||
add_fingerprint(user)
|
||||
return
|
||||
@@ -71,23 +73,23 @@
|
||||
else
|
||||
bombtank.release()
|
||||
|
||||
/obj/item/onetankbomb/HasProximity(atom/movable/AM as mob|obj)
|
||||
/obj/item/onetankbomb/HasProximity(atom/movable/AM)
|
||||
if(bombassembly)
|
||||
bombassembly.HasProximity(AM)
|
||||
|
||||
/obj/item/onetankbomb/Crossed(atom/movable/AM as mob|obj) //for mousetraps
|
||||
/obj/item/onetankbomb/Crossed(atom/movable/AM) //for mousetraps
|
||||
if(bombassembly)
|
||||
bombassembly.Crossed(AM)
|
||||
|
||||
/obj/item/onetankbomb/on_found(mob/finder as mob) //for mousetraps
|
||||
/obj/item/onetankbomb/on_found(mob/finder) //for mousetraps
|
||||
if(bombassembly)
|
||||
bombassembly.on_found(finder)
|
||||
|
||||
/obj/item/onetankbomb/hear_talk(mob/living/M as mob, msg)
|
||||
/obj/item/onetankbomb/hear_talk(mob/living/M, msg)
|
||||
if(bombassembly)
|
||||
bombassembly.hear_talk(M, msg)
|
||||
|
||||
/obj/item/onetankbomb/hear_message(mob/living/M as mob, msg)
|
||||
/obj/item/onetankbomb/hear_message(mob/living/M, msg)
|
||||
if(bombassembly)
|
||||
bombassembly.hear_message(M, msg)
|
||||
|
||||
|
||||
@@ -4,31 +4,32 @@
|
||||
icon_state = "health"
|
||||
materials = list(MAT_METAL=800, MAT_GLASS=200)
|
||||
origin_tech = "magnets=1;biotech=1"
|
||||
secured = 0
|
||||
secured = FALSE
|
||||
|
||||
var/scanning = 0
|
||||
var/scanning = FALSE
|
||||
var/health_scan
|
||||
var/alarm_health = 0
|
||||
|
||||
|
||||
|
||||
/obj/item/assembly/health/activate()
|
||||
if(!..()) return 0//Cooldown check
|
||||
if(!..())
|
||||
return FALSE//Cooldown check
|
||||
toggle_scan()
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/obj/item/assembly/health/toggle_secure()
|
||||
secured = !secured
|
||||
if(secured && scanning)
|
||||
processing_objects.Add(src)
|
||||
else
|
||||
scanning = 0
|
||||
scanning = FALSE
|
||||
processing_objects.Remove(src)
|
||||
update_icon()
|
||||
return secured
|
||||
|
||||
/obj/item/assembly/health/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/multitool))
|
||||
/obj/item/assembly/health/attackby(obj/item/W, mob/user)
|
||||
if(ismultitool(W))
|
||||
if(alarm_health == 0)
|
||||
alarm_health = -90
|
||||
user.show_message("You toggle [src] to \"detect death\" mode.")
|
||||
@@ -61,7 +62,8 @@
|
||||
return
|
||||
|
||||
/obj/item/assembly/health/proc/toggle_scan()
|
||||
if(!secured) return 0
|
||||
if(!secured)
|
||||
return FALSE
|
||||
scanning = !scanning
|
||||
if(scanning)
|
||||
processing_objects.Add(src)
|
||||
@@ -69,10 +71,10 @@
|
||||
processing_objects.Remove(src)
|
||||
return
|
||||
|
||||
/obj/item/assembly/health/interact(mob/user as mob)//TODO: Change this to the wires thingy
|
||||
/obj/item/assembly/health/interact(mob/user)//TODO: Change this to the wires thingy
|
||||
if(!secured)
|
||||
user.show_message("<span class='warning'>The [name] is unsecured!</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
var/dat = text("<TT><B>Health Sensor</B> <A href='?src=[UID()];scanning=1'>[scanning?"On":"Off"]</A>")
|
||||
if(scanning && health_scan)
|
||||
dat += "<BR>Health: [health_scan]"
|
||||
|
||||
+171
-172
@@ -9,204 +9,203 @@
|
||||
throw_speed = 3
|
||||
throw_range = 10
|
||||
|
||||
var/secured = 0
|
||||
var/secured = FALSE
|
||||
var/obj/item/assembly/a_left = null
|
||||
var/obj/item/assembly/a_right = null
|
||||
|
||||
proc/attach(var/obj/item/D, var/obj/item/D2, var/mob/user)
|
||||
return
|
||||
/obj/item/assembly_holder/proc/attach(obj/item/D, obj/item/D2, mob/user)
|
||||
return
|
||||
|
||||
proc/process_activation(var/obj/item/D)
|
||||
return
|
||||
/obj/item/assembly_holder/proc/process_activation(var/obj/item/D)
|
||||
return
|
||||
|
||||
/obj/item/assembly_holder/IsAssemblyHolder()
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly_holder/Destroy()
|
||||
if(a_left)
|
||||
a_left.holder = null
|
||||
if(a_right)
|
||||
a_right.holder = null
|
||||
return ..()
|
||||
|
||||
IsAssemblyHolder()
|
||||
return 1
|
||||
|
||||
Destroy()
|
||||
if(a_left)
|
||||
a_left.holder = null
|
||||
if(a_right)
|
||||
a_right.holder = null
|
||||
return ..()
|
||||
|
||||
attach(var/obj/item/D, var/obj/item/D2, var/mob/user)
|
||||
if((!D)||(!D2)) return 0
|
||||
if((!isassembly(D))||(!isassembly(D2))) return 0
|
||||
if((D:secured)||(D2:secured)) return 0
|
||||
if(!D.remove_item_from_storage(src))
|
||||
if(user)
|
||||
user.remove_from_mob(D)
|
||||
D.loc = src
|
||||
if(!D2.remove_item_from_storage(src))
|
||||
if(user)
|
||||
user.remove_from_mob(D2)
|
||||
D2.loc = src
|
||||
D:holder = src
|
||||
D2:holder = src
|
||||
a_left = D
|
||||
a_right = D2
|
||||
name = "[D.name]-[D2.name] assembly"
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/assembly_holder/attach(obj/item/D, obj/item/D2, mob/user)
|
||||
if(!D || !D2)
|
||||
return FALSE
|
||||
if(!isassembly(D) || !isassembly(D2))
|
||||
return FALSE
|
||||
var/obj/item/assembly/A1 = D
|
||||
var/obj/item/assembly/A2 = D2
|
||||
if(A1.secured || A2.secured)
|
||||
return FALSE
|
||||
if(!A1.remove_item_from_storage(src))
|
||||
if(user)
|
||||
user.remove_from_mob(A1)
|
||||
A1.loc = src
|
||||
if(!A2.remove_item_from_storage(src))
|
||||
if(user)
|
||||
user.remove_from_mob(A2)
|
||||
A2.loc = src
|
||||
A1.holder = src
|
||||
A2.holder = src
|
||||
a_left = A1
|
||||
a_right = A2
|
||||
name = "[A1.name]-[A2.name] assembly"
|
||||
update_icon()
|
||||
overlays.Cut()
|
||||
if(a_left)
|
||||
overlays += "[a_left.icon_state]_left"
|
||||
for(var/O in a_left.attached_overlays)
|
||||
overlays += "[O]_l"
|
||||
if(a_right)
|
||||
src.overlays += "[a_right.icon_state]_right"
|
||||
for(var/O in a_right.attached_overlays)
|
||||
overlays += "[O]_r"
|
||||
if(master)
|
||||
master.update_icon()
|
||||
return TRUE
|
||||
|
||||
|
||||
examine(mob/user)
|
||||
..(user)
|
||||
if((in_range(src, user) || src.loc == user))
|
||||
if(src.secured)
|
||||
to_chat(user, "\The [src] is ready!")
|
||||
else
|
||||
to_chat(user, "\The [src] can be attached!")
|
||||
/obj/item/assembly_holder/update_icon()
|
||||
overlays.Cut()
|
||||
if(a_left)
|
||||
overlays += "[a_left.icon_state]_left"
|
||||
for(var/O in a_left.attached_overlays)
|
||||
overlays += "[O]_l"
|
||||
if(a_right)
|
||||
overlays += "[a_right.icon_state]_right"
|
||||
for(var/O in a_right.attached_overlays)
|
||||
overlays += "[O]_r"
|
||||
if(master)
|
||||
master.update_icon()
|
||||
|
||||
|
||||
HasProximity(atom/movable/AM as mob|obj)
|
||||
if(a_left)
|
||||
a_left.HasProximity(AM)
|
||||
if(a_right)
|
||||
a_right.HasProximity(AM)
|
||||
/obj/item/assembly_holder/examine(mob/user)
|
||||
..(user)
|
||||
if(in_range(src, user) || loc == user)
|
||||
if(secured)
|
||||
to_chat(user, "[src] is ready!")
|
||||
else
|
||||
to_chat(user, "[src] can be attached!")
|
||||
|
||||
|
||||
Crossed(atom/movable/AM as mob|obj)
|
||||
if(a_left)
|
||||
a_left.Crossed(AM)
|
||||
if(a_right)
|
||||
a_right.Crossed(AM)
|
||||
|
||||
on_found(mob/finder as mob)
|
||||
if(a_left)
|
||||
a_left.on_found(finder)
|
||||
if(a_right)
|
||||
a_right.on_found(finder)
|
||||
/obj/item/assembly_holder/HasProximity(atom/movable/AM)
|
||||
if(a_left)
|
||||
a_left.HasProximity(AM)
|
||||
if(a_right)
|
||||
a_right.HasProximity(AM)
|
||||
|
||||
|
||||
hear_talk(mob/living/M as mob, msg)
|
||||
if(a_left)
|
||||
a_left.hear_talk(M, msg)
|
||||
if(a_right)
|
||||
a_right.hear_talk(M, msg)
|
||||
/obj/item/assembly_holder/Crossed(atom/movable/AM)
|
||||
if(a_left)
|
||||
a_left.Crossed(AM)
|
||||
if(a_right)
|
||||
a_right.Crossed(AM)
|
||||
|
||||
hear_message(mob/living/M as mob, msg)
|
||||
if(a_left)
|
||||
a_left.hear_message(M, msg)
|
||||
if(a_right)
|
||||
a_right.hear_message(M, msg)
|
||||
/obj/item/assembly_holder/on_found(mob/finder)
|
||||
if(a_left)
|
||||
a_left.on_found(finder)
|
||||
if(a_right)
|
||||
a_right.on_found(finder)
|
||||
|
||||
proc/process_movement() // infrared beams and prox sensors
|
||||
if(a_left && a_right)
|
||||
a_left.holder_movement()
|
||||
a_right.holder_movement()
|
||||
|
||||
Move()
|
||||
..()
|
||||
process_movement()
|
||||
/obj/item/assembly_holder/hear_talk(mob/living/M, msg)
|
||||
if(a_left)
|
||||
a_left.hear_talk(M, msg)
|
||||
if(a_right)
|
||||
a_right.hear_talk(M, msg)
|
||||
|
||||
/obj/item/assembly_holder/hear_message(mob/living/M, msg)
|
||||
if(a_left)
|
||||
a_left.hear_message(M, msg)
|
||||
if(a_right)
|
||||
a_right.hear_message(M, msg)
|
||||
|
||||
/obj/item/assembly_holder/proc/process_movement() // infrared beams and prox sensors
|
||||
if(a_left && a_right)
|
||||
a_left.holder_movement()
|
||||
a_right.holder_movement()
|
||||
|
||||
/obj/item/assembly_holder/Move()
|
||||
..()
|
||||
process_movement()
|
||||
return
|
||||
|
||||
/obj/item/assembly_holder/pickup()
|
||||
..()
|
||||
process_movement()
|
||||
|
||||
/obj/item/assembly_holder/Bump()
|
||||
..()
|
||||
process_movement()
|
||||
|
||||
/obj/item/assembly_holder/throw_impact() // called when a throw stops
|
||||
..()
|
||||
process_movement()
|
||||
|
||||
/obj/item/assembly_holder/attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess
|
||||
if(a_left && a_right)
|
||||
a_left.holder_movement()
|
||||
a_right.holder_movement()
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/assembly_holder/attackby(obj/item/W, mob/user, params)
|
||||
if(isscrewdriver(W))
|
||||
if(!a_left || !a_right)
|
||||
to_chat(user, "<span class='warning'>BUG:Assembly part missing, please report this!</span>")
|
||||
return
|
||||
a_left.toggle_secure()
|
||||
a_right.toggle_secure()
|
||||
secured = !secured
|
||||
if(secured)
|
||||
to_chat(user, "<span class='notice'>[src] is ready!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] can now be taken apart!</span>")
|
||||
update_icon()
|
||||
return
|
||||
|
||||
pickup()
|
||||
else
|
||||
..()
|
||||
process_movement()
|
||||
|
||||
Bump()
|
||||
..()
|
||||
process_movement()
|
||||
|
||||
throw_impact() // called when a throw stops
|
||||
..()
|
||||
process_movement()
|
||||
|
||||
attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess
|
||||
if(a_left && a_right)
|
||||
a_left.holder_movement()
|
||||
a_right.holder_movement()
|
||||
..()
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(!a_left || !a_right)
|
||||
to_chat(user, "<span class='warning'>BUG:Assembly part missing, please report this!</span>")
|
||||
return
|
||||
a_left.toggle_secure()
|
||||
a_right.toggle_secure()
|
||||
secured = !secured
|
||||
if(secured)
|
||||
to_chat(user, "<span class='notice'>\The [src] is ready!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>\The [src] can now be taken apart!</span>")
|
||||
update_icon()
|
||||
/obj/item/assembly_holder/attack_self(mob/user)
|
||||
add_fingerprint(user)
|
||||
if(secured)
|
||||
if(!a_left || !a_right)
|
||||
to_chat(user, "<span class='warning'>Assembly part missing!</span>")
|
||||
return
|
||||
if(istype(a_left, a_right.type))//If they are the same type it causes issues due to window code
|
||||
switch(alert("Which side would you like to use?",,"Left","Right"))
|
||||
if("Left")
|
||||
a_left.attack_self(user)
|
||||
if("Right")
|
||||
a_right.attack_self(user)
|
||||
return
|
||||
else
|
||||
..()
|
||||
return
|
||||
a_left.attack_self(user)
|
||||
a_right.attack_self(user)
|
||||
else
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T)
|
||||
return FALSE
|
||||
if(a_left)
|
||||
a_left.holder = null
|
||||
a_left.loc = T
|
||||
if(a_right)
|
||||
a_right.holder = null
|
||||
a_right.loc = T
|
||||
qdel(src)
|
||||
|
||||
|
||||
attack_self(mob/user as mob)
|
||||
src.add_fingerprint(user)
|
||||
if(src.secured)
|
||||
if(!a_left || !a_right)
|
||||
to_chat(user, "<span class='warning'>Assembly part missing!</span>")
|
||||
return
|
||||
if(istype(a_left,a_right.type))//If they are the same type it causes issues due to window code
|
||||
switch(alert("Which side would you like to use?",,"Left","Right"))
|
||||
if("Left") a_left.attack_self(user)
|
||||
if("Right") a_right.attack_self(user)
|
||||
return
|
||||
else
|
||||
a_left.attack_self(user)
|
||||
a_right.attack_self(user)
|
||||
else
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T) return 0
|
||||
if(a_left)
|
||||
a_left:holder = null
|
||||
a_left.loc = T
|
||||
if(a_right)
|
||||
a_right:holder = null
|
||||
a_right.loc = T
|
||||
spawn(0)
|
||||
/obj/item/assembly_holder/process_activation(obj/D, normal = TRUE, special = TRUE)
|
||||
if(!D)
|
||||
return FALSE
|
||||
if(normal && a_right && a_left)
|
||||
if(a_right != D)
|
||||
a_right.pulsed(0)
|
||||
if(a_left != D)
|
||||
a_left.pulsed(0)
|
||||
if(master)
|
||||
master.receive_signal()
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly_holder/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1)
|
||||
qdel(src)
|
||||
if(2)
|
||||
if(prob(50))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
process_activation(var/obj/D, var/normal = 1, var/special = 1)
|
||||
if(!D) return 0
|
||||
if((normal) && (a_right) && (a_left))
|
||||
if(a_right != D)
|
||||
a_right.pulsed(0)
|
||||
if(a_left != D)
|
||||
a_left.pulsed(0)
|
||||
if(master)
|
||||
master.receive_signal()
|
||||
return 1
|
||||
|
||||
|
||||
ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
if(3)
|
||||
if(prob(25))
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if(prob(50))
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
if(prob(25))
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
@@ -17,28 +17,29 @@
|
||||
|
||||
|
||||
/obj/item/assembly/igniter/describe()
|
||||
return "The igniter is [secured?"secured.":"unsecured."]"
|
||||
return "The igniter is [secured ? "secured." : "unsecured."]"
|
||||
|
||||
|
||||
/obj/item/assembly/igniter/activate()
|
||||
if(!..()) return 0//Cooldown check
|
||||
if(!..())
|
||||
return FALSE//Cooldown check
|
||||
var/turf/location = get_turf(loc)
|
||||
if(location) location.hotspot_expose(1000,1000)
|
||||
if(istype(src.loc,/obj/item/assembly_holder))
|
||||
if(istype(src.loc.loc, /obj/structure/reagent_dispensers/fueltank/))
|
||||
var/obj/structure/reagent_dispensers/fueltank/tank = src.loc.loc
|
||||
if(location)
|
||||
location.hotspot_expose(1000,1000)
|
||||
if(istype(loc, /obj/item/assembly_holder))
|
||||
if(istype(loc.loc, /obj/structure/reagent_dispensers/fueltank))
|
||||
var/obj/structure/reagent_dispensers/fueltank/tank = loc.loc
|
||||
if(tank)
|
||||
tank.boom(TRUE)
|
||||
if(istype(src.loc.loc, /obj/item/reagent_containers/glass/beaker/))
|
||||
var/obj/item/reagent_containers/glass/beaker/beakerbomb = src.loc.loc
|
||||
if(istype(loc.loc, /obj/item/reagent_containers/glass/beaker))
|
||||
var/obj/item/reagent_containers/glass/beaker/beakerbomb = loc.loc
|
||||
if(beakerbomb)
|
||||
beakerbomb.heat_beaker()
|
||||
|
||||
sparks.start()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/item/assembly/igniter/attack_self(mob/user as mob)
|
||||
/obj/item/assembly/igniter/attack_self(mob/user)
|
||||
activate()
|
||||
add_fingerprint(user)
|
||||
return
|
||||
|
||||
@@ -7,10 +7,10 @@
|
||||
|
||||
bomb_name = "tripwire mine"
|
||||
|
||||
secured = 0 // toggle_secure()'ed in New() for correct adding to processing_objects, won't work otherwise
|
||||
secured = FALSE // toggle_secure()'ed in New() for correct adding to processing_objects, won't work otherwise
|
||||
dir = EAST
|
||||
var/on = 0
|
||||
var/visible = 1
|
||||
var/on = FALSE
|
||||
var/visible = TRUE
|
||||
var/obj/effect/beam/i_beam/first = null
|
||||
var/obj/effect/beam/i_beam/last = null
|
||||
var/max_nesting_level = 10
|
||||
@@ -33,17 +33,18 @@
|
||||
to_chat(user, describe())
|
||||
|
||||
/obj/item/assembly/infra/activate()
|
||||
if(!..()) return 0//Cooldown check
|
||||
if(!..())
|
||||
return FALSE//Cooldown check
|
||||
on = !on
|
||||
update_icon()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/infra/toggle_secure()
|
||||
secured = !secured
|
||||
if(secured)
|
||||
processing_objects.Add(src)
|
||||
else
|
||||
on = 0
|
||||
on = FALSE
|
||||
if(first)
|
||||
qdel(first)
|
||||
processing_objects.Remove(src)
|
||||
@@ -94,7 +95,7 @@
|
||||
first = I
|
||||
step(I, I.dir)
|
||||
if(first)
|
||||
I.density = 0
|
||||
I.density = FALSE
|
||||
I.vis_spread(visible)
|
||||
I.limit = 8
|
||||
I.process()
|
||||
@@ -110,9 +111,10 @@
|
||||
qdel(first)
|
||||
|
||||
/obj/item/assembly/infra/holder_movement()
|
||||
if(!holder) return 0
|
||||
if(!holder)
|
||||
return FALSE
|
||||
qdel(first)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/infra/equipped(var/mob/user, var/slot)
|
||||
qdel(first)
|
||||
@@ -124,7 +126,7 @@
|
||||
|
||||
/obj/item/assembly/infra/proc/trigger_beam()
|
||||
if(!secured || !on || cooldown > 0)
|
||||
return 0
|
||||
return FALSE
|
||||
pulse(0)
|
||||
audible_message("[bicon(src)] *beep* *beep*", null, 3)
|
||||
if(first)
|
||||
@@ -133,7 +135,7 @@
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
|
||||
/obj/item/assembly/infra/interact(mob/user as mob)//TODO: change this this to the wire control panel
|
||||
/obj/item/assembly/infra/interact(mob/user)//TODO: change this this to the wire control panel
|
||||
if(!secured) return
|
||||
user.set_machine(src)
|
||||
var/dat = {"<TT><B>Infrared Laser</B>
|
||||
@@ -196,7 +198,7 @@
|
||||
arm()
|
||||
|
||||
/obj/item/assembly/infra/armed/stealth
|
||||
visible = 0
|
||||
visible = FALSE
|
||||
|
||||
|
||||
/***************************IBeam*********************************/
|
||||
@@ -209,11 +211,11 @@
|
||||
var/obj/effect/beam/i_beam/previous = null
|
||||
var/obj/item/assembly/infra/master = null
|
||||
var/limit = null
|
||||
var/visible = 0.0
|
||||
var/visible = FALSE
|
||||
var/left = null
|
||||
var/life_cycles = 0
|
||||
var/life_cap = 20
|
||||
anchored = 1.0
|
||||
anchored = TRUE
|
||||
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
|
||||
|
||||
|
||||
@@ -241,9 +243,9 @@
|
||||
if(!(visible))
|
||||
invisibility = 101
|
||||
else
|
||||
invisibility = 0
|
||||
invisibility = FALSE
|
||||
else
|
||||
invisibility = 0
|
||||
invisibility = FALSE
|
||||
|
||||
if(!next && (limit > 0))
|
||||
var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(loc)
|
||||
@@ -255,7 +257,7 @@
|
||||
next = I
|
||||
step(I, I.dir)
|
||||
if(next)
|
||||
I.density = 0
|
||||
I.density = FALSE
|
||||
I.vis_spread(visible)
|
||||
I.limit = limit - 1
|
||||
master.last = I
|
||||
@@ -267,7 +269,7 @@
|
||||
/obj/effect/beam/i_beam/Bumped()
|
||||
hit()
|
||||
|
||||
/obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj)
|
||||
/obj/effect/beam/i_beam/Crossed(atom/movable/AM)
|
||||
if(!isobj(AM) && !isliving(AM))
|
||||
return
|
||||
if(istype(AM, /obj/effect))
|
||||
|
||||
+109
-115
@@ -4,128 +4,122 @@
|
||||
icon_state = "mousetrap"
|
||||
materials = list(MAT_METAL=100)
|
||||
origin_tech = "combat=1;materials=2;engineering=1"
|
||||
var/armed = 0
|
||||
var/armed = FALSE
|
||||
|
||||
bomb_name = "contact mine"
|
||||
|
||||
examine(mob/user)
|
||||
..(user)
|
||||
if(armed)
|
||||
to_chat(user, "It looks like it's armed.")
|
||||
/obj/item/assembly/mousetrap/examine(mob/user)
|
||||
..(user)
|
||||
if(armed)
|
||||
to_chat(user, "It looks like it's armed.")
|
||||
|
||||
activate()
|
||||
if(..())
|
||||
armed = !armed
|
||||
if(!armed)
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/user = usr
|
||||
if(((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50)))
|
||||
to_chat(user, "Your hand slips, setting off the trigger.")
|
||||
pulse(0)
|
||||
update_icon()
|
||||
if(usr)
|
||||
playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
|
||||
|
||||
describe()
|
||||
return "The pressure switch is [armed?"primed":"safe"]."
|
||||
|
||||
update_icon()
|
||||
if(armed)
|
||||
icon_state = "mousetraparmed"
|
||||
else
|
||||
icon_state = "mousetrap"
|
||||
if(holder)
|
||||
holder.update_icon()
|
||||
|
||||
proc/triggered(mob/target as mob, var/type = "feet")
|
||||
if(!armed)
|
||||
return
|
||||
var/obj/item/organ/external/affecting = null
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
switch(type)
|
||||
if("feet")
|
||||
if(!H.shoes)
|
||||
affecting = H.get_organ(pick("l_leg", "r_leg"))
|
||||
H.Weaken(3)
|
||||
if("l_hand", "r_hand")
|
||||
if(!H.gloves)
|
||||
affecting = H.get_organ(type)
|
||||
H.Stun(3)
|
||||
if(affecting)
|
||||
affecting.receive_damage(1, 0)
|
||||
else if(ismouse(target))
|
||||
var/mob/living/simple_animal/mouse/M = target
|
||||
visible_message("<span class='danger'>SPLAT!</span>")
|
||||
M.splat()
|
||||
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
|
||||
layer = MOB_LAYER - 0.2
|
||||
armed = 0
|
||||
update_icon()
|
||||
pulse(0)
|
||||
|
||||
|
||||
attack_self(mob/living/user as mob)
|
||||
if(!armed)
|
||||
to_chat(user, "<span class='notice'>You arm [src].</span>")
|
||||
else
|
||||
if(((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50)))
|
||||
var/which_hand = "l_hand"
|
||||
if(!user.hand)
|
||||
which_hand = "r_hand"
|
||||
triggered(user, which_hand)
|
||||
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking [user.p_their()] fingers.</span>", \
|
||||
"<span class='warning'>You accidentally trigger [src]!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You disarm [src].</span>")
|
||||
/obj/item/assembly/mousetrap/activate()
|
||||
if(..())
|
||||
armed = !armed
|
||||
update_icon()
|
||||
playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
|
||||
|
||||
|
||||
attack_hand(mob/living/user as mob)
|
||||
if(armed)
|
||||
if(((user.getBrainLoss() >= 60 || CLUMSY in user.mutations)) && prob(50))
|
||||
var/which_hand = "l_hand"
|
||||
if(!user.hand)
|
||||
which_hand = "r_hand"
|
||||
triggered(user, which_hand)
|
||||
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking [user.p_their()] fingers.</span>", \
|
||||
"<span class='warning'>You accidentally trigger [src]!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
Crossed(var/atom/movable/AM as mob|obj)
|
||||
if(armed)
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/H = AM
|
||||
if(H.m_intent == MOVE_INTENT_RUN)
|
||||
triggered(H)
|
||||
H.visible_message("<span class='warning'>[H] accidentally steps on [src].</span>", \
|
||||
"<span class='warning'>You accidentally step on [src]</span>")
|
||||
else if(ismouse(AM))
|
||||
triggered(AM)
|
||||
else if(AM.density) // For mousetrap grenades, set off by anything heavy
|
||||
triggered(AM)
|
||||
..()
|
||||
|
||||
|
||||
on_found(mob/finder as mob)
|
||||
if(armed)
|
||||
finder.visible_message("<span class='warning'>[finder] accidentally sets off [src], breaking [finder.p_their()] fingers.</span>", \
|
||||
"<span class='warning'>You accidentally trigger [src]!</span>")
|
||||
triggered(finder, finder.hand ? "l_hand" : "r_hand")
|
||||
return 1 //end the search!
|
||||
return 0
|
||||
|
||||
|
||||
hitby(A as mob|obj)
|
||||
if(!armed)
|
||||
return ..()
|
||||
visible_message("<span class='warning'>[src] is triggered by [A].</span>")
|
||||
triggered(null)
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/user = usr
|
||||
if((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50))
|
||||
to_chat(user, "Your hand slips, setting off the trigger.")
|
||||
pulse(0)
|
||||
update_icon()
|
||||
if(usr)
|
||||
playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
|
||||
|
||||
/obj/item/assembly/mousetrap/describe()
|
||||
return "The pressure switch is [armed ? "primed" : "safe"]."
|
||||
|
||||
/obj/item/assembly/mousetrap/update_icon()
|
||||
if(armed)
|
||||
icon_state = "mousetraparmed"
|
||||
else
|
||||
icon_state = "mousetrap"
|
||||
if(holder)
|
||||
holder.update_icon()
|
||||
|
||||
/obj/item/assembly/mousetrap/proc/triggered(mob/target, var/type = "feet")
|
||||
if(!armed)
|
||||
return
|
||||
var/obj/item/organ/external/affecting = null
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
switch(type)
|
||||
if("feet")
|
||||
if(!H.shoes)
|
||||
affecting = H.get_organ(pick("l_leg", "r_leg"))
|
||||
H.Weaken(3)
|
||||
if("l_hand", "r_hand")
|
||||
if(!H.gloves)
|
||||
affecting = H.get_organ(type)
|
||||
H.Stun(3)
|
||||
if(affecting)
|
||||
affecting.receive_damage(1, 0)
|
||||
else if(ismouse(target))
|
||||
var/mob/living/simple_animal/mouse/M = target
|
||||
visible_message("<span class='danger'>SPLAT!</span>")
|
||||
M.splat()
|
||||
playsound(loc, 'sound/effects/snap.ogg', 50, 1)
|
||||
layer = MOB_LAYER - 0.2
|
||||
armed = FALSE
|
||||
update_icon()
|
||||
pulse(0)
|
||||
|
||||
/obj/item/assembly/mousetrap/attack_self(mob/living/user)
|
||||
if(!armed)
|
||||
to_chat(user, "<span class='notice'>You arm [src].</span>")
|
||||
else
|
||||
if((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50))
|
||||
var/which_hand = "l_hand"
|
||||
if(!user.hand)
|
||||
which_hand = "r_hand"
|
||||
triggered(user, which_hand)
|
||||
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking [user.p_their()] fingers.</span>", \
|
||||
"<span class='warning'>You accidentally trigger [src]!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You disarm [src].</span>")
|
||||
armed = !armed
|
||||
update_icon()
|
||||
playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
|
||||
|
||||
/obj/item/assembly/mousetrap/attack_hand(mob/living/user)
|
||||
if(armed)
|
||||
if((user.getBrainLoss() >= 60 || CLUMSY in user.mutations) && prob(50))
|
||||
var/which_hand = "l_hand"
|
||||
if(!user.hand)
|
||||
which_hand = "r_hand"
|
||||
triggered(user, which_hand)
|
||||
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking [user.p_their()] fingers.</span>", \
|
||||
"<span class='warning'>You accidentally trigger [src]!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/assembly/mousetrap/Crossed(atom/movable/AM)
|
||||
if(armed)
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/H = AM
|
||||
if(H.m_intent == MOVE_INTENT_RUN)
|
||||
triggered(H)
|
||||
H.visible_message("<span class='warning'>[H] accidentally steps on [src].</span>", \
|
||||
"<span class='warning'>You accidentally step on [src]</span>")
|
||||
else if(ismouse(AM))
|
||||
triggered(AM)
|
||||
else if(AM.density) // For mousetrap grenades, set off by anything heavy
|
||||
triggered(AM)
|
||||
..()
|
||||
|
||||
/obj/item/assembly/mousetrap/on_found(mob/finder)
|
||||
if(armed)
|
||||
finder.visible_message("<span class='warning'>[finder] accidentally sets off [src], breaking [finder.p_their()] fingers.</span>", \
|
||||
"<span class='warning'>You accidentally trigger [src]!</span>")
|
||||
triggered(finder, finder.hand ? "l_hand" : "r_hand")
|
||||
return TRUE //end the search!
|
||||
return FALSE
|
||||
|
||||
/obj/item/assembly/mousetrap/hitby(atom/movable/A)
|
||||
if(!armed)
|
||||
return ..()
|
||||
visible_message("<span class='warning'>[src] is triggered by [A].</span>")
|
||||
triggered(null)
|
||||
|
||||
/obj/item/assembly/mousetrap/armed
|
||||
icon_state = "mousetraparmed"
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
return "The proximity sensor is [scanning ? "armed" : "disarmed"]."
|
||||
|
||||
/obj/item/assembly/prox_sensor/activate()
|
||||
if(!..())
|
||||
return 0 //Cooldown check
|
||||
if(!..())
|
||||
return FALSE //Cooldown check
|
||||
timing = !timing
|
||||
update_icon()
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/obj/item/assembly/prox_sensor/toggle_secure()
|
||||
secured = !secured
|
||||
@@ -39,14 +39,14 @@
|
||||
/obj/item/assembly/prox_sensor/HasProximity(atom/movable/AM)
|
||||
if(!isobj(AM) && !isliving(AM))
|
||||
return
|
||||
if(istype(AM, /obj/effect))
|
||||
if(istype(AM, /obj/effect))
|
||||
return
|
||||
if(AM.move_speed < 12)
|
||||
sense()
|
||||
|
||||
/obj/item/assembly/prox_sensor/proc/sense()
|
||||
if((!secured)||(!scanning)||(cooldown > 0))
|
||||
return 0
|
||||
if(!secured || !scanning || cooldown > 0)
|
||||
return FALSE
|
||||
pulse(0)
|
||||
visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
|
||||
cooldown = 2
|
||||
@@ -69,7 +69,7 @@
|
||||
|
||||
/obj/item/assembly/prox_sensor/proc/toggle_scan()
|
||||
if(!secured)
|
||||
return 0
|
||||
return FALSE
|
||||
scanning = !scanning
|
||||
update_icon()
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
/obj/item/assembly/prox_sensor/interact(mob/user)//TODO: Change this to the wires thingy
|
||||
if(!secured)
|
||||
user.show_message("<span class='warning'>The [name] is unsecured!</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
var/second = time % 60
|
||||
var/minute = (time - second) / 60
|
||||
var/dat = text("<TT><B>Proximity Sensor</B>\n[] []:[]\n<A href='?src=[UID()];tp=-30'>-</A> <A href='?src=[UID()];tp=-1'>-</A> <A href='?src=[UID()];tp=1'>+</A> <A href='?src=[UID()];tp=30'>+</A>\n</TT>", (timing ? "<A href='?src=[UID()];time=0'>Arming</A>" : "<A href='?src=[UID()];time=1'>Not Arming</A>"), minute, second)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE
|
||||
|
||||
secured = 1
|
||||
var/receiving = 0
|
||||
var/receiving = FALSE
|
||||
|
||||
bomb_name = "remote-control bomb"
|
||||
|
||||
@@ -35,28 +35,25 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/assembly/signaler/describe()
|
||||
return "\The [src]'s power light is [receiving?"on":"off"]"
|
||||
return "[src]'s power light is [receiving ? "on" : "off"]"
|
||||
|
||||
/obj/item/assembly/signaler/activate()
|
||||
if(cooldown > 0) return 0
|
||||
if(cooldown > 0)
|
||||
return FALSE
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
|
||||
signal()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/signaler/update_icon()
|
||||
if(holder)
|
||||
holder.update_icon()
|
||||
return
|
||||
|
||||
/obj/item/assembly/signaler/interact(mob/user as mob, flag1)
|
||||
/obj/item/assembly/signaler/interact(mob/user, flag1)
|
||||
var/t1 = "-------"
|
||||
// if((src.b_stat && !( flag1 )))
|
||||
// t1 = text("-------<BR>\nGreen Wire: []<BR>\nRed Wire: []<BR>\nBlue Wire: []<BR>\n", (src.wires & 4 ? "<A href='?src=[UID()];wires=4'>Cut Wire</A>" : "<A href='?src=[UID()];wires=4'>Mend Wire</A>"), (src.wires & 2 ? "<A href='?src=[UID()];wires=2'>Cut Wire</A>" : "<A href='?src=[UID()];wires=2'>Mend Wire</A>"), (src.wires & 1 ? "<A href='?src=[UID()];wires=1'>Cut Wire</A>" : "<A href='?src=[UID()];wires=1'>Mend Wire</A>"))
|
||||
// else
|
||||
// t1 = "-------" Speaker: [src.listening ? "<A href='byond://?src=[UID()];listen=0'>Engaged</A>" : "<A href='byond://?src=[UID()];listen=1'>Disengaged</A>"]<BR>
|
||||
var/dat = {"
|
||||
<TT>
|
||||
"}
|
||||
@@ -70,14 +67,14 @@
|
||||
Frequency:
|
||||
<A href='byond://?src=[UID()];freq=-10'>-</A>
|
||||
<A href='byond://?src=[UID()];freq=-2'>-</A>
|
||||
[format_frequency(src.frequency)]
|
||||
[format_frequency(frequency)]
|
||||
<A href='byond://?src=[UID()];freq=2'>+</A>
|
||||
<A href='byond://?src=[UID()];freq=10'>+</A><BR>
|
||||
|
||||
Code:
|
||||
<A href='byond://?src=[UID()];code=-5'>-</A>
|
||||
<A href='byond://?src=[UID()];code=-1'>-</A>
|
||||
[src.code]
|
||||
[code]
|
||||
<A href='byond://?src=[UID()];code=1'>+</A>
|
||||
<A href='byond://?src=[UID()];code=5'>+</A><BR>
|
||||
[t1]
|
||||
@@ -87,8 +84,6 @@
|
||||
popup.set_content(dat)
|
||||
popup.open(0)
|
||||
onclose(user, "radio")
|
||||
return
|
||||
|
||||
|
||||
/obj/item/assembly/signaler/Topic(href, href_list)
|
||||
..()
|
||||
@@ -105,10 +100,10 @@
|
||||
set_frequency(new_frequency)
|
||||
|
||||
if(href_list["code"])
|
||||
src.code += text2num(href_list["code"])
|
||||
src.code = round(src.code)
|
||||
src.code = min(100, src.code)
|
||||
src.code = max(1, src.code)
|
||||
code += text2num(href_list["code"])
|
||||
code = round(code)
|
||||
code = min(100, code)
|
||||
code = max(1, code)
|
||||
if(href_list["receive"])
|
||||
receiving = !receiving
|
||||
|
||||
@@ -119,10 +114,9 @@
|
||||
if(usr)
|
||||
attack_self(usr)
|
||||
|
||||
return
|
||||
|
||||
/obj/item/assembly/signaler/proc/signal()
|
||||
if(!radio_connection) return
|
||||
if(!radio_connection)
|
||||
return
|
||||
|
||||
var/datum/signal/signal = new
|
||||
signal.source = src
|
||||
@@ -135,27 +129,25 @@
|
||||
if(usr)
|
||||
lastsignalers.Add("[time] <B>:</B> [usr.key] used [src] @ location ([T.x],[T.y],[T.z]) <B>:</B> [format_frequency(frequency)]/[code]")
|
||||
|
||||
return
|
||||
|
||||
/obj/item/assembly/signaler/pulse(var/radio = 0)
|
||||
if(src.connected && src.wires)
|
||||
/obj/item/assembly/signaler/pulse(var/radio = FALSE)
|
||||
if(connected && wires)
|
||||
connected.Pulse(src)
|
||||
else
|
||||
return ..(radio)
|
||||
|
||||
/obj/item/assembly/signaler/receive_signal(datum/signal/signal)
|
||||
if( !receiving || !signal )
|
||||
return 0
|
||||
if(!receiving || !signal)
|
||||
return FALSE
|
||||
|
||||
if(signal.encryption != code)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0
|
||||
if(!(wires & WIRE_RADIO_RECEIVE))
|
||||
return FALSE
|
||||
pulse(1)
|
||||
|
||||
for(var/mob/O in hearers(1, src.loc))
|
||||
for(var/mob/O in hearers(1, loc))
|
||||
O.show_message("[bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2)
|
||||
return
|
||||
|
||||
/obj/item/assembly/signaler/proc/set_frequency(new_frequency)
|
||||
if(!radio_controller)
|
||||
@@ -165,7 +157,6 @@
|
||||
radio_controller.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
|
||||
return
|
||||
|
||||
// Embedded signaller used in anomalies.
|
||||
/obj/item/assembly/signaler/anomaly
|
||||
@@ -173,7 +164,7 @@
|
||||
desc = "The neutralized core of an anomaly. It'd probably be valuable for research."
|
||||
icon_state = "anomaly core"
|
||||
item_state = "electronic"
|
||||
receiving = 1
|
||||
receiving = TRUE
|
||||
|
||||
/obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal)
|
||||
..()
|
||||
|
||||
+105
-118
@@ -5,136 +5,123 @@
|
||||
materials = list(MAT_METAL=500, MAT_GLASS=50)
|
||||
origin_tech = "magnets=1;engineering=1"
|
||||
|
||||
secured = 0
|
||||
secured = FALSE
|
||||
|
||||
bomb_name = "time bomb"
|
||||
|
||||
var/timing = 0
|
||||
var/timing = FALSE
|
||||
var/time = 10
|
||||
var/repeat = 0
|
||||
var/repeat = FALSE
|
||||
var/set_time = 10
|
||||
|
||||
proc
|
||||
timer_end()
|
||||
|
||||
describe()
|
||||
if(timing)
|
||||
return "The timer is counting down from [time]!"
|
||||
return "The timer is set for [time] seconds."
|
||||
|
||||
activate()
|
||||
if(!..()) return 0//Cooldown check
|
||||
timing = !timing
|
||||
update_icon()
|
||||
return 0
|
||||
|
||||
|
||||
toggle_secure()
|
||||
secured = !secured
|
||||
if(secured)
|
||||
processing_objects.Add(src)
|
||||
else
|
||||
timing = 0
|
||||
processing_objects.Remove(src)
|
||||
update_icon()
|
||||
return secured
|
||||
|
||||
|
||||
timer_end()
|
||||
if((!secured)||(cooldown > 0)) return 0
|
||||
pulse(0)
|
||||
if(loc)
|
||||
loc.visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
return
|
||||
|
||||
|
||||
process()
|
||||
if(timing && (time > 0))
|
||||
time -= 2 // 2 seconds per process()
|
||||
if(timing && time <= 0)
|
||||
timing = repeat
|
||||
timer_end()
|
||||
time = set_time
|
||||
return
|
||||
|
||||
/obj/item/assembly/timer/describe()
|
||||
if(timing)
|
||||
return "The timer is counting down from [time]!"
|
||||
return "The timer is set for [time] seconds."
|
||||
|
||||
/obj/item/assembly/timer/activate()
|
||||
if(!..())
|
||||
return FALSE//Cooldown check
|
||||
timing = !timing
|
||||
update_icon()
|
||||
overlays.Cut()
|
||||
attached_overlays = list()
|
||||
if(timing)
|
||||
overlays += "timer_timing"
|
||||
attached_overlays += "timer_timing"
|
||||
if(holder)
|
||||
holder.update_icon()
|
||||
return FALSE
|
||||
|
||||
/obj/item/assembly/timer/toggle_secure()
|
||||
secured = !secured
|
||||
if(secured)
|
||||
processing_objects.Add(src)
|
||||
else
|
||||
timing = FALSE
|
||||
processing_objects.Remove(src)
|
||||
update_icon()
|
||||
return secured
|
||||
|
||||
/obj/item/assembly/timer/proc/timer_end()
|
||||
if(!secured || cooldown > 0)
|
||||
return FALSE
|
||||
pulse(0)
|
||||
if(loc)
|
||||
loc.visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
|
||||
/obj/item/assembly/timer/process()
|
||||
if(timing && (time > 0))
|
||||
time -= 2 // 2 seconds per process()
|
||||
if(timing && time <= 0)
|
||||
timing = repeat
|
||||
timer_end()
|
||||
time = set_time
|
||||
|
||||
/obj/item/assembly/timer/update_icon()
|
||||
overlays.Cut()
|
||||
attached_overlays = list()
|
||||
if(timing)
|
||||
overlays += "timer_timing"
|
||||
attached_overlays += "timer_timing"
|
||||
if(holder)
|
||||
holder.update_icon()
|
||||
|
||||
/obj/item/assembly/timer/interact(mob/user as mob)//TODO: Have this use the wires
|
||||
if(!secured)
|
||||
user.show_message("<span class='warning'>The [name] is unsecured!</span>")
|
||||
return FALSE
|
||||
var/second = time % 60
|
||||
var/minute = (time - second) / 60
|
||||
var/set_second = set_time % 60
|
||||
var/set_minute = (set_time - set_second) / 60
|
||||
if(second < 10) second = "0[second]"
|
||||
if(set_second < 10) set_second = "0[set_second]"
|
||||
|
||||
var/dat = {"
|
||||
<TT>
|
||||
<center><h2>Timing Unit</h2>
|
||||
[minute]:[second] <a href='?src=[UID()];time=1'>[timing?"Stop":"Start"]</a> <a href='?src=[UID()];reset=1'>Reset</a><br>
|
||||
Repeat: <a href='?src=[UID()];repeat=1'>[repeat?"On":"Off"]</a><br>
|
||||
Timer set for
|
||||
<A href='?src=[UID()];tp=-30'>-</A> <A href='?src=[UID()];tp=-1'>-</A> [set_minute]:[set_second] <A href='?src=[UID()];tp=1'>+</A> <A href='?src=[UID()];tp=30'>+</A>
|
||||
</center>
|
||||
</TT>
|
||||
<BR><BR>
|
||||
<A href='?src=[UID()];refresh=1'>Refresh</A>
|
||||
<BR><BR>
|
||||
<A href='?src=[UID()];close=1'>Close</A>"}
|
||||
var/datum/browser/popup = new(user, "timer", name, 400, 400)
|
||||
popup.set_content(dat)
|
||||
popup.open(0)
|
||||
onclose(user, "timer")
|
||||
|
||||
/obj/item/assembly/timer/Topic(href, href_list)
|
||||
..()
|
||||
if(usr.incapacitated() || !in_range(loc, usr))
|
||||
usr << browse(null, "window=timer")
|
||||
onclose(usr, "timer")
|
||||
return
|
||||
|
||||
if(href_list["time"])
|
||||
timing = !timing
|
||||
if(timing && istype(holder, /obj/item/transfer_valve))
|
||||
message_admins("[key_name_admin(usr)] activated [src] attachment on [holder].")
|
||||
investigate_log("[key_name(usr)] activated [src] attachment for [loc]", INVESTIGATE_BOMB)
|
||||
log_game("[key_name(usr)] activated [src] attachment for [loc]")
|
||||
update_icon()
|
||||
if(href_list["reset"])
|
||||
time = set_time
|
||||
|
||||
interact(mob/user as mob)//TODO: Have this use the wires
|
||||
if(!secured)
|
||||
user.show_message("<span class='warning'>The [name] is unsecured!</span>")
|
||||
return 0
|
||||
var/second = time % 60
|
||||
var/minute = (time - second) / 60
|
||||
var/set_second = set_time % 60
|
||||
var/set_minute = (set_time - set_second) / 60
|
||||
if(second < 10) second = "0[second]"
|
||||
if(set_second < 10) set_second = "0[set_second]"
|
||||
if(href_list["repeat"])
|
||||
repeat = !repeat
|
||||
|
||||
var/dat = {"
|
||||
<TT>
|
||||
<center><h2>Timing Unit</h2>
|
||||
[minute]:[second] <a href='?src=[UID()];time=1'>[timing?"Stop":"Start"]</a> <a href='?src=[UID()];reset=1'>Reset</a><br>
|
||||
Repeat: <a href='?src=[UID()];repeat=1'>[repeat?"On":"Off"]</a><br>
|
||||
Timer set for
|
||||
<A href='?src=[UID()];tp=-30'>-</A> <A href='?src=[UID()];tp=-1'>-</A> [set_minute]:[set_second] <A href='?src=[UID()];tp=1'>+</A> <A href='?src=[UID()];tp=30'>+</A>
|
||||
</center>
|
||||
</TT>
|
||||
<BR><BR>
|
||||
<A href='?src=[UID()];refresh=1'>Refresh</A>
|
||||
<BR><BR>
|
||||
<A href='?src=[UID()];close=1'>Close</A>"}
|
||||
var/datum/browser/popup = new(user, "timer", name, 400, 400)
|
||||
popup.set_content(dat)
|
||||
popup.open(0)
|
||||
onclose(user, "timer")
|
||||
return
|
||||
|
||||
|
||||
Topic(href, href_list)
|
||||
..()
|
||||
if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
|
||||
usr << browse(null, "window=timer")
|
||||
onclose(usr, "timer")
|
||||
return
|
||||
|
||||
if(href_list["time"])
|
||||
timing = !timing
|
||||
if(timing && istype(holder, /obj/item/transfer_valve))
|
||||
message_admins("[key_name_admin(usr)] activated [src] attachment on [holder].")
|
||||
investigate_log("[key_name(usr)] activated [src] attachment for [loc]", INVESTIGATE_BOMB)
|
||||
log_game("[key_name(usr)] activated [src] attachment for [loc]")
|
||||
update_icon()
|
||||
if(href_list["reset"])
|
||||
if(href_list["tp"])
|
||||
var/tp = text2num(href_list["tp"])
|
||||
set_time += tp
|
||||
set_time = min(max(round(set_time), 6), 600)
|
||||
if(!timing)
|
||||
time = set_time
|
||||
|
||||
if(href_list["repeat"])
|
||||
repeat = !repeat
|
||||
|
||||
if(href_list["tp"])
|
||||
var/tp = text2num(href_list["tp"])
|
||||
set_time += tp
|
||||
set_time = min(max(round(set_time), 6), 600)
|
||||
if(!timing)
|
||||
time = set_time
|
||||
|
||||
if(href_list["close"])
|
||||
usr << browse(null, "window=timer")
|
||||
return
|
||||
|
||||
if(usr)
|
||||
attack_self(usr)
|
||||
|
||||
if(href_list["close"])
|
||||
usr << browse(null, "window=timer")
|
||||
return
|
||||
|
||||
if(usr)
|
||||
attack_self(usr)
|
||||
|
||||
@@ -41,12 +41,13 @@
|
||||
|
||||
|
||||
/obj/item/assembly/voice/attack_self(mob/user)
|
||||
if(!user || !secured) return 0
|
||||
if(!user || !secured)
|
||||
return FALSE
|
||||
|
||||
listening = !listening
|
||||
var/turf/T = get_turf(src)
|
||||
T.visible_message("[bicon(src)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"")
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/item/assembly/voice/toggle_secure()
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
|
||||
/obj/effect/mob_spawn
|
||||
name = "Unknown"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "remains"
|
||||
var/mob_type = null
|
||||
@@ -26,13 +28,12 @@
|
||||
var/datum/disease/disease = null //Do they start with a pre-spawned disease?
|
||||
var/mob_color //Change the mob's color
|
||||
var/assignedrole
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/banType = "lavaland"
|
||||
var/ghost_usable = TRUE
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/attack_ghost(mob/user)
|
||||
if(ticker.current_state != GAME_STATE_PLAYING || !loc)
|
||||
if(ticker.current_state != GAME_STATE_PLAYING || !loc || !ghost_usable)
|
||||
return
|
||||
if(!uses)
|
||||
to_chat(user, "<span class='warning'>This spawner is out of charges!</span>")
|
||||
@@ -40,6 +41,8 @@
|
||||
if(jobban_isbanned(user, banType))
|
||||
to_chat(user, "<span class='warning'>You are jobanned!</span>")
|
||||
return
|
||||
if(QDELETED(src) || QDELETED(user))
|
||||
return
|
||||
var/ghost_role = alert("Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No")
|
||||
if(ghost_role == "No" || !loc)
|
||||
return
|
||||
@@ -50,7 +53,7 @@
|
||||
. = ..()
|
||||
if(instant || roundstart) //at some point we should probably re-introduce the (ticker && ticker.current_state > GAME_STATE_SETTING_UP) portion of this check, but for now it was preventing the corpses from spawning at roundstart and resulting in ghost role spawners that made dead bodies.
|
||||
create()
|
||||
else
|
||||
else if(ghost_usable)
|
||||
GLOB.poi_list |= src
|
||||
LAZYADD(GLOB.mob_spawners[name], src)
|
||||
|
||||
@@ -305,7 +308,7 @@
|
||||
name = "sleeper"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "You are a space doctor!"
|
||||
flavour_text = "<span class='big bold'>You are a space doctor!</span>"
|
||||
assignedrole = "Space Doctor"
|
||||
|
||||
/obj/effect/mob_spawn/human/doctor/alive/equip(mob/living/carbon/human/H)
|
||||
@@ -436,7 +439,7 @@
|
||||
name = "bartender sleeper"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "You are a space bartender!"
|
||||
flavour_text = "<span class='big bold'>You are a space bartender!</span><b> Time to mix drinks and change lives.</b>"
|
||||
assignedrole = "Space Bartender"
|
||||
|
||||
/datum/outfit/spacebartender
|
||||
@@ -556,4 +559,4 @@
|
||||
back = /obj/item/storage/backpack
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/reagent
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/reagent
|
||||
|
||||
@@ -0,0 +1,475 @@
|
||||
// items
|
||||
/obj/item/storage/firstaid/ancient
|
||||
icon_state = "firstaid"
|
||||
desc = "A first aid kit with the ability to heal common types of injuries."
|
||||
|
||||
/obj/item/storage/firstaid/ancient/New()
|
||||
..()
|
||||
new /obj/item/stack/medical/bruise_pack(src)
|
||||
new /obj/item/stack/medical/bruise_pack(src)
|
||||
new /obj/item/stack/medical/bruise_pack(src)
|
||||
new /obj/item/stack/medical/bruise_pack(src)
|
||||
new /obj/item/stack/medical/ointment(src)
|
||||
new /obj/item/stack/medical/ointment(src)
|
||||
new /obj/item/stack/medical/ointment(src)
|
||||
|
||||
/obj/item/card/id/away/old
|
||||
name = "A perfectly retrograde identification card"
|
||||
desc = "A perfectly retrograde identification card. Looks like it could use some flavor."
|
||||
icon = 'icons/obj/card.dmi'
|
||||
icon_state = "retro"
|
||||
access = list(access_away01)
|
||||
|
||||
/obj/item/card/id/away/old/sec
|
||||
name = "Security Officer ID"
|
||||
desc = "A clip on ID Badge, has one of those fancy new magnetic strips built in. This one is encoded for the Security Dept."
|
||||
icon_state = "retro_security"
|
||||
|
||||
/obj/item/card/id/away/old/sci
|
||||
name = "Scientist ID"
|
||||
desc = "A clip on ID Badge, has one of those fancy new magnetic strips built in. This one is encoded for the Science Dept."
|
||||
icon_state = "retro_research"
|
||||
|
||||
/obj/item/card/id/away/old/med
|
||||
name = "Medical ID"
|
||||
desc = "A clip on ID Badge, has one of those fancy new magnetic strips built in. This one is encoded for the Medical Dept."
|
||||
icon_state = "retro_medical"
|
||||
|
||||
/obj/item/card/id/away/old/eng
|
||||
name = "Engineer ID"
|
||||
desc = "A clip on ID Badge, has one of those fancy new magnetic strips built in. This one is encoded for the Engineering Dept."
|
||||
icon_state = "retro_engineering"
|
||||
|
||||
/obj/item/card/id/away/old/apc
|
||||
name = "APC Access ID"
|
||||
desc = "A special ID card that allows access to APC terminals."
|
||||
icon_state = "centcom_old"
|
||||
access = list(access_engine_equip)
|
||||
|
||||
/obj/item/storage/backpack/old
|
||||
max_combined_w_class = 12
|
||||
|
||||
// Equipment
|
||||
/obj/item/clothing/head/helmet/space/nasavoid/old
|
||||
name = "Engineering Void Helmet"
|
||||
desc = "A CentCom engineering dark red space suit helmet. While old and dusty, it still gets the job done."
|
||||
icon_state = "void-red"
|
||||
item_state = "void"
|
||||
|
||||
/obj/item/clothing/suit/space/nasavoid/old
|
||||
name = "Engineering Voidsuit"
|
||||
icon_state = "void-red"
|
||||
item_state = "void"
|
||||
desc = "A CentCom engineering dark red space suit. Age has degraded the suit making is difficult to move around in."
|
||||
slowdown = 4
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/multitool)
|
||||
|
||||
/obj/item/clothing/head/helmet/old
|
||||
name = "degrading helmet"
|
||||
desc = "Standard issue security helmet. Due to degradation the helmet's visor obstructs the users ability to see long distances."
|
||||
tint = 2
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/old
|
||||
name = "degrading armor vest"
|
||||
desc = "Older generation Type 1 armored vest. Due to degradation over time the vest is far less maneuverable to move in."
|
||||
icon_state = "armor"
|
||||
item_state = "armor"
|
||||
slowdown = 1
|
||||
|
||||
/obj/item/gun/energy/laser/retro/old
|
||||
name ="laser gun"
|
||||
icon_state = "retro"
|
||||
desc = "First generation lasergun, developed by Nanotrasen. Suffers from ammo issues but its unique ability to recharge its ammo without the need of a magazine helps compensate. You really hope someone has developed a better lasergun while you were in cryo."
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/lasergun/old)
|
||||
ammo_x_offset = 3
|
||||
|
||||
/obj/item/ammo_casing/energy/lasergun/old
|
||||
projectile_type = /obj/item/projectile/beam/laser
|
||||
e_cost = 200
|
||||
select_name = "kill"
|
||||
|
||||
/obj/item/gun/energy/e_gun/old
|
||||
name = "prototype energy gun"
|
||||
desc = "NT-P:01 Prototype Energy Gun. Early stage development of a unique laser rifle that has multifaceted energy lens allowing the gun to alter the form of projectile it fires on command."
|
||||
icon_state = "protolaser"
|
||||
ammo_x_offset = 2
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/electrode/old)
|
||||
|
||||
/obj/item/ammo_casing/energy/electrode/old
|
||||
e_cost = 1000
|
||||
|
||||
// Papers
|
||||
/obj/item/paper/fluff/ruins/oldstation
|
||||
name = "Cryo Awakening Alert"
|
||||
info = "<B>**WARNING**</B><BR><BR>Catastrophic damage sustained to station. Powernet exhausted to reawaken crew.<BR><BR>Immediate Objectives<br><br>1: Activate emergency power generator<br>2: Lift station lockdown on the bridge<br><br>Please locate the 'Damage Report' on the bridge for a detailed situation report."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/damagereport
|
||||
name = "Damage Report"
|
||||
info = "<b>*Damage Report*</b><br><br><b>Alpha Station</b> - Destroyed<br><br><b>Beta Station</b> - Catastrophic Damage. Medical, destroyed. Atmospherics, partially destroyed. Engine Core, destroyed.<br><br><b>Charlie Station</b> - Intact. Loss of oxygen to eastern side of main corridor.<br><br><b>Delta Station</b> - Intact. <b>WARNING</b>: Unknown force occupying Delta Station. Intent unknown. Species unknown. Numbers unknown.<br><br>Recommendation - Reestablish station powernet via solar array. Reestablish station atmospherics system to restore air."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/protosuit
|
||||
name = "B01-RIG Hardsuit Report"
|
||||
info = "<b>*Prototype Hardsuit*</b><br><br>The B01-RIG Hardsuit is a prototype powered exoskeleton. Based off of a recovered pre-void war era united Earth government powered military \
|
||||
exosuit, the RIG Hardsuit is a breakthrough in Hardsuit technology, and is the first post-void war era Hardsuit that can be safely used by an operator.<br><br>The B01 however suffers \
|
||||
a myriad of constraints. It is slow and bulky to move around, it lacks any significant armor plating against direct attacks and its internal heads up display is unfinished, \
|
||||
resulting in the user being unable to see long distances.<br><br>The B01 is unlikely to see any form of mass production, but will serve as a base for future Hardsuit developments."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/protohealth
|
||||
name = "Health Analyser Report"
|
||||
info = "<b>*Health Analyser*</b><br><br>The portable Health Analyser is essentially a handheld variant of a health analyser. Years of research have concluded with this device which is \
|
||||
capable of diagnosing even the most critical, obscure or technical injuries any humanoid entity is suffering in an easy to understand format that even a non-trained health professional \
|
||||
can understand.<br><br>The health analyser is expected to go into full production as standard issue medical kit."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/protogun
|
||||
name = "K14 Energy Gun Report"
|
||||
info = "<b>*K14-Multiphase Energy Gun*</b><br><br>The K14 Prototype Energy Gun is the first Energy Rifle that has been successfully been able to not only hold a larger ammo charge \
|
||||
than other gun models, but is capable of swapping between different energy projectile types on command with no incidents.<br><br>The weapon still suffers several drawbacks, its alternative, \
|
||||
non laser fire mode, can only fire one round before exhausting the energy cell, the weapon also remains prohibitively expensive, nonetheless NT Market Research fully believe this weapon \
|
||||
will form the backbone of our Energy weapon catalogue.<br><br>The K14 is expected to undergo revision to fix the ammo issues, the K15 is expected to replace the 'stun' setting with a \
|
||||
'disable' setting in an attempt to bypass the ammo issues."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/protosing
|
||||
name = "Singularity Generator"
|
||||
info = "<b>*Singularity Generator*</b><br><br>Modern power generation typically comes in two forms, a Fusion Generator or a Fission Generator. Fusion provides the best space to power \
|
||||
ratio, and is typically seen on military or high security ships and stations, however Fission reactors require the usage of expensive, and rare, materials in its construction.. Fission generators are massive and bulky, and require a large reserve of uranium to power, however they are extremely cheap to operate and oft need little maintenance once \
|
||||
operational.<br><br>The Singularity aims to alter this, a functional Singularity is essentially a controlled Black Hole, a Black Hole that generates far more power than Fusion or Fission \
|
||||
generators can ever hope to produce. "
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/protoinv
|
||||
name = "Laboratory Inventory"
|
||||
info = "<b>*Inventory*</b><br><br>(1) Prototype Hardsuit<br><br>(1)Health Analyser<br><br>(1)Prototype Energy Gun<br><br>(1)Singularity Generation Disk<br><br><b>DO NOT REMOVE WITHOUT \
|
||||
THE CAPTAIN AND RESEARCH DIRECTOR'S AUTHORISATION</b>"
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/report
|
||||
name = "Crew Reawakening Report"
|
||||
info = "Artificial Program's report to surviving crewmembers.<br><br>Crew were placed into cryostasis on March 10th, 2445.<br><br>Crew were awoken from cryostasis around June, 2557.<br><br> \
|
||||
<b>SIGNIFICANT EVENTS OF NOTE</b><br>1: The primary radiation detectors were taken offline after 112 years due to power failure, secondary radiation detectors showed no residual \
|
||||
radiation on station. Deduction, primarily detector was malfunctioning and was producing a radiation signal when there was none.<br><br>2: A data burst from a nearby Nanotrasen Space \
|
||||
Station was received, this data burst contained research data that has been uploaded to our RnD labs.<br><br>3: Unknown invasion force has occupied Delta station."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/generator_manual
|
||||
name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator manual"
|
||||
info = "You can barely make out a faded sentence... <br><br> Wrench down the generator on top of a wire node connected to either a SMES input terminal or the power grid."
|
||||
|
||||
|
||||
//Old Prototype Hardsuit
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ancient
|
||||
name = "prototype RIG hardsuit helmet"
|
||||
desc = "Early prototype RIG hardsuit helmet, designed to quickly shift over a user's head. Design constraints of the helmet mean it has no inbuilt cameras, thus it restricts the users visability."
|
||||
icon_state = "hardsuit0-ancient"
|
||||
item_state = "anc_helm"
|
||||
armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75)
|
||||
item_color = "ancient"
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/ancient
|
||||
name = "prototype RIG hardsuit"
|
||||
desc = "Prototype powered RIG hardsuit. Provides excellent protection from the elements of space while being comfortable to move around in, thanks to the powered locomotives. Remains very bulky however."
|
||||
icon_state = "hardsuit-ancient"
|
||||
item_state = "anc_hardsuit"
|
||||
armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75)
|
||||
slowdown = 3
|
||||
resistance_flags = FIRE_PROOF
|
||||
var/footstep = 1
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/ancient/on_mob_move()
|
||||
var/mob/living/carbon/human/H = loc
|
||||
if(!istype(H) || H.wear_suit != src)
|
||||
return
|
||||
if(footstep > 1)
|
||||
playsound(src, 'sound/effects/servostep.ogg', 100, 1)
|
||||
footstep = 0
|
||||
else
|
||||
footstep++
|
||||
..()
|
||||
|
||||
// Chemical bottles
|
||||
/obj/item/reagent_containers/glass/bottle/aluminum
|
||||
name = "aluminum bottle"
|
||||
list_reagents = list("aluminum" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/hydrogen
|
||||
name = "hydrogen bottle"
|
||||
list_reagents = list("hydrogen" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/lithium
|
||||
name = "lithium bottle"
|
||||
list_reagents = list("lithium" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/carbon
|
||||
name = "carbon bottle"
|
||||
list_reagents = list("carbon" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/nitrogen
|
||||
name = "nitrogen bottle"
|
||||
list_reagents = list("nitrogen" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/oxygen
|
||||
name = "oxygen bottle"
|
||||
list_reagents = list("oxygen" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/fluorine
|
||||
name = "fluorine bottle"
|
||||
list_reagents = list("fluorine" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/sodium
|
||||
name = "sodium bottle"
|
||||
list_reagents = list("sodium" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/silicon
|
||||
name = "silicon bottle"
|
||||
list_reagents = list("silicon" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/phosphorus
|
||||
name = "phosphorus bottle"
|
||||
list_reagents = list("phosphorus" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/sulfur
|
||||
name = "sulfur bottle"
|
||||
list_reagents = list("sulfur" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/chlorine
|
||||
name = "chlorine bottle"
|
||||
list_reagents = list("chlorine" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/potassium
|
||||
name = "potassium bottle"
|
||||
list_reagents = list("potassium" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/iron
|
||||
name = "iron bottle"
|
||||
list_reagents = list("iron" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/copper
|
||||
name = "copper bottle"
|
||||
list_reagents = list("copper" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/mercury
|
||||
name = "mercury bottle"
|
||||
list_reagents = list("mercury" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/radium
|
||||
name = "radium bottle"
|
||||
list_reagents = list("radium" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/water
|
||||
name = "water bottle"
|
||||
list_reagents = list("water" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/ethanol
|
||||
name = "ethanol bottle"
|
||||
list_reagents = list("ethanol" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/sugar
|
||||
name = "sugar bottle"
|
||||
list_reagents = list("sugar" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/sacid
|
||||
name = "sulphuric acid bottle"
|
||||
list_reagents = list("sacid" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/welding_fuel
|
||||
name = "welding fuel bottle"
|
||||
list_reagents = list("fuel" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/silver
|
||||
name = "silver bottle"
|
||||
list_reagents = list("silver" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/iodine
|
||||
name = "iodine bottle"
|
||||
list_reagents = list("iodine" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/bromine
|
||||
name = "bromine bottle"
|
||||
list_reagents = list("bromine" = 30)
|
||||
|
||||
// Engines
|
||||
/obj/structure/shuttle/engine/large
|
||||
name = "engine"
|
||||
opacity = 1
|
||||
icon = 'icons/obj/2x2.dmi'
|
||||
icon_state = "large_engine"
|
||||
desc = "A very large bluespace engine used to propel very large ships."
|
||||
bound_width = 64
|
||||
bound_height = 64
|
||||
appearance_flags = 0
|
||||
|
||||
// areas
|
||||
//Ruin of ancient Space Station
|
||||
|
||||
/area/ruin/space/ancientstation
|
||||
name = "Charlie Station Main Corridor"
|
||||
icon_state = "green"
|
||||
has_gravity = TRUE
|
||||
|
||||
/area/ruin/space/ancientstation/powered
|
||||
name = "Powered Tile"
|
||||
icon_state = "teleporter"
|
||||
requires_power = FALSE
|
||||
|
||||
/area/ruin/space/ancientstation/space
|
||||
name = "Exposed To Space"
|
||||
icon_state = "teleporter"
|
||||
has_gravity = FALSE
|
||||
|
||||
/area/ruin/space/ancientstation/atmo
|
||||
name = "Beta Station Atmospherics"
|
||||
icon_state = "red"
|
||||
has_gravity = FALSE
|
||||
|
||||
/area/ruin/space/ancientstation/betanorth
|
||||
name = "Beta Station North Corridor"
|
||||
icon_state = "blue"
|
||||
|
||||
/area/ruin/space/ancientstation/solar
|
||||
name = "Station Solar Array"
|
||||
icon_state = "panelsAP"
|
||||
|
||||
/area/ruin/space/ancientstation/engi
|
||||
name = "Charlie Station Engineering"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/ruin/space/ancientstation/comm
|
||||
name = "Charlie Station Command"
|
||||
icon_state = "captain"
|
||||
|
||||
/area/ruin/space/ancientstation/hydroponics
|
||||
name = "Charlie Station Hydroponics"
|
||||
icon_state = "garden"
|
||||
|
||||
/area/ruin/space/ancientstation/kitchen
|
||||
name = "Charlie Station Kitchen"
|
||||
icon_state = "kitchen"
|
||||
|
||||
/area/ruin/space/ancientstation/sec
|
||||
name = "Charlie Station Security"
|
||||
icon_state = "red"
|
||||
|
||||
/area/ruin/space/ancientstation/deltacorridor
|
||||
name = "Delta Station Main Corridor"
|
||||
icon_state = "green"
|
||||
|
||||
/area/ruin/space/ancientstation/proto
|
||||
name = "Delta Station Prototype Lab"
|
||||
icon_state = "toxlab"
|
||||
|
||||
/area/ruin/space/ancientstation/rnd
|
||||
name = "Delta Station Research and Development"
|
||||
icon_state = "toxlab"
|
||||
|
||||
/area/ruin/space/ancientstation/hivebot
|
||||
name = "Hivebot Mothership"
|
||||
icon_state = "teleporter"
|
||||
|
||||
// Mob Spawners
|
||||
//Ancient cryogenic sleepers. Players become NT crewmen from a hundred year old space station, now on the verge of collapse.
|
||||
|
||||
/obj/effect/mob_spawn/human/oldsec
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise a security uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "a security officer"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
flavour_text = "<span class='big bold'>You are a security officer working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
|
||||
Work as a team with your fellow survivors and do not abandon them.</b>"
|
||||
uniform = /obj/item/clothing/under/retro/security
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
id = /obj/item/card/id/away/old/sec
|
||||
r_pocket = /obj/item/restraints/handcuffs
|
||||
l_pocket = /obj/item/flash
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/oldsec/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/oldmed
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise a medical uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "a medical doctor"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
flavour_text = "<span class='big bold'>You are a medical working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
|
||||
Work as a team with your fellow survivors and do not abandon them.</b>"
|
||||
uniform = /obj/item/clothing/under/retro/medical
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
id = /obj/item/card/id/away/old/med
|
||||
l_pocket = /obj/item/stack/medical/ointment
|
||||
r_pocket = /obj/item/stack/medical/ointment
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/oldmed/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/oldeng
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise an engineering uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "an engineer"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
flavour_text = "<span class='big bold'>You are an engineer working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
|
||||
Work as a team with your fellow survivors and do not abandon them.</b>"
|
||||
uniform = /obj/item/clothing/under/retro/engineering
|
||||
shoes = /obj/item/clothing/shoes/workboots
|
||||
id = /obj/item/card/id/away/old/eng
|
||||
gloves = /obj/item/clothing/gloves/color/fyellow/old
|
||||
l_pocket = /obj/item/tank/emergency_oxygen
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/oldeng/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/oldsci
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise a science uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "a scientist"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
flavour_text = "<span class='big bold'>You are a scientist working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
|
||||
Work as a team with your fellow survivors and do not abandon them.</b>"
|
||||
uniform = /obj/item/clothing/under/retro/science
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
id = /obj/item/card/id/away/old/sci
|
||||
l_pocket = /obj/item/stack/medical/bruise_pack
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/oldsci/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/structure/showcase/machinery/oldpod
|
||||
name = "damaged cryogenic pod"
|
||||
desc = "A damaged cryogenic pod long since lost to time, including its former occupant..."
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper-open"
|
||||
|
||||
/obj/structure/showcase/machinery/oldpod/used
|
||||
name = "opened cryogenic pod"
|
||||
desc = "A cryogenic pod that has recently discharged its occupant. The pod appears non-functional."
|
||||
@@ -12,6 +12,7 @@
|
||||
//OTHER//
|
||||
/////////
|
||||
var/datum/preferences/prefs = null
|
||||
var/skip_antag = FALSE //TRUE when a player declines to be included for the selection process of game mode antagonists.
|
||||
var/move_delay = 1
|
||||
var/moving = null
|
||||
var/adminobs = null
|
||||
|
||||
@@ -36,8 +36,16 @@
|
||||
path = /obj/item/storage/box/matches
|
||||
|
||||
/datum/gear/cards
|
||||
display_name = "a deck of cards"
|
||||
path = /obj/item/toy/cards/deck
|
||||
display_name = "a deck of standard cards"
|
||||
path = /obj/item/deck/cards
|
||||
|
||||
/datum/gear/doublecards
|
||||
display_name = "a double deck of standard cards"
|
||||
path = /obj/item/deck/doublecards
|
||||
|
||||
/datum/gear/tarot
|
||||
display_name = "a deck of tarot cards"
|
||||
path = /obj/item/deck/tarot
|
||||
|
||||
/datum/gear/headphones
|
||||
display_name = "a pair of headphones"
|
||||
|
||||
@@ -48,8 +48,17 @@
|
||||
item_color="yellow"
|
||||
burn_state = FIRE_PROOF
|
||||
|
||||
New()
|
||||
siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5)
|
||||
/obj/item/clothing/gloves/color/fyellow/New()
|
||||
..()
|
||||
siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5)
|
||||
|
||||
/obj/item/clothing/gloves/color/fyellow/old
|
||||
desc = "Old and worn out insulated gloves, hopefully they still work."
|
||||
name = "worn out insulated gloves"
|
||||
|
||||
/obj/item/clothing/gloves/color/fyellow/old/New()
|
||||
..()
|
||||
siemens_coefficient = pick(0,0,0,0.5,0.5,0.5,0.75)
|
||||
|
||||
/obj/item/clothing/gloves/color/black
|
||||
desc = "These gloves are fire-resistant."
|
||||
|
||||
@@ -96,6 +96,7 @@
|
||||
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
H.do_attack_animation(C)
|
||||
visible_message("<span class='danger'>[C] has been touched with [src] by [H]!</span>")
|
||||
add_attack_logs(H, C, "Touched with stun gloves")
|
||||
C.Stun(stun_strength)
|
||||
C.Weaken(stun_strength)
|
||||
C.apply_effect(STUTTER, stun_strength)
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
//Let's keep clothing sorting clean. This is for all the oldstation clothes.
|
||||
|
||||
/obj/item/clothing/under/retro/security
|
||||
desc = "A (now) retro corporate security jumpsuit. It doesn't have any sort of robust fabric, good ol' NT cutting costs."
|
||||
name = "retro security officer's uniform"
|
||||
icon_state = "retro_sec"
|
||||
item_state = "retro_sec"
|
||||
item_color = "retro_sec"
|
||||
displays_id = 0
|
||||
flags_size = ONESIZEFITSALL
|
||||
|
||||
/obj/item/clothing/under/retro/medical
|
||||
desc = "A once biologically resistant medical uniform. The high-vis stripes are faded and unreflective."
|
||||
name = "retro medical officer's uniform"
|
||||
icon_state = "retro_med"
|
||||
item_state = "retro_med"
|
||||
item_color = "retro_med"
|
||||
displays_id = 0
|
||||
flags_size = ONESIZEFITSALL
|
||||
|
||||
/obj/item/clothing/under/retro/engineering
|
||||
desc = "A faded grimy engineering jumpsuit and overall combo. It's coated with oil, dust, and grit."
|
||||
name = "retro engineering uniform"
|
||||
icon_state = "retro_eng"
|
||||
item_state = "retro_eng"
|
||||
item_color = "retro_eng"
|
||||
displays_id = 0
|
||||
flags_size = ONESIZEFITSALL
|
||||
|
||||
/obj/item/clothing/under/retro/science
|
||||
desc = "A faded polo and set of distinct white slacks. What a ridiculous tie."
|
||||
name = "retro science officer's uniform"
|
||||
icon_state = "retro_sci"
|
||||
item_state = "retro_sci"
|
||||
item_color = "retro_sci"
|
||||
displays_id = 0
|
||||
flags_size = ONESIZEFITSALL
|
||||
@@ -339,6 +339,16 @@
|
||||
time = 50
|
||||
category = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/toxins_payload
|
||||
name = "Toxins Payload Casing"
|
||||
result = /obj/item/bombcore/toxins
|
||||
reqs = list(
|
||||
/obj/item/stock_parts/matter_bin = 1,
|
||||
/obj/item/assembly/signaler = 1,
|
||||
/obj/item/stack/sheet/metal = 2
|
||||
)
|
||||
category = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/bonfire
|
||||
name = "Bonfire"
|
||||
time = 60
|
||||
|
||||
@@ -135,7 +135,7 @@
|
||||
/obj/item/claymore/fluff/hit_reaction()
|
||||
return 0
|
||||
|
||||
/obj/item/fluff/rsik_katana //Xydonus: Rsik Ugsharki
|
||||
/obj/item/fluff/rsik_katana //Xydonus: Rsik Ugsharki Atan
|
||||
name = "ceremonial katana"
|
||||
desc = "A shimmering ceremonial golden katana, for the most discerning class of ninja. Looks expensive, and fragile."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
@@ -1020,6 +1020,26 @@
|
||||
flags = NODROP|BLOCKHAIR
|
||||
flags_inv = HIDEEARS
|
||||
|
||||
/obj/item/clothing/suit/hooded/hoodie/fluff/xydonus //Xydonus: Rsik Ugsharki Atan | Based off of the bomber jacket, but with a hood slapped on (for allowed suit storage)
|
||||
name = "custom fit bomber jacket"
|
||||
desc = "Made for Unathi who likes to show off their big horns."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "xydonus_jacket"
|
||||
ignore_suitadjust = 0
|
||||
hoodtype = /obj/item/clothing/head/hood/fluff/xydonus
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter)
|
||||
|
||||
/obj/item/clothing/head/hood/fluff/xydonus
|
||||
name = "custom fit hood"
|
||||
desc = "A hood with some horns <i>glued</i> to them, or something like that. Custom fit for a Unathi's head shape."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "xydonus_bomberhood"
|
||||
body_parts_covered = HEAD
|
||||
flags = NODROP|BLOCKHAIR
|
||||
flags_inv = HIDEEARS
|
||||
|
||||
//////////// Uniforms ////////////
|
||||
/obj/item/clothing/under/fluff/counterfeitguise_uniform // thatdanguy23 : Rissa Williams
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
if(!reagents || !reagents.total_volume)
|
||||
to_chat(user, "<span class='warning'> None of [src] left, oh no!</span>")
|
||||
return FALSE
|
||||
|
||||
|
||||
if(!is_drainable())
|
||||
to_chat(user, "<span class='warning'> You need to open [src] first!</span>")
|
||||
return FALSE
|
||||
@@ -62,7 +62,7 @@
|
||||
if(!proximity)
|
||||
return
|
||||
|
||||
if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it.
|
||||
if(target.is_refillable() && is_drainable()) //Something like a glass. Player probably wants to transfer TO it.
|
||||
if(!reagents.total_volume)
|
||||
to_chat(user, "<span class='warning'> [src] is empty.</span>")
|
||||
return FALSE
|
||||
@@ -70,7 +70,7 @@
|
||||
if(target.reagents.holder_full())
|
||||
to_chat(user, "<span class='warning'> [target] is full.</span>")
|
||||
return FALSE
|
||||
|
||||
|
||||
var/datum/reagent/refill
|
||||
var/datum/reagent/refillName
|
||||
if(isrobot(user))
|
||||
@@ -388,8 +388,8 @@
|
||||
list_reagents = list()
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/oilcan
|
||||
name = "Oil Injection Device"
|
||||
desc = "A device with a spout on one end for use in replacing fluid in synthtics who have sprung leaks."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "fixovein_old"
|
||||
volume = 100
|
||||
name = "oil can"
|
||||
desc = "Contains oil intended for use on cyborgs, robots, and other synthetics."
|
||||
icon = 'icons/goonstation/objects/oil.dmi'
|
||||
icon_state = "oilcan"
|
||||
volume = 100
|
||||
@@ -0,0 +1,79 @@
|
||||
/obj/structure/fermenting_barrel
|
||||
name = "wooden barrel"
|
||||
desc = "A large wooden barrel. You can ferment fruits and such inside it, or just use it to hold liquid."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "barrel"
|
||||
density = TRUE
|
||||
anchored = FALSE
|
||||
container_type = DRAINABLE | AMOUNT_VISIBLE
|
||||
pressure_resistance = 2 * ONE_ATMOSPHERE
|
||||
max_integrity = 300
|
||||
var/open = FALSE
|
||||
var/speed_multiplier = 1 //How fast it distills. Defaults to 100% (1.0). Lower is better.
|
||||
|
||||
/obj/structure/fermenting_barrel/Initialize()
|
||||
create_reagents(300) //Bluespace beakers, but without the portability or efficiency in circuits.
|
||||
. = ..()
|
||||
|
||||
/obj/structure/fermenting_barrel/examine(mob/user)
|
||||
. = ..()
|
||||
to_chat(user, "<span class='notice'>It is currently [open ? "open, letting you pour liquids in." : "closed, letting you draw liquids from the tap."] </span>")
|
||||
|
||||
/obj/structure/fermenting_barrel/proc/makeWine(obj/item/reagent_containers/food/snacks/grown/G)
|
||||
if(G.reagents)
|
||||
G.reagents.trans_to(src, G.reagents.total_volume)
|
||||
var/amount = G.seed.potency / 4
|
||||
if(G.distill_reagent)
|
||||
reagents.add_reagent(G.distill_reagent, amount)
|
||||
else
|
||||
var/data = list()
|
||||
data["names"] = list("[initial(G.name)]" = 1)
|
||||
data["color"] = G.filling_color
|
||||
data["alcohol_perc"] = G.wine_power
|
||||
if(G.wine_flavor)
|
||||
data["tastes"] = list(G.wine_flavor = 1)
|
||||
// else // Stub - Will implement when we port over tg's better taste system - I'd rather get the barrel in first.
|
||||
// data["tastes"] = list(G.tastes[1] = 1)
|
||||
reagents.add_reagent("fruit_wine", amount, data)
|
||||
qdel(G)
|
||||
playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE)
|
||||
|
||||
/obj/structure/fermenting_barrel/attackby(obj/item/I, mob/user, params)
|
||||
var/obj/item/reagent_containers/food/snacks/grown/G = I
|
||||
if(istype(G))
|
||||
if(!G.can_distill)
|
||||
to_chat(user, "<span class='warning'>You can't distill this into anything...</span>")
|
||||
return FALSE
|
||||
else if(!user.drop_item())
|
||||
to_chat(user, "<span class='warning'>[G] is stuck to your hand!</span>")
|
||||
return FALSE
|
||||
G.forceMove(src)
|
||||
to_chat(user, "<span class='notice'>You place [G] into [src] to start the fermentation process.</span>")
|
||||
addtimer(CALLBACK(src, .proc/makeWine, G), rand(80, 120) * speed_multiplier)
|
||||
else if(I.is_refillable())
|
||||
return FALSE // To refill via afterattack proc
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/fermenting_barrel/attack_hand(mob/user)
|
||||
open = !open
|
||||
if(open)
|
||||
container_type = REFILLABLE | AMOUNT_VISIBLE
|
||||
to_chat(user, "<span class='notice'>You open [src], letting you fill it.</span>")
|
||||
else
|
||||
container_type = DRAINABLE | AMOUNT_VISIBLE
|
||||
to_chat(user, "<span class='notice'>You close [src], letting you draw from its tap.</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/structure/fermenting_barrel/update_icon()
|
||||
if(open)
|
||||
icon_state = "barrel_open"
|
||||
else
|
||||
icon_state = "barrel"
|
||||
|
||||
/datum/crafting_recipe/fermenting_barrel
|
||||
name = "Wooden Barrel"
|
||||
result = /obj/structure/fermenting_barrel
|
||||
reqs = list(/obj/item/stack/sheet/wood = 30)
|
||||
time = 50
|
||||
category = CAT_PRIMAL
|
||||
@@ -8,12 +8,13 @@
|
||||
icon = 'icons/obj/hydroponics/harvest.dmi'
|
||||
var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item.
|
||||
var/plantname = ""
|
||||
var/bitesize_mod = 0
|
||||
var/bitesize_mod = 0 // If set, bitesize = 1 + round(reagents.total_volume / bitesize_mod)
|
||||
var/splat_type = /obj/effect/decal/cleanable/plant_smudge
|
||||
// If set, bitesize = 1 + round(reagents.total_volume / bitesize_mod)
|
||||
dried_type = -1
|
||||
// Saves us from having to define each stupid grown's dried_type as itself.
|
||||
// If you don't want a plant to be driable (watermelons) set this to null in the time definition.
|
||||
var/can_distill = TRUE //If FALSE, this object cannot be distilled into an alcohol.
|
||||
var/distill_reagent //If NULL and this object can be distilled, it uses a generic fruit_wine reagent and adjusts its variables.
|
||||
var/wine_flavor //If NULL, this is automatically set to the fruit's flavor. Determines the flavor of the wine if distill_reagent is NULL.
|
||||
var/wine_power = 0.1 //Determines the boozepwr of the wine if distill_reagent is NULL. Uses 0.1 - 1.2 not tg's boozepower (divide by 100) else you'll end up with 1000% proof alcohol!
|
||||
dried_type = -1 // Saves us from having to define each stupid grown's dried_type as itself. If you don't want a plant to be driable (watermelons) set this to null in the time definition.
|
||||
burn_state = FLAMMABLE
|
||||
origin_tech = "biotech=1"
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
name = "ambrosia vulgaris branch"
|
||||
desc = "This is a plant containing various healing chemicals."
|
||||
origin_tech = "biotech=2"
|
||||
wine_power = 0.2
|
||||
|
||||
// Ambrosia Deus
|
||||
/obj/item/seeds/ambrosia/deus
|
||||
@@ -50,6 +51,7 @@
|
||||
icon_state = "ambrosiadeus"
|
||||
filling_color = "#008B8B"
|
||||
origin_tech = "biotech=4;materials=3"
|
||||
wine_power = 0.5
|
||||
|
||||
//Ambrosia Gaia
|
||||
/obj/item/seeds/ambrosia/gaia
|
||||
@@ -74,6 +76,8 @@
|
||||
origin_tech = "biotech=6;materials=5"
|
||||
light_range = 3
|
||||
seed = /obj/item/seeds/ambrosia/gaia
|
||||
wine_power = 0.7
|
||||
wine_flavor = "the earthmother's blessing"
|
||||
|
||||
// Ambrosia Cruciatus
|
||||
/obj/item/seeds/ambrosia/cruciatus
|
||||
@@ -83,4 +87,5 @@
|
||||
reagents_add = list("thc" = 0.15, "kelotane" = 0.15, "bicaridine" = 0.1, "bath_salts" = 0.20, "plantmatter" = 0.05)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/ambrosia/cruciatus
|
||||
seed = /obj/item/seeds/ambrosia/cruciatus
|
||||
seed = /obj/item/seeds/ambrosia/cruciatus
|
||||
wine_power = 0.7
|
||||
@@ -23,6 +23,7 @@
|
||||
icon_state = "apple"
|
||||
filling_color = "#FF4500"
|
||||
bitesize = 100 // Always eat the apple in one bite
|
||||
distill_reagent = "hcider"
|
||||
|
||||
// Posioned Apple
|
||||
/obj/item/seeds/apple/poisoned
|
||||
@@ -55,3 +56,5 @@
|
||||
icon_state = "goldapple"
|
||||
filling_color = "#FFD700"
|
||||
origin_tech = "biotech=4;materials=5"
|
||||
distill_reagent = null
|
||||
wine_power = 0.5
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
trash = /obj/item/grown/bananapeel
|
||||
filling_color = "#FFFF00"
|
||||
bitesize = 5
|
||||
distill_reagent = "bananahonk"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is aiming the [name] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
@@ -74,6 +75,7 @@
|
||||
icon_state = "mimana"
|
||||
trash = /obj/item/grown/bananapeel/mimanapeel
|
||||
filling_color = "#FFFFEE"
|
||||
distill_reagent = "silencer"
|
||||
|
||||
/obj/item/grown/bananapeel/mimanapeel
|
||||
seed = /obj/item/seeds/banana/mime
|
||||
@@ -102,6 +104,8 @@
|
||||
trash = /obj/item/grown/bananapeel/bluespace
|
||||
filling_color = "#0000FF"
|
||||
origin_tech = "biotech=3;bluespace=5"
|
||||
wine_power = 0.6
|
||||
wine_flavor = "slippery hypercubes"
|
||||
|
||||
/obj/item/grown/bananapeel/bluespace
|
||||
seed = /obj/item/seeds/banana/bluespace
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
icon_state = "soybeans"
|
||||
filling_color = "#F0E68C"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.2
|
||||
|
||||
// Koibean
|
||||
/obj/item/seeds/soya/koi
|
||||
@@ -45,4 +46,5 @@
|
||||
desc = "Something about these seems fishy."
|
||||
icon_state = "koibeans"
|
||||
filling_color = "#F0E68C"
|
||||
bitesize_mod = 2
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.4
|
||||
@@ -25,6 +25,7 @@
|
||||
gender = PLURAL
|
||||
filling_color = "#FF00FF"
|
||||
bitesize_mod = 2
|
||||
distill_reagent = "gin"
|
||||
|
||||
// Poison Berries
|
||||
/obj/item/seeds/berry/poison
|
||||
@@ -44,6 +45,8 @@
|
||||
desc = "Taste so good, you could die!"
|
||||
icon_state = "poisonberrypile"
|
||||
filling_color = "#C71585"
|
||||
distill_reagent = null
|
||||
wine_power = 0.35
|
||||
|
||||
// Death Berries
|
||||
/obj/item/seeds/berry/death
|
||||
@@ -65,6 +68,8 @@
|
||||
desc = "Taste so good, you could die!"
|
||||
icon_state = "deathberrypile"
|
||||
filling_color = "#708090"
|
||||
distill_reagent = null
|
||||
wine_power = 0.5
|
||||
|
||||
// Glow Berries
|
||||
/obj/item/seeds/berry/glow
|
||||
@@ -89,6 +94,9 @@
|
||||
filling_color = "#7CFC00"
|
||||
origin_tech = "plasmatech=6"
|
||||
light_color = "#006622"
|
||||
distill_reagent = null
|
||||
wine_power = 0.6
|
||||
wine_flavor = "warmth"
|
||||
|
||||
// Cherries
|
||||
/obj/item/seeds/cherry
|
||||
@@ -118,6 +126,7 @@
|
||||
gender = PLURAL
|
||||
filling_color = "#FF0000"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.3
|
||||
|
||||
// Blue Cherries
|
||||
/obj/item/seeds/cherry/blue
|
||||
@@ -138,6 +147,7 @@
|
||||
icon_state = "bluecherry"
|
||||
filling_color = "#6495ED"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.5
|
||||
|
||||
// Grapes
|
||||
/obj/item/seeds/grape
|
||||
@@ -168,6 +178,7 @@
|
||||
dried_type = /obj/item/reagent_containers/food/snacks/no_raisin
|
||||
filling_color = "#FF1493"
|
||||
bitesize_mod = 2
|
||||
distill_reagent = "wine"
|
||||
|
||||
// Green Grapes
|
||||
/obj/item/seeds/grape/green
|
||||
@@ -186,3 +197,4 @@
|
||||
name = "bunch of green grapes"
|
||||
icon_state = "greengrapes"
|
||||
filling_color = "#7FFF00"
|
||||
distill_reagent = "cognac"
|
||||
|
||||
@@ -93,6 +93,7 @@
|
||||
icon_state = "cannabis"
|
||||
filling_color = "#00FF00"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.2
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow
|
||||
@@ -100,18 +101,21 @@
|
||||
name = "rainbow cannabis leaf"
|
||||
desc = "Is it supposed to be glowing like that...?"
|
||||
icon_state = "megacannabis"
|
||||
wine_power = 0.6
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/cannabis/death
|
||||
seed = /obj/item/seeds/cannabis/death
|
||||
name = "death cannabis leaf"
|
||||
desc = "Looks a bit dark. Oh well."
|
||||
icon_state = "blackcannabis"
|
||||
wine_power = 0.4
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/cannabis/white
|
||||
seed = /obj/item/seeds/cannabis/white
|
||||
name = "white cannabis leaf"
|
||||
desc = "It feels smooth and nice to the touch."
|
||||
icon_state = "whitecannabis"
|
||||
wine_power = 0.1
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate
|
||||
seed = /obj/item/seeds/cannabis/ultimate
|
||||
@@ -119,3 +123,4 @@
|
||||
desc = "You feel dizzy looking at it. What the fuck?"
|
||||
icon_state = "ocannabis"
|
||||
volume = 420
|
||||
wine_power = 0.9
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
icon_state = "wheat"
|
||||
filling_color = "#F0E68C"
|
||||
bitesize_mod = 2
|
||||
distill_reagent = "beer"
|
||||
|
||||
// Oat
|
||||
/obj/item/seeds/wheat/oat
|
||||
@@ -40,6 +41,7 @@
|
||||
icon_state = "oat"
|
||||
filling_color = "#556B2F"
|
||||
bitesize_mod = 2
|
||||
distill_reagent = "ale"
|
||||
|
||||
// Rice
|
||||
/obj/item/seeds/wheat/rice
|
||||
@@ -60,6 +62,7 @@
|
||||
icon_state = "rice"
|
||||
filling_color = "#FAFAD2"
|
||||
bitesize_mod = 2
|
||||
distill_reagent = "sake"
|
||||
|
||||
//Meatwheat - grows into synthetic meat
|
||||
/obj/item/seeds/wheat/meat
|
||||
@@ -80,6 +83,7 @@
|
||||
filling_color = rgb(150, 0, 0)
|
||||
bitesize_mod = 2
|
||||
seed = /obj/item/seeds/wheat/meat
|
||||
can_distill = FALSE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/meatwheat/attack_self(mob/living/user)
|
||||
user.visible_message("<span class='notice'>[user] crushes [src] into meat.</span>", "<span class='notice'>You crush [src] into something that resembles meat.</span>")
|
||||
|
||||
@@ -25,14 +25,15 @@
|
||||
icon_state = "chilipepper"
|
||||
filling_color = "#FF0000"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.2
|
||||
|
||||
// Ice Chili
|
||||
/obj/item/seeds/chili/ice
|
||||
name = "pack of ice pepper seeds"
|
||||
desc = "These seeds grow into ice pepper plants."
|
||||
name = "pack of chilly pepper seeds"
|
||||
desc = "These seeds grow into chilly pepper plants."
|
||||
icon_state = "seed-icepepper"
|
||||
species = "chiliice"
|
||||
plantname = "Ice Pepper Plants"
|
||||
plantname = "Chilly Pepper Plants"
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/icepepper
|
||||
lifespan = 25
|
||||
maturation = 4
|
||||
@@ -43,12 +44,13 @@
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/icepepper
|
||||
seed = /obj/item/seeds/chili/ice
|
||||
name = "ice pepper"
|
||||
name = "chilly pepper"
|
||||
desc = "It's a mutant strain of chili"
|
||||
icon_state = "icepepper"
|
||||
filling_color = "#0000CD"
|
||||
bitesize_mod = 2
|
||||
origin_tech = "biotech=4"
|
||||
wine_power = 0.3
|
||||
|
||||
// Ghost Chili
|
||||
/obj/item/seeds/chili/ghost
|
||||
@@ -73,4 +75,5 @@
|
||||
icon_state = "ghostchilipepper"
|
||||
filling_color = "#F8F8FF"
|
||||
bitesize_mod = 4
|
||||
origin_tech = "biotech=4;magnets=5"
|
||||
origin_tech = "biotech=4;magnets=5"
|
||||
wine_power = 0.5
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
desc = "It's so sour, your face will twist."
|
||||
icon_state = "lime"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.3
|
||||
|
||||
// Lime
|
||||
/obj/item/seeds/lime
|
||||
@@ -29,6 +30,7 @@
|
||||
desc = "It's so sour, your face will twist."
|
||||
icon_state = "lime"
|
||||
filling_color = "#00FF00"
|
||||
distill_reagent = "triple_sec"
|
||||
|
||||
// Orange
|
||||
/obj/item/seeds/orange
|
||||
@@ -104,6 +106,8 @@
|
||||
desc = "Made for burning houses down."
|
||||
icon_state = "firelemon"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.7
|
||||
wine_flavor = "fire"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/firelemon/attack_self(mob/living/user)
|
||||
var/area/A = get_area(user)
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
icon_state = "cocoapod"
|
||||
filling_color = "#FFD700"
|
||||
bitesize_mod = 2
|
||||
distill_reagent = "creme_de_cacao"
|
||||
|
||||
// Vanilla Pod
|
||||
/obj/item/seeds/cocoapod/vanillapod
|
||||
@@ -43,4 +44,5 @@
|
||||
name = "vanilla pod"
|
||||
desc = "Fattening... Mmmmm... vanilla."
|
||||
icon_state = "vanillapod"
|
||||
filling_color = "#FFD700"
|
||||
filling_color = "#FFD700"
|
||||
distill_reagent = "vanilla" //Takes longer, but you can get even more vanilla from it.
|
||||
@@ -24,6 +24,8 @@
|
||||
filling_color = "#FFFF00"
|
||||
trash = /obj/item/grown/corncob
|
||||
bitesize_mod = 2
|
||||
distill_reagent = "whiskey"
|
||||
wine_power = 0.4
|
||||
|
||||
/obj/item/grown/corncob
|
||||
name = "corn cob"
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
icon_state = "eggplant"
|
||||
filling_color = "#800080"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.2
|
||||
|
||||
// Egg-Plant
|
||||
/obj/item/seeds/eggplant/eggy
|
||||
@@ -41,4 +42,5 @@
|
||||
icon_state = "eggyplant"
|
||||
trash = /obj/item/reagent_containers/food/snacks/egg
|
||||
filling_color = "#F8F8FF"
|
||||
bitesize_mod = 2
|
||||
bitesize_mod = 2
|
||||
distill_reagent = "eggnog"
|
||||
@@ -25,6 +25,7 @@
|
||||
slot_flags = SLOT_HEAD
|
||||
filling_color = "#FF6347"
|
||||
bitesize_mod = 3
|
||||
distill_reagent = "vermouth"
|
||||
|
||||
// Lily
|
||||
/obj/item/seeds/poppy/lily
|
||||
@@ -88,6 +89,7 @@
|
||||
slot_flags = SLOT_HEAD
|
||||
filling_color = "#E6E6FA"
|
||||
bitesize_mod = 3
|
||||
distill_reagent = "vermouth"
|
||||
|
||||
|
||||
// Sunflower
|
||||
@@ -145,6 +147,7 @@
|
||||
slot_flags = SLOT_HEAD
|
||||
filling_color = "#E6E6FA"
|
||||
bitesize_mod = 2
|
||||
distill_reagent = "absinthe"
|
||||
|
||||
// Novaflower
|
||||
/obj/item/seeds/sunflower/novaflower
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
bitesize_mod = 2
|
||||
var/stacktype = /obj/item/stack/tile/grass
|
||||
var/tile_coefficient = 0.02 // 1/50
|
||||
wine_power = 0.15
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/grass/attack_self(mob/user)
|
||||
to_chat(user, "<span class='notice'>You prepare the astroturf.</span>")
|
||||
@@ -65,3 +66,4 @@
|
||||
desc = "The textile industry's dark secret."
|
||||
icon_state = "carpetclump"
|
||||
stacktype = /obj/item/stack/tile/carpet
|
||||
can_distill = FALSE
|
||||
|
||||
@@ -95,3 +95,4 @@
|
||||
icon_state = "kudzupod"
|
||||
filling_color = "#6B8E23"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.2
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
filling_color = "#008000"
|
||||
bitesize_mod = 3
|
||||
wine_power = 0.4
|
||||
|
||||
// Holymelon
|
||||
/obj/item/seeds/watermelon/holy
|
||||
@@ -45,3 +46,5 @@
|
||||
icon_state = "holymelon"
|
||||
filling_color = "#FFD700"
|
||||
dried_type = null
|
||||
wine_power = 0.7 //Water to wine, baby.
|
||||
wine_flavor = "divinity"
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
icon_state = "cabbage"
|
||||
filling_color = "#90EE90"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.2
|
||||
|
||||
|
||||
// Sugarcane
|
||||
@@ -78,6 +79,7 @@
|
||||
icon_state = "sugarcane"
|
||||
filling_color = "#FFD700"
|
||||
bitesize_mod = 2
|
||||
distill_reagent = "rum"
|
||||
|
||||
|
||||
// Gatfruit
|
||||
@@ -108,6 +110,7 @@
|
||||
origin_tech = "combat=6"
|
||||
trash = /obj/item/gun/projectile/revolver
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.9 //It burns going down, too.
|
||||
|
||||
//Cherry Bombs
|
||||
/obj/item/seeds/cherry/bomb
|
||||
@@ -129,6 +132,7 @@
|
||||
seed = /obj/item/seeds/cherry/bomb
|
||||
bitesize_mod = 2
|
||||
volume = 125 //Gives enough room for the black powder at max potency
|
||||
wine_power = 0.8
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user)
|
||||
var/area/A = get_area(user)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/grown/mushroom
|
||||
name = "mushroom"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.4
|
||||
|
||||
|
||||
// Reishi
|
||||
@@ -84,6 +85,7 @@
|
||||
desc = "<I>Amanita Virosa</I>: Deadly poisonous basidiomycete fungus filled with alpha amanitin."
|
||||
icon_state = "angel"
|
||||
filling_color = "#C0C0C0"
|
||||
wine_power = 0.6
|
||||
|
||||
|
||||
// Liberty Cap
|
||||
@@ -109,6 +111,8 @@
|
||||
desc = "<I>Psilocybe Semilanceata</I>: Liberate yourself!"
|
||||
icon_state = "libertycap"
|
||||
filling_color = "#DAA520"
|
||||
wine_power = 0.8
|
||||
wine_flavor = "freedom"
|
||||
|
||||
|
||||
// Plump Helmet
|
||||
@@ -135,6 +139,7 @@
|
||||
desc = "<I>Plumus Hellmus</I>: Plump, soft and s-so inviting~"
|
||||
icon_state = "plumphelmet"
|
||||
filling_color = "#9370DB"
|
||||
distill_reagent = "manlydorf"
|
||||
|
||||
|
||||
// Walking Mushroom
|
||||
@@ -161,6 +166,7 @@
|
||||
icon_state = "walkingmushroom"
|
||||
filling_color = "#9370DB"
|
||||
origin_tech = "biotech=4;programming=5"
|
||||
can_distill = FALSE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user)
|
||||
if(istype(user.loc, /turf/space))
|
||||
@@ -232,6 +238,7 @@
|
||||
var/effect_path = /obj/structure/glowshroom
|
||||
origin_tech = "biotech=4;plasmatech=6"
|
||||
light_color = "#006622"
|
||||
wine_power = 0.5
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/attack_self(mob/user)
|
||||
if(istype(user.loc, /turf/space))
|
||||
@@ -280,6 +287,8 @@
|
||||
effect_path = /obj/structure/glowshroom/glowcap
|
||||
origin_tech = "biotech=4;powerstorage=6;plasmatech=4"
|
||||
light_color = "#8E0300"
|
||||
wine_power = 0.6
|
||||
wine_flavor = "warmth"
|
||||
|
||||
// Fungus/Mold
|
||||
/obj/item/seeds/fungus
|
||||
@@ -326,3 +335,5 @@
|
||||
icon_state = "shadowshroom"
|
||||
effect_path = /obj/structure/glowshroom/shadowshroom
|
||||
origin_tech = "biotech=4;plasmatech=4;magnets=4"
|
||||
wine_power = 0.6
|
||||
wine_flavor = "strange coldness"
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
bitesize_mod = 2
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/onion_slice
|
||||
slices_num = 2
|
||||
wine_power = 0.2
|
||||
wine_flavor = "pungentness"
|
||||
|
||||
/obj/item/seeds/onion/red
|
||||
name = "pack of red onion seeds"
|
||||
@@ -43,6 +45,8 @@
|
||||
icon_state = "onion_red"
|
||||
filling_color = "#C29ACF"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/onion_slice/red
|
||||
wine_power = 0.6
|
||||
wine_flavor = "powerful pungentness"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/onion_slice
|
||||
name = "onion slices"
|
||||
|
||||
@@ -24,4 +24,5 @@
|
||||
icon_state = "pineapple"
|
||||
filling_color = "#e5b437"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
bitesize_mod = 3
|
||||
bitesize_mod = 3
|
||||
wine_power = 0.4
|
||||
@@ -25,6 +25,7 @@
|
||||
icon_state = "potato"
|
||||
filling_color = "#E9967A"
|
||||
bitesize = 100
|
||||
distill_reagent = "vodka"
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/potato/wedges
|
||||
@@ -33,6 +34,7 @@
|
||||
icon_state = "potato_wedges"
|
||||
filling_color = "#E9967A"
|
||||
bitesize = 100
|
||||
distill_reagent = "sbiten"
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/potato/attackby(obj/item/W, mob/user, params)
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
icon_state = "pumpkin"
|
||||
filling_color = "#FFA500"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.2
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(is_sharp(W))
|
||||
@@ -52,3 +53,4 @@
|
||||
icon_state = "blumpkin"
|
||||
filling_color = "#87CEFA"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.5
|
||||
|
||||
@@ -26,4 +26,10 @@
|
||||
name = "strange plant"
|
||||
desc = "What could this even be?"
|
||||
icon_state = "crunchy"
|
||||
bitesize_mod = 2
|
||||
bitesize_mod = 2
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/random/Initialize()
|
||||
. = ..()
|
||||
wine_power = rand(0.1,1.5)
|
||||
if(prob(1))
|
||||
wine_power = 2.0
|
||||
@@ -21,6 +21,7 @@
|
||||
icon_state = "carrot"
|
||||
filling_color = "#FFA500"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.3
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/carrot/wedges
|
||||
name = "carrot wedges"
|
||||
@@ -59,6 +60,7 @@
|
||||
desc = "Closely related to carrots."
|
||||
icon_state = "parsnip"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.35
|
||||
|
||||
|
||||
// White-Beet
|
||||
@@ -84,6 +86,7 @@
|
||||
icon_state = "whitebeet"
|
||||
filling_color = "#F4A460"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.4
|
||||
|
||||
// Red Beet
|
||||
/obj/item/seeds/redbeet
|
||||
@@ -107,3 +110,4 @@
|
||||
desc = "You can't beat red beet."
|
||||
icon_state = "redbeet"
|
||||
bitesize_mod = 2
|
||||
wine_power = 0.6
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
desc = "These aromatic tips of the tea plant can be dried to make tea."
|
||||
icon_state = "tea_aspera_leaves"
|
||||
filling_color = "#008000"
|
||||
can_distill = FALSE
|
||||
|
||||
// Tea Astra
|
||||
/obj/item/seeds/tea/astra
|
||||
@@ -67,6 +68,7 @@
|
||||
icon_state = "coffee_arabica"
|
||||
filling_color = "#DC143C"
|
||||
bitesize_mod = 2
|
||||
distill_reagent = "kahlua"
|
||||
|
||||
// Coffee Robusta
|
||||
/obj/item/seeds/coffee/robusta
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
desc = "Dry them out to make some smokes."
|
||||
icon_state = "tobacco_leaves"
|
||||
filling_color = "#008000"
|
||||
distill_reagent = "creme_de_menthe" //Menthol, I guess.
|
||||
|
||||
// Space Tobacco
|
||||
/obj/item/seeds/tobacco/space
|
||||
@@ -38,4 +39,6 @@
|
||||
seed = /obj/item/seeds/tobacco/space
|
||||
name = "space tobacco leaves"
|
||||
desc = "Dry them out to make some space-smokes."
|
||||
icon_state = "stobacco_leaves"
|
||||
icon_state = "stobacco_leaves"
|
||||
distill_reagent = null
|
||||
wine_power = 0.5
|
||||
@@ -22,6 +22,7 @@
|
||||
splat_type = /obj/effect/decal/cleanable/tomato_smudge
|
||||
filling_color = "#FF6347"
|
||||
bitesize_mod = 2
|
||||
distill_reagent = "enzyme"
|
||||
|
||||
// Blood Tomato
|
||||
/obj/item/seeds/tomato/blood
|
||||
@@ -43,6 +44,7 @@
|
||||
splat_type = /obj/effect/gibspawner/generic
|
||||
filling_color = "#FF0000"
|
||||
origin_tech = "biotech=5"
|
||||
distill_reagent = "bloodymary"
|
||||
|
||||
|
||||
// Blue Tomato
|
||||
@@ -89,6 +91,8 @@
|
||||
desc = "So lubricated, you might slip through space-time."
|
||||
icon_state = "bluespacetomato"
|
||||
origin_tech = "biotech=4;bluespace=5"
|
||||
distill_reagent = null
|
||||
wine_power = 0.8
|
||||
|
||||
|
||||
// Killer Tomato
|
||||
@@ -117,6 +121,7 @@
|
||||
var/awakening = 0
|
||||
filling_color = "#FF0000"
|
||||
origin_tech = "biotech=4;combat=5"
|
||||
distill_reagent = "demonsblood"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/tomato/killer/attack(mob/M, mob/user, def_zone)
|
||||
if(awakening)
|
||||
|
||||
@@ -45,9 +45,9 @@
|
||||
|
||||
/obj/machinery/logic_gate/nand/handle_logic()
|
||||
if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) && (input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER))
|
||||
output_state = LOGIC_OFF //This can only output continuous signals
|
||||
else //At least one input was ON/FLICKER, so output is off
|
||||
output_state = LOGIC_OFF
|
||||
output_state = LOGIC_OFF //Both inputs are ON/FLICKER, so output is off
|
||||
else
|
||||
output_state = LOGIC_ON //This can only output continuous signals
|
||||
return
|
||||
|
||||
// NOR Gate
|
||||
@@ -58,9 +58,9 @@
|
||||
output_state = LOGIC_ON
|
||||
|
||||
/obj/machinery/logic_gate/nor/handle_logic()
|
||||
if(input1_state == LOGIC_OFF ||input2_state == LOGIC_OFF)
|
||||
if(input1_state == LOGIC_OFF && input2_state == LOGIC_OFF) //Both inputs are OFF, so output is ON
|
||||
output_state = LOGIC_ON //This can only output continuous signals
|
||||
else //Both inputs are ON, so output is OFF
|
||||
else
|
||||
output_state = LOGIC_OFF
|
||||
return
|
||||
|
||||
@@ -71,14 +71,15 @@
|
||||
icon_state = "logic_xor"
|
||||
|
||||
/obj/machinery/logic_gate/xor/handle_logic()
|
||||
if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) || input2_state == LOGIC_OFF) //Only input1 is ON/FLICKER, so output matches input1
|
||||
if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) && (input2_state == LOGIC_OFF)) //Only input1 is ON/FLICKER, so output matches input1
|
||||
output_state = input1_state
|
||||
else if((input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER) || input1_state == LOGIC_OFF) //Only input2 is ON/FLICKER, so output matches input2
|
||||
else if((input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER) && (input1_state == LOGIC_OFF)) //Only input2 is ON/FLICKER, so output matches input2
|
||||
output_state = input2_state
|
||||
else //Both inputs are ON or OFF, so output is OFF
|
||||
output_state = LOGIC_OFF
|
||||
return
|
||||
|
||||
|
||||
// XNOR Gate
|
||||
/obj/machinery/logic_gate/xnor
|
||||
name = "XNOR Gate"
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/New()
|
||||
..()
|
||||
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE),INFINITY)
|
||||
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, FALSE, /obj/item/stack)
|
||||
files = new /datum/research/smelter(src)
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/circuitboard/ore_redemption(null)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
var/harvested_name = "shortened mushrooms"
|
||||
var/harvested_desc = "Some quickly regrowing mushrooms, formerly known to be quite large."
|
||||
var/needs_sharp_harvest = TRUE
|
||||
var/harvest = /obj/item/reagent_containers/food/snacks/ash_flora/shavings
|
||||
var/harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings
|
||||
var/harvest_amount_low = 1
|
||||
var/harvest_amount_high = 3
|
||||
var/harvest_time = 60
|
||||
@@ -79,7 +79,7 @@
|
||||
desc = "A number of mushrooms, each of which surrounds a greenish sporangium with a number of leaf-like structures."
|
||||
harvested_name = "leafless mushrooms"
|
||||
harvested_desc = "A bunch of formerly-leafed mushrooms, with their sporangiums exposed. Scandalous?"
|
||||
harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_leaf
|
||||
harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf
|
||||
needs_sharp_harvest = FALSE
|
||||
harvest_amount_high = 4
|
||||
harvest_time = 20
|
||||
@@ -95,7 +95,7 @@
|
||||
desc = "Several mushrooms, the larger of which have a ring of conks at the midpoint of their stems."
|
||||
harvested_name = "small mushrooms"
|
||||
harvested_desc = "Several small mushrooms near the stumps of what likely were larger mushrooms."
|
||||
harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_cap
|
||||
harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap
|
||||
harvest_amount_high = 4
|
||||
harvest_time = 50
|
||||
harvest_message_low = "You slice the cap off of a mushroom."
|
||||
@@ -111,7 +111,7 @@
|
||||
luminosity = 1
|
||||
harvested_name = "tiny mushrooms"
|
||||
harvested_desc = "A few tiny mushrooms around larger stumps. You can already see them growing back."
|
||||
harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_stem
|
||||
harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem
|
||||
harvest_amount_high = 4
|
||||
harvest_time = 40
|
||||
harvest_message_low = "You pick and slice the cap off of a mushroom, leaving the stem."
|
||||
@@ -126,7 +126,7 @@
|
||||
desc = "Several prickly cacti, brimming with ripe fruit and covered in a thin layer of ash."
|
||||
harvested_name = "cacti"
|
||||
harvested_desc = "A bunch of prickly cacti. You can see fruits slowly growing beneath the covering of ash."
|
||||
harvest = /obj/item/reagent_containers/food/snacks/ash_flora/cactus_fruit
|
||||
harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit
|
||||
needs_sharp_harvest = FALSE
|
||||
harvest_amount_high = 2
|
||||
harvest_time = 10
|
||||
@@ -149,45 +149,51 @@
|
||||
H.visible_message("<span class='danger'>[H] steps on a cactus!</span>", \
|
||||
"<span class='userdanger'>You step on a cactus!</span>")
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/ash_flora
|
||||
/obj/item/reagent_containers/food/snacks/grown/ash_flora
|
||||
name = "mushroom shavings"
|
||||
desc = "Some shavings from a tall mushroom. With enough, might serve as a bowl."
|
||||
icon = 'icons/obj/lavaland/ash_flora.dmi'
|
||||
icon_state = "mushroom_shavings"
|
||||
list_reagents = list("sugar" = 3, "ethanol" = 2, "stabilizing_agent" = 3, "minttoxin" = 2)
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
wine_power = 0.2
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/ash_flora/New()
|
||||
/obj/item/reagent_containers/food/snacks/grown/ash_flora/New()
|
||||
..()
|
||||
pixel_x = rand(-4, 4)
|
||||
pixel_y = rand(-4, 4)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/ash_flora/shavings //for actual crafting
|
||||
/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings //for actual crafting
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_leaf
|
||||
/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf
|
||||
name = "mushroom leaf"
|
||||
desc = "A leaf, from a mushroom."
|
||||
list_reagents = list("nutriment" = 3, "vitfro" = 2, "nicotine" = 2)
|
||||
icon_state = "mushroom_leaf"
|
||||
wine_power = 0.4
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_cap
|
||||
/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap
|
||||
name = "mushroom cap"
|
||||
desc = "The cap of a large mushroom."
|
||||
list_reagents = list("lsd" = 2, "entpoly" = 4, "psilocybin" = 2)
|
||||
icon_state = "mushroom_cap"
|
||||
wine_power = 0.7
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_stem
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem
|
||||
name = "mushroom stem"
|
||||
desc = "A long mushroom stem. It's slightly glowing."
|
||||
list_reagents = list("tinlux" = 2, "vitamin" = 1, "space_drugs" = 1)
|
||||
icon_state = "mushroom_stem"
|
||||
luminosity = 1
|
||||
wine_power = 0.6
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/ash_flora/cactus_fruit
|
||||
/obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit
|
||||
name = "cactus fruit"
|
||||
list_reagents = list("vitamin" = 2, "nutriment" = 2, "vitfro" = 4)
|
||||
desc = "A cactus fruit covered in a thick, reddish skin. And some ash."
|
||||
icon_state = "cactus_fruit"
|
||||
wine_power = 0.5
|
||||
|
||||
/obj/item/mushroom_bowl
|
||||
name = "mushroom bowl"
|
||||
@@ -200,6 +206,6 @@
|
||||
/datum/crafting_recipe/mushroom_bowl
|
||||
name = "Mushroom Bowl"
|
||||
result = /obj/item/reagent_containers/food/drinks/mushroom_bowl
|
||||
reqs = list(/obj/item/reagent_containers/food/snacks/ash_flora/shavings = 5)
|
||||
reqs = list(/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings = 5)
|
||||
time = 30
|
||||
category = CAT_PRIMAL
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
|
||||
/obj/machinery/mineral/processing_unit/New()
|
||||
..()
|
||||
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE), INFINITY)
|
||||
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, TRUE, /obj/item/stack)
|
||||
files = new /datum/research/smelter(src)
|
||||
|
||||
/obj/machinery/mineral/processing_unit/Destroy()
|
||||
|
||||
@@ -274,7 +274,9 @@
|
||||
if(M.maxHealth != initial(M.maxHealth))
|
||||
to_chat(user, "[M] already has a reinforced chassis!")
|
||||
return
|
||||
var/previous = M.maxHealth
|
||||
M.maxHealth = 170
|
||||
M.health += M.maxHealth - previous
|
||||
to_chat(user, "You reinforce [M]'s chassis.")
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
/obj/machinery/mineral/mint/New()
|
||||
..()
|
||||
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_DIAMOND, MAT_BANANIUM, MAT_TRANQUILLITE), MINERAL_MATERIAL_AMOUNT * 50)
|
||||
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_DIAMOND, MAT_BANANIUM, MAT_TRANQUILLITE), MINERAL_MATERIAL_AMOUNT * 50, FALSE, /obj/item/stack)
|
||||
|
||||
/obj/machinery/mineral/mint/process()
|
||||
var/turf/T = get_step(src, input_dir)
|
||||
|
||||
@@ -30,7 +30,9 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
|
||||
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
|
||||
see_invisible = SEE_INVISIBLE_OBSERVER_AI_EYE
|
||||
see_in_dark = 100
|
||||
verbs += /mob/dead/observer/proc/dead_tele
|
||||
verbs += list(
|
||||
/mob/dead/observer/proc/dead_tele,
|
||||
/mob/dead/observer/proc/open_spawners_menu)
|
||||
|
||||
// Our new boo spell.
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/boo(null))
|
||||
@@ -677,3 +679,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
mind.transfer_to(new_char)
|
||||
else
|
||||
new_char.key = key
|
||||
|
||||
/mob/dead/observer/proc/open_spawners_menu()
|
||||
set name = "Mob spawners menu"
|
||||
set desc = "See all currently available ghost spawners"
|
||||
set category = "Ghost"
|
||||
|
||||
var/datum/spawners_menu/menu = new /datum/spawners_menu(src)
|
||||
menu.ui_interact(src)
|
||||
|
||||
@@ -281,6 +281,15 @@
|
||||
flags = RESTRICTED | WHITELISTED
|
||||
syllables = list("click","clack")
|
||||
|
||||
/datum/language/kidan/get_random_name()
|
||||
var/new_name = "[pick(list("Vrax", "Krek", "Vriz", "Zrik", "Zarak", "Click", "Zerk", "Drax", "Zven", "Drexx"))]"
|
||||
new_name += ", "
|
||||
new_name += "[pick(list("Noble", "Worker", "Scout", "Builder", "Farmer", "Gatherer", "Soldier", "Guard", "Prospector"))]"
|
||||
new_name += " of Clan "
|
||||
new_name += "[pick(list("Tristan", "Zarlan", "Clack", "Kkraz", "Zramn", "Orlan", "Zrax"))]" //I ran out of ideas after the first two tbh -_-
|
||||
return new_name
|
||||
|
||||
|
||||
/datum/language/slime
|
||||
name = "Bubblish"
|
||||
desc = "The language of slimes. It's a mixture of bubbling noises and pops. Very difficult to speak without mechanical aid for humans."
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
/mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked = 0)
|
||||
if(!skipcatch)
|
||||
if(in_throw_mode && !get_active_hand()) //empty active hand and we're in throw mode
|
||||
if(canmove && !restrained())
|
||||
if(istype(AM, /obj/item))
|
||||
var/obj/item/I = AM
|
||||
if(isturf(I.loc))
|
||||
put_in_active_hand(I)
|
||||
visible_message("<span class='warning'>[src] catches [I]!</span>")
|
||||
throw_mode_off()
|
||||
return 1
|
||||
if(in_throw_mode && canmove && !restrained()) //Makes sure player is in throw mode
|
||||
if(!istype(AM,/obj/item) || !isturf(AM.loc))
|
||||
return FALSE
|
||||
if(get_active_hand())
|
||||
return FALSE
|
||||
if(istype(AM, /obj/item/twohanded))
|
||||
if(get_inactive_hand())
|
||||
return FALSE
|
||||
put_in_active_hand(AM)
|
||||
visible_message("<span class='warning'>[src] catches [AM]!</span>")
|
||||
throw_mode_off()
|
||||
return TRUE
|
||||
..()
|
||||
|
||||
/mob/living/carbon/water_act(volume, temperature, source)
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
if("Yes")
|
||||
if(!I)
|
||||
return
|
||||
if(!Adjacent(usr))
|
||||
if(!Adjacent(target))
|
||||
to_chat(usr, "<span class='warning'> You need to stay in reaching distance while giving an object.</span>")
|
||||
to_chat(target, "<span class='warning'> [usr.name] moved too far away.</span>")
|
||||
return
|
||||
|
||||
@@ -58,9 +58,9 @@
|
||||
add_to_all_human_data_huds()
|
||||
|
||||
/mob/living/carbon/human/Destroy()
|
||||
. = ..()
|
||||
QDEL_LIST(bodyparts)
|
||||
splinted_limbs.Cut()
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/dummy
|
||||
real_name = "Test Dummy"
|
||||
@@ -730,25 +730,22 @@
|
||||
|
||||
if(hasHUD(usr, "security") && setcriminal != "Cancel")
|
||||
found_record = 1
|
||||
var/their_name = R.fields["name"]
|
||||
var/their_rank = R.fields["rank"]
|
||||
if(R.fields["criminal"] == "*Execute*")
|
||||
to_chat(usr, "<span class='warning'>Unable to modify the sec status of a person with an active Execution order. Use a security computer instead.</span>")
|
||||
else
|
||||
else
|
||||
var/rank
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/U = usr
|
||||
R.fields["comments"] += "Set to [setcriminal] by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [station_time_timestamp()] with comment: [t1]<BR>"
|
||||
if(isrobot(usr))
|
||||
rank = U.get_assignment()
|
||||
else if(isrobot(usr))
|
||||
var/mob/living/silicon/robot/U = usr
|
||||
R.fields["comments"] += "Set to [setcriminal] by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [station_time_timestamp()] with comment: [t1]<BR>"
|
||||
if(isAI(usr))
|
||||
var/mob/living/silicon/ai/U = usr
|
||||
R.fields["comments"] += "Set to [setcriminal] by [U.name] (artificial intelligence) on [current_date_string] [station_time_timestamp()] with comment: [t1]<BR>"
|
||||
|
||||
R.fields["criminal"] = setcriminal
|
||||
log_admin("[key_name_admin(usr)] set secstatus of [their_rank] [their_name] to [setcriminal], comment: [t1]")
|
||||
spawn()
|
||||
sec_hud_set_security_status()
|
||||
rank = "[U.modtype] [U.braintype]"
|
||||
else if(isAI(usr))
|
||||
rank = "AI"
|
||||
set_criminal_status(usr, R, setcriminal, t1, rank)
|
||||
break // Git out of the securiy records loop!
|
||||
if(found_record)
|
||||
break // Git out of the general records
|
||||
|
||||
if(!found_record)
|
||||
to_chat(usr, "<span class='warning'>Unable to locate a data core entry for this person.</span>")
|
||||
|
||||
@@ -538,7 +538,7 @@
|
||||
|
||||
/datum/species/proc/handle_hud_icons_health_side(mob/living/carbon/human/H)
|
||||
if(H.healths)
|
||||
if(H.stat == DEAD)
|
||||
if(H.stat == DEAD || (H.status_flags & FAKEDEATH))
|
||||
H.healths.icon_state = "health7"
|
||||
else
|
||||
switch(H.hal_screwyhud)
|
||||
@@ -557,7 +557,7 @@
|
||||
|
||||
/datum/species/proc/handle_hud_icons_health_doll(mob/living/carbon/human/H)
|
||||
if(H.healthdoll)
|
||||
if(H.stat == DEAD)
|
||||
if(H.stat == DEAD || (H.status_flags & FAKEDEATH))
|
||||
H.healthdoll.icon_state = "healthdoll_DEAD"
|
||||
if(H.healthdoll.overlays.len)
|
||||
H.healthdoll.overlays.Cut()
|
||||
@@ -628,7 +628,7 @@ It'll return null if the organ doesn't correspond, so include null checks when u
|
||||
else
|
||||
H.see_invisible = SEE_INVISIBLE_LIVING
|
||||
|
||||
if(H.client.eye != H)
|
||||
if(H.client && H.client.eye != H)
|
||||
var/atom/A = H.client.eye
|
||||
if(A.update_remote_sight(H)) //returns 1 if we override all other sight updates.
|
||||
return
|
||||
|
||||
@@ -292,8 +292,8 @@
|
||||
return
|
||||
|
||||
/mob/living/attack_animal(mob/living/simple_animal/M)
|
||||
if(M.melee_damage_upper == 0)
|
||||
M.custom_emote(1, "[M.friendly] [src]")
|
||||
if((M.a_intent == INTENT_HELP && M.ckey) || M.melee_damage_upper == 0)
|
||||
M.custom_emote(1, "[M.friendly] [src].")
|
||||
return 0
|
||||
else
|
||||
if(M.attack_sound)
|
||||
|
||||
@@ -274,7 +274,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
spawn(0)
|
||||
if(loc && !isturf(loc))
|
||||
var/atom/A = loc //Non-turf, let it handle the speech bubble
|
||||
A.speech_bubble("hR[speech_bubble_test]", A.loc, speech_bubble_recipients)
|
||||
A.speech_bubble("hR[speech_bubble_test]", A, speech_bubble_recipients)
|
||||
else //Turf, leave speech bubbles to the mob
|
||||
speech_bubble("h[speech_bubble_test]", src, speech_bubble_recipients)
|
||||
|
||||
|
||||
@@ -1119,15 +1119,15 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
/mob/living/silicon/ai/proc/check_unable(flags = 0)
|
||||
if(stat == DEAD)
|
||||
to_chat(usr, "<span class='warning'>You are dead!</span>")
|
||||
to_chat(src, "<span class='warning'>You are dead!</span>")
|
||||
return TRUE
|
||||
|
||||
if(lacks_power())
|
||||
to_chat(usr, "<span class='warning'>Power systems failure!</span>")
|
||||
to_chat(src, "<span class='warning'>Power systems failure!</span>")
|
||||
return TRUE
|
||||
|
||||
if((flags & AI_CHECK_WIRELESS) && control_disabled)
|
||||
to_chat(usr, "<span class='warning'>Wireless control is disabled!</span>")
|
||||
to_chat(src, "<span class='warning'>Wireless control is disabled!</span>")
|
||||
return TRUE
|
||||
if((flags & AI_CHECK_RADIO) && aiRadio.disabledAi)
|
||||
to_chat(src, "<span class='warning'>System Error - Transceiver Disabled!</span>")
|
||||
|
||||
@@ -225,9 +225,9 @@
|
||||
|
||||
// See software.dm for Topic()
|
||||
|
||||
/mob/living/silicon/pai/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
M.custom_emote(1, "[M.friendly] [src]")
|
||||
/mob/living/silicon/pai/attack_animal(mob/living/simple_animal/M)
|
||||
if((M.a_intent == INTENT_HELP && M.ckey) || M.melee_damage_upper == 0)
|
||||
M.custom_emote(1, "[M.friendly] [src].")
|
||||
else
|
||||
M.do_attack_animation(src)
|
||||
if(M.attack_sound)
|
||||
|
||||
@@ -132,7 +132,7 @@
|
||||
to_chat(user, "<span class='warning'>The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.</span>")
|
||||
return
|
||||
|
||||
if(!allowed(usr))
|
||||
if(!allowed(W))
|
||||
to_chat(user, "<span class='warning'>Access denied.</span>")
|
||||
return
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
if(emagged)
|
||||
return
|
||||
|
||||
if(allowed(usr))
|
||||
if(allowed(W))
|
||||
shut_down()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Access denied.</span>")
|
||||
@@ -223,6 +223,10 @@
|
||||
health = 35 - (getBruteLoss() + getFireLoss())
|
||||
update_stat("updatehealth([reason])")
|
||||
|
||||
/mob/living/silicon/robot/drone/death(gibbed)
|
||||
. = ..(gibbed)
|
||||
ghostize(can_reenter_corpse = 0)
|
||||
|
||||
|
||||
//CONSOLE PROCS
|
||||
/mob/living/silicon/robot/drone/proc/law_resync()
|
||||
|
||||
@@ -42,7 +42,10 @@
|
||||
if(UNCONSCIOUS)
|
||||
msg += "<span class='warning'>It doesn't seem to be responding.</span>\n"
|
||||
if(DEAD)
|
||||
msg += "<span class='deadsay'>It looks like its system is corrupted and requires a reset.</span>\n"
|
||||
if(!suiciding)
|
||||
msg += "<span class='deadsay'>It looks like its system is corrupted and requires a reset.</span>\n"
|
||||
else
|
||||
msg += "<span class='warning'>It looks like its system is corrupted beyond repair. There is no hope of recovery.</span>\n"
|
||||
msg += "*---------*</span>"
|
||||
|
||||
if(print_flavor_text()) msg += "\n[print_flavor_text()]\n"
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
|
||||
/mob/living/simple_animal/bot/medbot/syndicate/New()
|
||||
..()
|
||||
Radio.syndie = 1
|
||||
Radio.syndiekey = new /obj/item/encryptionkey/syndicate
|
||||
|
||||
/mob/living/simple_animal/bot/medbot/syndicate/emagged
|
||||
emagged = 2
|
||||
|
||||
@@ -32,24 +32,72 @@
|
||||
melee_damage_upper = 8
|
||||
attacktext = "bites"
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
var/chirp_sound = 'sound/misc/nymphchirp.ogg' //used in emote
|
||||
|
||||
speed = 0
|
||||
stop_automated_movement = 0
|
||||
turns_per_move = 4
|
||||
|
||||
var/list/donors = list()
|
||||
var/ready_evolve = 0
|
||||
holder_type = /obj/item/holder/diona
|
||||
can_collar = 1
|
||||
can_collar = TRUE
|
||||
|
||||
a_intent = INTENT_HELP
|
||||
var/gestalt_alert = "merged with gestalt" //used in adding and clearing alert
|
||||
var/evolve_donors = 5 //amount of blood donors needed before evolving
|
||||
var/awareness_donors = 3 //amount of blood donors needed for understand language
|
||||
var/nutrition_need = 500 //amount of nutrition needed before evolving
|
||||
|
||||
var/datum/action/innate/diona/merge/merge_action = new()
|
||||
var/datum/action/innate/diona/evolve/evolve_action = new()
|
||||
var/datum/action/innate/diona/steal_blood/steal_blood_action = new()
|
||||
|
||||
/datum/action/innate/diona/merge
|
||||
name = "Merge with gestalt"
|
||||
icon_icon = 'icons/mob/human_races/r_diona.dmi'
|
||||
button_icon_state = "preview"
|
||||
|
||||
/datum/action/innate/diona/merge/Activate()
|
||||
var/mob/living/simple_animal/diona/user = owner
|
||||
user.merge()
|
||||
|
||||
/datum/action/innate/diona/evolve
|
||||
name = "Evolve"
|
||||
icon_icon = 'icons/obj/cloning.dmi'
|
||||
button_icon_state = "pod_1"
|
||||
|
||||
/datum/action/innate/diona/evolve/Activate()
|
||||
var/mob/living/simple_animal/diona/user = owner
|
||||
user.evolve()
|
||||
|
||||
/datum/action/innate/diona/steal_blood
|
||||
name = "Steal blood"
|
||||
icon_icon = 'icons/obj/bloodpack.dmi'
|
||||
button_icon_state = "full"
|
||||
|
||||
/datum/action/innate/diona/steal_blood/Activate()
|
||||
var/mob/living/simple_animal/diona/user = owner
|
||||
user.steal_blood()
|
||||
|
||||
/mob/living/simple_animal/diona/New()
|
||||
..()
|
||||
if(name == initial(name)) //To stop Pun-Pun becoming generic.
|
||||
name = "[name] ([rand(1, 1000)])"
|
||||
real_name = name
|
||||
|
||||
add_language("Rootspeak")
|
||||
verbs += /mob/living/simple_animal/diona/proc/merge
|
||||
merge_action.Grant(src)
|
||||
evolve_action.Grant(src)
|
||||
steal_blood_action.Grant(src)
|
||||
|
||||
/mob/living/simple_animal/diona/UnarmedAttack(var/atom/A)
|
||||
if(isdiona(A) && (src in A.contents)) //can't attack your gestalt
|
||||
visible_message("[src] wiggles around a bit.")
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/diona/resist()
|
||||
..()
|
||||
split()
|
||||
|
||||
/mob/living/simple_animal/diona/attack_hand(mob/living/carbon/human/M)
|
||||
//Let people pick the little buggers up.
|
||||
@@ -57,88 +105,76 @@
|
||||
if(isdiona(M))
|
||||
to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.")
|
||||
to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.")
|
||||
verbs += /mob/living/simple_animal/diona/proc/split
|
||||
verbs -= /mob/living/simple_animal/diona/proc/merge
|
||||
throw_alert(gestalt_alert, /obj/screen/alert/nymph, new_master = src) //adds a screen alert that can call resist
|
||||
forceMove(M)
|
||||
else
|
||||
get_scooped(M)
|
||||
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/diona/proc/merge()
|
||||
set category = "Diona"
|
||||
set name = "Merge with gestalt"
|
||||
set desc = "Merge with another diona."
|
||||
|
||||
if(iscarbon(loc))
|
||||
verbs -= /mob/living/simple_animal/diona/proc/merge
|
||||
return
|
||||
if(stat != CONSCIOUS)
|
||||
return FALSE
|
||||
|
||||
var/list/choices = list()
|
||||
for(var/mob/living/carbon/C in view(1,src))
|
||||
|
||||
if(!(Adjacent(C)) || !(C.client))
|
||||
for(var/mob/living/carbon/human/H in view(1,src))
|
||||
if(!(Adjacent(H)) || !isdiona(H))
|
||||
continue
|
||||
choices += H
|
||||
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/D = C
|
||||
if(isdiona(D))
|
||||
choices += C
|
||||
if(!choices.len)
|
||||
to_chat(src, "<span class='warning'>No suitable diona nearby.</span>")
|
||||
return FALSE
|
||||
|
||||
var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices
|
||||
|
||||
if(!M || !src || !(Adjacent(M)))
|
||||
return
|
||||
if(!M || !src || !(Adjacent(M)) || stat != CONSCIOUS) //input can take a while, so re-validate
|
||||
return FALSE
|
||||
|
||||
if(ishuman(M))
|
||||
if(isdiona(M))
|
||||
to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.")
|
||||
M.status_flags |= PASSEMOTES
|
||||
|
||||
to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.")
|
||||
forceMove(M)
|
||||
verbs += /mob/living/simple_animal/diona/proc/split
|
||||
verbs -= /mob/living/simple_animal/diona/proc/merge
|
||||
throw_alert(gestalt_alert, /obj/screen/alert/nymph, new_master = src) //adds a screen alert that can call resist
|
||||
return TRUE
|
||||
else
|
||||
return
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/diona/proc/split()
|
||||
set category = "Diona"
|
||||
set name = "Split from gestalt"
|
||||
set desc = "Split away from your gestalt as a lone nymph."
|
||||
|
||||
if(!(iscarbon(loc)))
|
||||
verbs -= /mob/living/simple_animal/diona/proc/split
|
||||
return
|
||||
|
||||
if((stat != CONSCIOUS) || !isdiona(loc))
|
||||
return FALSE
|
||||
var/mob/living/carbon/human/D = loc
|
||||
T = get_turf(src)
|
||||
if(!T)
|
||||
return FALSE
|
||||
to_chat(loc, "You feel a pang of loss as [src] splits away from your biomass.")
|
||||
to_chat(src, "You wiggle out of the depths of [loc]'s biomass and plop to the ground.")
|
||||
forceMove(T)
|
||||
|
||||
var/hasMobs = FALSE
|
||||
for(var/atom/A in D.contents)
|
||||
if(istype(A, /mob/) || istype(A, /obj/item/holder))
|
||||
hasMobs = TRUE
|
||||
if(!hasMobs)
|
||||
D.status_flags &= ~PASSEMOTES
|
||||
|
||||
var/mob/living/M = loc
|
||||
clear_alert(gestalt_alert)
|
||||
return TRUE
|
||||
|
||||
forceMove(get_turf(src))
|
||||
verbs -= /mob/living/simple_animal/diona/proc/split
|
||||
verbs += /mob/living/simple_animal/diona/proc/merge
|
||||
|
||||
if(istype(M))
|
||||
for(var/atom/A in M.contents)
|
||||
if(istype(A, /mob/living/simple_animal/borer) || istype(A, /obj/item/holder))
|
||||
return
|
||||
M.status_flags &= ~PASSEMOTES
|
||||
|
||||
/mob/living/simple_animal/diona/verb/evolve()
|
||||
set category = "Diona"
|
||||
set name = "Evolve"
|
||||
set desc = "Grow to a more complex form."
|
||||
|
||||
if(donors.len < 5)
|
||||
/mob/living/simple_animal/diona/proc/evolve()
|
||||
if(stat != CONSCIOUS)
|
||||
return FALSE
|
||||
|
||||
if(donors.len < evolve_donors)
|
||||
to_chat(src, "<span class='warning'>You need more blood in order to ascend to a new state of consciousness...</span>")
|
||||
return
|
||||
return FALSE
|
||||
|
||||
if(nutrition < 500)
|
||||
if(nutrition < nutrition_need)
|
||||
to_chat(src, "<span class='warning'>You need to binge on weeds in order to have the energy to grow...</span>")
|
||||
return
|
||||
return FALSE
|
||||
|
||||
split()
|
||||
if(isdiona(loc) && !split()) //if it's merged with diona, needs to able to split before evolving
|
||||
return FALSE
|
||||
|
||||
visible_message("<span class='danger'>[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.</span>","<span class='danger'>You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.</span>")
|
||||
|
||||
var/mob/living/carbon/human/diona/adult = new(get_turf(loc))
|
||||
@@ -162,28 +198,33 @@
|
||||
unEquip(W)
|
||||
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/diona/verb/steal_blood()
|
||||
set category = "Diona"
|
||||
set name = "Steal Blood"
|
||||
set desc = "Take a blood sample from a suitable donor."
|
||||
|
||||
/mob/living/simple_animal/diona/proc/steal_blood()
|
||||
if(stat != CONSCIOUS)
|
||||
return FALSE
|
||||
|
||||
var/list/choices = list()
|
||||
for(var/mob/living/carbon/human/H in oview(1,src))
|
||||
choices += H
|
||||
if(Adjacent(H) && H.dna && !(NO_BLOOD in H.dna.species.species_traits))
|
||||
choices += H
|
||||
|
||||
if(!choices.len)
|
||||
to_chat(src, "<span class='warning'>No suitable blood donors nearby.</span>")
|
||||
return FALSE
|
||||
|
||||
var/mob/living/carbon/human/M = input(src,"Who do you wish to take a sample from?") in null|choices
|
||||
|
||||
if(!M || !src)
|
||||
return
|
||||
if(!M || !src || !(Adjacent(M)) || stat != CONSCIOUS) //input can take a while, so re-validate
|
||||
return FALSE
|
||||
|
||||
if(NO_BLOOD in M.dna.species.species_traits)
|
||||
if(!M.dna || (NO_BLOOD in M.dna.species.species_traits))
|
||||
to_chat(src, "<span class='warning'>That donor has no blood to take.</span>")
|
||||
return
|
||||
return FALSE
|
||||
|
||||
if(donors.Find(M.real_name))
|
||||
to_chat(src, "<span class='warning'>That donor offers you nothing new.</span>")
|
||||
return
|
||||
return FALSE
|
||||
|
||||
visible_message("<span class='danger'>[src] flicks out a feeler and neatly steals a sample of [M]'s blood.</span>","<span class='danger'>You flick out a feeler and neatly steal a sample of [M]'s blood.</span>")
|
||||
donors += M.real_name
|
||||
@@ -195,13 +236,12 @@
|
||||
update_progression()
|
||||
|
||||
/mob/living/simple_animal/diona/proc/update_progression()
|
||||
if(!donors.len)
|
||||
return
|
||||
if(stat != CONSCIOUS || !donors.len)
|
||||
return FALSE
|
||||
|
||||
if(donors.len == 5)
|
||||
ready_evolve = 1
|
||||
if(donors.len == evolve_donors)
|
||||
to_chat(src, "<span class='noticealien'>You feel ready to move on to your next stage of growth.</span>")
|
||||
else if(donors.len == 3)
|
||||
else if(donors.len == awareness_donors)
|
||||
universal_understand = 1
|
||||
to_chat(src, "<span class='noticealien'>You feel your awareness expand, and realize you know how to understand the creatures around you.</span>")
|
||||
else
|
||||
@@ -219,7 +259,7 @@
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/diona/emote(act, m_type=1, message = null)
|
||||
if(stat)
|
||||
if(stat != CONSCIOUS)
|
||||
return
|
||||
|
||||
var/on_CD = 0
|
||||
@@ -237,6 +277,6 @@
|
||||
if("chirp")
|
||||
message = "<B>\The [src]</B> chirps!"
|
||||
m_type = 2 //audible
|
||||
playsound(src, 'sound/misc/nymphchirp.ogg', 40, 1, 1)
|
||||
playsound(src, chirp_sound, 40, 1, 1)
|
||||
|
||||
..(act, m_type, message)
|
||||
@@ -23,6 +23,11 @@
|
||||
var/datum/mind/origin
|
||||
var/egg_lain = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/headcrab/examine(mob/user)
|
||||
..()
|
||||
if(stat == DEAD)
|
||||
to_chat(desc = "It appears to be dead.")
|
||||
|
||||
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
|
||||
var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim)
|
||||
egg.insert(victim)
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
var/check_friendly_fire = 0 // Should the ranged mob check for friendlies when shooting
|
||||
var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat.
|
||||
var/minimum_distance = 1 //Minimum approach distance, so ranged mobs chase targets down, but still keep their distance set in tiles to the target, set higher to make mobs keep distance
|
||||
|
||||
|
||||
//These vars are related to how mobs locate and target
|
||||
var/robust_searching = 0 //By default, mobs have a simple searching method, set this to 1 for the more scrutinous searching (stat_attack, stat_exclusive, etc), should be disabled on most mobs
|
||||
var/vision_range = 9 //How big of an area to search for targets in, a vision of 9 attempts to find targets as soon as they walk into screen view
|
||||
|
||||
@@ -101,7 +101,7 @@ Difficulty: Medium
|
||||
animate(src, pixel_z = 0, time = 12)
|
||||
|
||||
/obj/effect/temp_visual/target
|
||||
icon = 'icons/mob/actions.dmi'
|
||||
icon = 'icons/mob/actions/actions.dmi'
|
||||
icon_state = "sniper_zoom"
|
||||
layer = MOB_LAYER - 0.1
|
||||
luminosity = 2
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
|
||||
/datum/action/innate/terrorspider/queen/queensense
|
||||
name = "Hive Sense"
|
||||
icon_icon = 'icons/mob/actions.dmi'
|
||||
icon_icon = 'icons/mob/actions/actions.dmi'
|
||||
button_icon_state = "mindswap"
|
||||
|
||||
/datum/action/innate/terrorspider/queen/queensense/Activate()
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/mob/new_player
|
||||
var/ready = 0
|
||||
var/skip_antag = 0 //For declining an antag roll this round.
|
||||
var/spawning = 0 //Referenced when you want to delete the new_player later on in the code.
|
||||
var/totalPlayers = 0 //Player counts for the Lobby tab
|
||||
var/totalPlayersReady = 0
|
||||
@@ -65,16 +64,16 @@
|
||||
if(!ticker || ticker.current_state <= GAME_STATE_PREGAME)
|
||||
if(!ready) output += "<p><a href='byond://?src=[UID()];ready=1'>Declare Ready</A></p>"
|
||||
else output += "<p><b>You are ready</b> (<a href='byond://?src=[UID()];ready=2'>Cancel</A>)</p>"
|
||||
|
||||
var/list/antags = client.prefs.be_special
|
||||
if(antags && antags.len)
|
||||
if(!skip_antag) output += "<p><a href='byond://?src=[UID()];skip_antag=1'>Global Antag Candidacy</A>"
|
||||
else output += "<p><a href='byond://?src=[UID()];skip_antag=2'>Global Antag Candidacy</A>"
|
||||
output += "<br /><small>You are <b>[skip_antag ? "ineligible" : "eligible"]</b> for all antag roles.</small></p>"
|
||||
else
|
||||
output += "<p><a href='byond://?src=[UID()];manifest=1'>View the Crew Manifest</A></p>"
|
||||
output += "<p><a href='byond://?src=[UID()];late_join=1'>Join Game!</A></p>"
|
||||
|
||||
var/list/antags = client.prefs.be_special
|
||||
if(antags && antags.len)
|
||||
if(!client.skip_antag) output += "<p><a href='byond://?src=[UID()];skip_antag=1'>Global Antag Candidacy</A>"
|
||||
else output += "<p><a href='byond://?src=[UID()];skip_antag=2'>Global Antag Candidacy</A>"
|
||||
output += "<br /><small>You are <b>[client.skip_antag ? "ineligible" : "eligible"]</b> for all antag roles.</small></p>"
|
||||
|
||||
output += "<p><a href='byond://?src=[UID()];observe=1'>Observe</A></p>"
|
||||
|
||||
if(GLOB.join_tos)
|
||||
@@ -172,7 +171,7 @@
|
||||
new_player_panel_proc()
|
||||
|
||||
if(href_list["skip_antag"])
|
||||
skip_antag = !skip_antag
|
||||
client.skip_antag = !client.skip_antag
|
||||
new_player_panel_proc()
|
||||
|
||||
if(href_list["refresh"])
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
return
|
||||
if(!AM || !isturf(AM.loc)) //if there's no object or the object being pulled is inside something: abort!
|
||||
return
|
||||
if(incapacitated())
|
||||
return
|
||||
if(!(AM.anchored))
|
||||
AM.add_fingerprint(src)
|
||||
|
||||
@@ -14,7 +16,6 @@
|
||||
if(AM == pulling)
|
||||
return
|
||||
stop_pulling()
|
||||
|
||||
if(AM.pulledby)
|
||||
visible_message("<span class='danger'>[src] has pulled [AM] from [AM.pulledby]'s grip.</span>")
|
||||
AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
|
||||
|
||||
@@ -71,7 +71,8 @@
|
||||
|
||||
|
||||
update_icon()
|
||||
attack_self(usr) //Update the browsed page.
|
||||
if(winget(usr, "[name]", "is-visible") == "true") // NOT MY FAULT IT IS A BUILT IN PROC PLEASE DO NOT HIT ME
|
||||
attack_self(usr) //Update the browsed page.
|
||||
add_fingerprint(usr)
|
||||
return
|
||||
|
||||
|
||||
@@ -110,10 +110,11 @@
|
||||
H.emote("scream")
|
||||
|
||||
/obj/item/paper/AltClick(mob/user, obj/item/I)
|
||||
var/mob/living/carbon/human/H = user
|
||||
I = H.is_in_hands(/obj/item/paper)
|
||||
if(I)
|
||||
ProcFoldPlane(H, I)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
I = H.is_in_hands(/obj/item/paper)
|
||||
if(I)
|
||||
ProcFoldPlane(H, I)
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
@@ -230,6 +230,7 @@
|
||||
new/datum/data/pda/app/janitor,
|
||||
|
||||
new/datum/data/pda/app/supply,
|
||||
new/datum/data/pda/app/mule_control,
|
||||
|
||||
new/datum/data/pda/app/status_display)
|
||||
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
#define CHARS_PER_LINE 5
|
||||
#define FONT_SIZE "5pt"
|
||||
#define FONT_COLOR "#09f"
|
||||
#define FONT_STYLE "Arial Black"
|
||||
#define FONT_STYLE "Small Fonts"
|
||||
|
||||
/obj/machinery/treadmill_monitor
|
||||
name = "Treadmill Monitor"
|
||||
@@ -126,6 +126,7 @@
|
||||
density = 0
|
||||
maptext_height = 26
|
||||
maptext_width = 32
|
||||
maptext_y = -1
|
||||
|
||||
var/on = 0 // if we should be metering or not
|
||||
var/id = null // id of treadmill
|
||||
@@ -200,6 +201,8 @@
|
||||
//Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display
|
||||
// Stolen from status_display
|
||||
/obj/machinery/treadmill_monitor/proc/update_display(var/line1, var/line2)
|
||||
line1 = uppertext(line1)
|
||||
line2 = uppertext(line2)
|
||||
var/new_text = {"<div style="font-size:[FONT_SIZE];color:[FONT_COLOR];font:'[FONT_STYLE]';text-align:center;" valign="top">[line1]<br>[line2]</div>"}
|
||||
if(maptext != new_text)
|
||||
maptext = new_text
|
||||
|
||||
@@ -1236,3 +1236,107 @@
|
||||
drink_icon = "synthignonglass"
|
||||
drink_name = "Glass of Synthignon"
|
||||
drink_desc = "Someone mixed good wine and robot booze. Romantic, but atrocious."
|
||||
|
||||
/datum/reagent/consumable/ethanol/fruit_wine
|
||||
name = "Fruit Wine"
|
||||
id = "fruit_wine"
|
||||
description = "A wine made from grown plants."
|
||||
color = "#FFFFFF"
|
||||
alcohol_perc = 0.35
|
||||
taste_message = "bad coding"
|
||||
can_synth = FALSE
|
||||
var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit.
|
||||
var/list/tastes = list("bad coding" = 1) //List of tastes. See above.
|
||||
|
||||
/datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data)
|
||||
names = data["names"]
|
||||
tastes = data["tastes"]
|
||||
alcohol_perc = data["alcohol_perc"]
|
||||
color = data["color"]
|
||||
generate_data_info(data)
|
||||
|
||||
/datum/reagent/consumable/ethanol/fruit_wine/on_merge(list/data, amount)
|
||||
var/diff = (amount/volume)
|
||||
if(diff < 1)
|
||||
color = BlendRGB(color, data["color"], diff/2) //The percentage difference over two, so that they take average if equal.
|
||||
else
|
||||
color = BlendRGB(color, data["color"], (1/diff)/2) //Adjust so it's always blending properly.
|
||||
var/oldvolume = volume-amount
|
||||
|
||||
var/list/cachednames = data["names"]
|
||||
for(var/name in names | cachednames)
|
||||
names[name] = ((names[name] * oldvolume) + (cachednames[name] * amount)) / volume
|
||||
|
||||
var/list/cachedtastes = data["tastes"]
|
||||
for(var/taste in tastes | cachedtastes)
|
||||
tastes[taste] = ((tastes[taste] * oldvolume) + (cachedtastes[taste] * amount)) / volume
|
||||
|
||||
alcohol_perc *= oldvolume
|
||||
var/newzepwr = data["alcohol_perc"] * amount
|
||||
alcohol_perc += newzepwr
|
||||
alcohol_perc /= volume //Blending alcohol percentage to volume.
|
||||
generate_data_info(data)
|
||||
|
||||
/datum/reagent/consumable/ethanol/fruit_wine/proc/generate_data_info(list/data)
|
||||
var/minimum_percent = 0.15 //Percentages measured between 0 and 1.
|
||||
var/list/primary_tastes = list()
|
||||
var/list/secondary_tastes = list()
|
||||
drink_name = "glass of [name]"
|
||||
drink_desc = description
|
||||
for(var/taste in tastes)
|
||||
switch(tastes[taste])
|
||||
if(minimum_percent*2 to INFINITY)
|
||||
primary_tastes += taste
|
||||
if(minimum_percent to minimum_percent*2)
|
||||
secondary_tastes += taste
|
||||
|
||||
var/minimum_name_percent = 0.35
|
||||
name = ""
|
||||
var/list/names_in_order = sortTim(names, /proc/cmp_numeric_dsc, TRUE)
|
||||
var/named = FALSE
|
||||
for(var/fruit_name in names)
|
||||
if(names[fruit_name] >= minimum_name_percent)
|
||||
name += "[fruit_name] "
|
||||
named = TRUE
|
||||
if(named)
|
||||
name += "wine"
|
||||
else
|
||||
name = "mixed [names_in_order[1]] wine"
|
||||
|
||||
var/alcohol_description
|
||||
switch(alcohol_perc)
|
||||
if(1.2 to INFINITY)
|
||||
alcohol_description = "suicidally strong"
|
||||
if(0.9 to 1.2)
|
||||
alcohol_description = "rather strong"
|
||||
if(0.7 to 0.9)
|
||||
alcohol_description = "strong"
|
||||
if(0.4 to 0.7)
|
||||
alcohol_description = "rich"
|
||||
if(0.2 to 0.4)
|
||||
alcohol_description = "mild"
|
||||
if(0 to 0.2)
|
||||
alcohol_description = "sweet"
|
||||
else
|
||||
alcohol_description = "watery" //How the hell did you get negative boozepwr?
|
||||
|
||||
var/list/fruits = list()
|
||||
if(names_in_order.len <= 3)
|
||||
fruits = names_in_order
|
||||
else
|
||||
for(var/i in 1 to 3)
|
||||
fruits += names_in_order[i]
|
||||
fruits += "other plants"
|
||||
var/fruit_list = english_list(fruits)
|
||||
description = "A [alcohol_description] wine brewed from [fruit_list]."
|
||||
|
||||
var/flavor = ""
|
||||
if(!primary_tastes.len)
|
||||
primary_tastes = list("[alcohol_description] alcohol")
|
||||
flavor += english_list(primary_tastes)
|
||||
if(secondary_tastes.len)
|
||||
flavor += ", with a hint of "
|
||||
flavor += english_list(secondary_tastes)
|
||||
taste_message = flavor
|
||||
if(holder.my_atom)
|
||||
holder.my_atom.on_reagent_change()
|
||||
|
||||
@@ -163,12 +163,12 @@
|
||||
|
||||
/datum/reagent/consumable/drink/cold/rewriter
|
||||
name = "Rewriter"
|
||||
description = "The secert of the sanctuary of the Libarian..."
|
||||
description = "The secret of the sanctuary of the Librarian..."
|
||||
id = "rewriter"
|
||||
color = "#485000" // rgb:72, 080, 0
|
||||
drink_icon = "rewriter"
|
||||
drink_name = "Rewriter"
|
||||
drink_desc = "The secert of the sanctuary of the Libarian..."
|
||||
drink_desc = "The secret of the sanctuary of the Librarian..."
|
||||
taste_message = "coffee...soda?"
|
||||
|
||||
/datum/reagent/consumable/drink/cold/rewriter/on_mob_life(mob/living/M)
|
||||
|
||||
@@ -275,6 +275,13 @@
|
||||
color = "#FFFFFF"
|
||||
taste_message = "the rainbow"
|
||||
|
||||
/datum/reagent/colorful_reagent/on_mob_life(mob/living/M)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!(NO_BLOOD in H.dna.species.species_traits) && !H.dna.species.exotic_blood)
|
||||
H.dna.species.blood_color = "#[num2hex(rand(0, 255))][num2hex(rand(0, 255))][num2hex(rand(0, 255))]"
|
||||
return ..()
|
||||
|
||||
/datum/reagent/colorful_reagent/reaction_mob(mob/living/simple_animal/M, method=TOUCH, volume)
|
||||
if(isanimal(M))
|
||||
M.color = pick(random_color_list)
|
||||
|
||||
@@ -116,6 +116,12 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#FFA500"
|
||||
|
||||
/datum/reagent/sorium_vortex
|
||||
name = "sorium_vortex"
|
||||
id = "sorium_vortex"
|
||||
reagent_state = LIQUID
|
||||
color = "#FFA500"
|
||||
|
||||
/datum/reagent/liquid_dark_matter
|
||||
name = "Liquid Dark Matter"
|
||||
id = "liquid_dark_matter"
|
||||
@@ -124,6 +130,12 @@
|
||||
color = "#800080"
|
||||
taste_message = "the end of the world"
|
||||
|
||||
/datum/reagent/ldm_vortex
|
||||
name = "LDM Vortex"
|
||||
id = "ldm_vortex"
|
||||
reagent_state = LIQUID
|
||||
color = "#800080"
|
||||
|
||||
/datum/reagent/blackpowder
|
||||
name = "Black Powder"
|
||||
id = "blackpowder"
|
||||
|
||||
@@ -104,13 +104,15 @@
|
||||
/datum/chemical_reaction/sorium_vortex
|
||||
name = "sorium_vortex"
|
||||
id = "sorium_vortex"
|
||||
result = null
|
||||
result = "sorium_vortex"
|
||||
required_reagents = list("sorium" = 1)
|
||||
result_amount = 1
|
||||
min_temp = 474
|
||||
|
||||
/datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/turf/simulated/T = get_turf(holder.my_atom)
|
||||
goonchem_vortex(T, 1, min(10, created_volume), min(11, created_volume + 1))
|
||||
holder.remove_reagent("sorium_vortex", created_volume)
|
||||
|
||||
/datum/chemical_reaction/liquid_dark_matter
|
||||
name = "Liquid Dark Matter"
|
||||
@@ -129,13 +131,15 @@
|
||||
/datum/chemical_reaction/ldm_vortex
|
||||
name = "LDM Vortex"
|
||||
id = "ldm_vortex"
|
||||
result = null
|
||||
result = "ldm_vortex"
|
||||
required_reagents = list("liquid_dark_matter" = 1)
|
||||
result_amount = 1
|
||||
min_temp = 474
|
||||
|
||||
/datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/turf/simulated/T = get_turf(holder.my_atom)
|
||||
goonchem_vortex(T, 0, min(10, created_volume), min(11, created_volume + 1))
|
||||
holder.remove_reagent("ldm_vortex", created_volume)
|
||||
|
||||
/datum/chemical_reaction/blackpowder
|
||||
name = "Black Powder"
|
||||
|
||||
@@ -95,7 +95,6 @@
|
||||
spawn(5) reagents.clear_reagents()
|
||||
return
|
||||
else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
|
||||
|
||||
if(target.reagents && !target.reagents.total_volume)
|
||||
to_chat(user, "<span class='warning'>[target] is empty and can't be refilled!</span>")
|
||||
return
|
||||
@@ -107,7 +106,7 @@
|
||||
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
|
||||
to_chat(user, "<span class='notice'>You fill [src] with [trans] unit\s of the contents of [target].</span>")
|
||||
|
||||
else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it.
|
||||
else if(target.is_refillable() && is_drainable()) //Something like a glass. Player probably wants to transfer TO it.
|
||||
if(!reagents.total_volume)
|
||||
to_chat(user, "<span class='warning'>[src] is empty.</span>")
|
||||
return
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#define DIRECTION_FORWARDS 1
|
||||
#define DIRECTION_OFF 0
|
||||
#define DIRECTION_REVERSED -1
|
||||
#define IS_OPERATING (operating && can_conveyor_run())
|
||||
|
||||
GLOBAL_LIST_INIT(conveyor_belts, list()) //Saves us having to look through the entire machines list for our things
|
||||
GLOBAL_LIST_INIT(conveyor_switches, list())
|
||||
@@ -22,7 +23,6 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
|
||||
var/operable = TRUE // Can this belt actually go?
|
||||
var/list/affecting // the list of all items that will be moved this ptick
|
||||
var/reversed = FALSE // set to TRUE to have the conveyor belt be reversed
|
||||
speed_process = TRUE //gotta go fast
|
||||
var/id //ID of the connected lever
|
||||
|
||||
// create a conveyor
|
||||
@@ -84,7 +84,7 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
|
||||
|
||||
/obj/machinery/conveyor/update_icon()
|
||||
..()
|
||||
if(operating && can_conveyor_run())
|
||||
if(IS_OPERATING)
|
||||
icon_state = "conveyor_started_[clockwise ? "cw" : "ccw"]"
|
||||
if(reversed)
|
||||
icon_state += "_r"
|
||||
@@ -161,20 +161,30 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/conveyor/process()
|
||||
if(!operating)
|
||||
return
|
||||
if(!can_conveyor_run())
|
||||
if(!IS_OPERATING)
|
||||
return
|
||||
use_power(100)
|
||||
affecting = loc.contents - src // moved items will be all in loc
|
||||
if(!affecting)
|
||||
return
|
||||
sleep(1)
|
||||
for(var/atom/movable/A in affecting)
|
||||
if(!A.anchored)
|
||||
if(A.loc == loc) // prevents the object from being affected if it's not currently here.
|
||||
step(A,forwards)
|
||||
var/still_stuff_to_move = FALSE
|
||||
for(var/atom/movable/AM in affecting)
|
||||
if(AM.anchored)
|
||||
continue
|
||||
still_stuff_to_move = TRUE
|
||||
addtimer(CALLBACK(src, .proc/move_thing, AM), 1)
|
||||
CHECK_TICK
|
||||
if(!still_stuff_to_move && speed_process)
|
||||
makeNormalProcess()
|
||||
else if(still_stuff_to_move && !speed_process)
|
||||
makeSpeedProcess()
|
||||
|
||||
/obj/machinery/conveyor/Crossed(atom/movable/AM)
|
||||
if(!speed_process && !AM.anchored)
|
||||
makeSpeedProcess()
|
||||
..()
|
||||
|
||||
/obj/machinery/conveyor/proc/move_thing(atom/movable/AM)
|
||||
if(!AM.anchored && AM.loc == loc)
|
||||
step(AM, forwards)
|
||||
|
||||
/obj/machinery/conveyor/proc/can_conveyor_run()
|
||||
if(stat & BROKEN)
|
||||
@@ -475,3 +485,4 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
|
||||
#undef DIRECTION_FORWARDS
|
||||
#undef DIRECTION_OFF
|
||||
#undef DIRECTION_REVERSED
|
||||
#undef IS_OPERATING
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
T.nicely_link_to_other_stuff(src)
|
||||
|
||||
//When the disposalsoutlet is forcefully moved. Due to meteorshot (not the recall spell)
|
||||
/obj/machinery/disposal/Moved(atom/OldLoc, Dir)
|
||||
/obj/machinery/disposal/Moved(atom/OldLoc, Dir)
|
||||
. = ..()
|
||||
eject()
|
||||
var/ptype = istype(src, /obj/machinery/disposal/deliveryChute) ? PIPE_DISPOSALS_CHUTE : PIPE_DISPOSALS_BIN //Check what disposaltype it is
|
||||
@@ -1220,24 +1220,27 @@
|
||||
// if not entering from disposal bin,
|
||||
// transfer to linked object (outlet or bin)
|
||||
|
||||
/obj/structure/disposalpipe/trunk/transfer(var/obj/structure/disposalholder/H)
|
||||
|
||||
/obj/structure/disposalpipe/trunk/transfer(obj/structure/disposalholder/H)
|
||||
if(!H)
|
||||
return
|
||||
if(H.dir == DOWN) // we just entered from a disposer
|
||||
return ..() // so do base transfer proc
|
||||
// otherwise, go to the linked object
|
||||
if(linked)
|
||||
var/obj/structure/disposaloutlet/O = linked
|
||||
if(istype(O) && (H))
|
||||
O.expel(H) // expel at outlet
|
||||
else
|
||||
var/obj/machinery/disposal/D = linked
|
||||
if(H)
|
||||
D.expel(H) // expel at disposal
|
||||
else
|
||||
if(H)
|
||||
src.expel(H, src.loc, 0) // expel at turf
|
||||
return null
|
||||
|
||||
if(!linked)
|
||||
expel(H, loc, FALSE) // expel at turf
|
||||
else if(istype(linked, /obj/structure/disposaloutlet))
|
||||
var/obj/structure/disposaloutlet/DO = linked
|
||||
for(var/atom/movable/AM in H)
|
||||
AM.forceMove(DO)
|
||||
qdel(H)
|
||||
H.vent_gas(loc)
|
||||
DO.expel()
|
||||
else if(istype(linked, /obj/machinery/disposal))
|
||||
var/obj/machinery/disposal/D = linked
|
||||
H.forceMove(D)
|
||||
D.expel(H) // expel at disposal
|
||||
else //just in case
|
||||
expel(H, loc, FALSE)
|
||||
// nextdir
|
||||
|
||||
/obj/structure/disposalpipe/trunk/nextdir(var/fromdir)
|
||||
@@ -1283,24 +1286,29 @@
|
||||
if(T)
|
||||
T.nicely_link_to_other_stuff(src)
|
||||
|
||||
// expel the contents of the holder object, then delete it
|
||||
// called when the holder exits the outlet
|
||||
/obj/structure/disposaloutlet/proc/expel(var/obj/structure/disposalholder/H, animation = 1)
|
||||
/obj/structure/disposaloutlet/Destroy()
|
||||
if(linkedtrunk)
|
||||
linkedtrunk.remove_trunk_links()
|
||||
expel(FALSE)
|
||||
return ..()
|
||||
|
||||
|
||||
// expel the contents of the outlet
|
||||
/obj/structure/disposaloutlet/proc/expel(animation = TRUE)
|
||||
if(animation)
|
||||
flick("outlet-open", src)
|
||||
playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0)
|
||||
sleep(20) //wait until correct animation frame
|
||||
playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
|
||||
if(H)
|
||||
for(var/atom/movable/AM in H)
|
||||
AM.forceMove(loc)
|
||||
AM.pipe_eject(dir)
|
||||
if(!istype(AM,/mob/living/silicon/robot/drone)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z
|
||||
spawn(5)
|
||||
if(AM)
|
||||
AM.throw_at(target, 3, 1)
|
||||
H.vent_gas(src.loc)
|
||||
qdel(H)
|
||||
for(var/atom/movable/AM in contents)
|
||||
AM.forceMove(loc)
|
||||
AM.pipe_eject(dir)
|
||||
if(istype(AM,/mob/living/silicon/robot/drone)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z
|
||||
return
|
||||
spawn(5)
|
||||
if(QDELETED(AM))
|
||||
return
|
||||
AM.throw_at(target, 3, 1)
|
||||
|
||||
|
||||
/obj/structure/disposaloutlet/attackby(var/obj/item/I, var/mob/user, params)
|
||||
@@ -1339,7 +1347,7 @@
|
||||
return
|
||||
|
||||
//When the disposalsoutlet is forcefully moved. Due to meteorshot or the recall item spell for instance
|
||||
/obj/structure/disposaloutlet/Moved(atom/OldLoc, Dir)
|
||||
/obj/structure/disposaloutlet/Moved(atom/OldLoc, Dir)
|
||||
. = ..()
|
||||
var/turf/T = OldLoc
|
||||
if(T.intact)
|
||||
@@ -1356,11 +1364,6 @@
|
||||
C.density = 1
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/disposaloutlet/Destroy()
|
||||
if(linkedtrunk)
|
||||
linkedtrunk.remove_trunk_links()
|
||||
return ..()
|
||||
|
||||
// called when movable is expelled from a disposal pipe or outlet
|
||||
// by default does nothing, override for special behaviour
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
/obj/machinery/r_n_d/New()
|
||||
materials = AddComponent(/datum/component/material_container,
|
||||
list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE, MAT_PLASTIC), 0,
|
||||
FALSE, list(/obj/item/stack, /obj/item/stack/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
|
||||
TRUE, /obj/item/stack, CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
|
||||
materials.precise_insertion = TRUE
|
||||
..()
|
||||
wires["Red"] = 0
|
||||
|
||||
@@ -21,7 +21,8 @@
|
||||
var/dirt_count = 0
|
||||
var/list/init_list = list()
|
||||
|
||||
/datum/space_level/New(z, name, transition_type = SELFLOOPING, traits = list(BLOCK_TELEPORT))
|
||||
/datum/space_level/New(z, level_name, transition_type = SELFLOOPING, traits = list(BLOCK_TELEPORT))
|
||||
name = level_name
|
||||
zpos = z
|
||||
flags = traits
|
||||
build_space_destination_arrays()
|
||||
|
||||
@@ -199,13 +199,16 @@
|
||||
deal_damage(P.damage)
|
||||
P.on_hit(src)
|
||||
|
||||
/obj/spacepod/AllowDrop()
|
||||
return TRUE
|
||||
|
||||
/obj/spacepod/blob_act()
|
||||
deal_damage(30)
|
||||
return
|
||||
|
||||
/obj/spacepod/attack_animal(mob/living/simple_animal/user as mob)
|
||||
if(user.melee_damage_upper == 0)
|
||||
user.custom_emote(1, "[user.friendly] [src]")
|
||||
/obj/spacepod/attack_animal(mob/living/simple_animal/user)
|
||||
if((user.a_intent == INTENT_HELP && user.ckey) || user.melee_damage_upper == 0)
|
||||
user.custom_emote(1, "[user.friendly] [src].")
|
||||
else
|
||||
var/damage = rand(user.melee_damage_lower, user.melee_damage_upper)
|
||||
deal_damage(damage)
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
BLOOD SYSTEM
|
||||
****************************************************/
|
||||
|
||||
#define EXOTIC_BLEED_MULTIPLIER 4 //Multiplies the actually bled amount by this number for the purposes of turf reaction calculations.
|
||||
|
||||
/mob/living/carbon/human/proc/suppress_bloodloss(amount)
|
||||
if(bleedsuppress)
|
||||
return
|
||||
@@ -104,7 +106,7 @@
|
||||
if(dna.species.exotic_blood)
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[get_blood_id()]
|
||||
if(istype(R) && isturf(loc))
|
||||
R.reaction_turf(get_turf(src), amt)
|
||||
R.reaction_turf(get_turf(src), amt * EXOTIC_BLEED_MULTIPLIER)
|
||||
|
||||
/mob/living/proc/restore_blood()
|
||||
blood_volume = initial(blood_volume)
|
||||
|
||||
@@ -19,10 +19,9 @@
|
||||
pixel_y = rand(-5, 5)
|
||||
|
||||
/obj/item/stack/ore/bluespace_crystal/attack_self(var/mob/user)
|
||||
blink_mob(user)
|
||||
user.drop_item()
|
||||
user.visible_message("<span class='notice'>[user] crushes the [src]!</span>")
|
||||
qdel(src)
|
||||
if(use(1))
|
||||
blink_mob(user)
|
||||
user.visible_message("<span class='notice'>[user] crushes a [singular_name]!</span>")
|
||||
|
||||
/obj/item/stack/ore/bluespace_crystal/proc/blink_mob(var/mob/living/L)
|
||||
if(!is_teleport_allowed(L.z))
|
||||
|
||||
Reference in New Issue
Block a user