mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 03:57:13 +01:00
conflict resolution
This commit is contained in:
@@ -807,7 +807,8 @@ var/global/nologevent = 0
|
||||
var/turf/T = get_turf(usr.loc)
|
||||
T.ChangeTurf(chosen)
|
||||
else
|
||||
new chosen(usr.loc)
|
||||
var/atom/A = new chosen(usr.loc)
|
||||
A.admin_spawned = TRUE
|
||||
|
||||
log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])")
|
||||
feedback_add_details("admin_verb","SA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -164,7 +164,9 @@ var/list/admin_verbs_debug = list(
|
||||
/client/proc/map_template_upload,
|
||||
/client/proc/view_runtimes,
|
||||
/client/proc/admin_serialize,
|
||||
/client/proc/admin_deserialize
|
||||
/client/proc/admin_deserialize,
|
||||
/client/proc/jump_to_ruin,
|
||||
/client/proc/toggle_medal_disable
|
||||
)
|
||||
var/list/admin_verbs_possess = list(
|
||||
/proc/possess,
|
||||
|
||||
@@ -393,8 +393,11 @@
|
||||
logout_status = " <i>(snpc)</i>"
|
||||
else
|
||||
logout_status = M.client ? "" : " <i>(logged out)</i>"
|
||||
var/dname = M.real_name
|
||||
if(!dname)
|
||||
dname = M
|
||||
|
||||
return {"<tr><td><a href='?src=[UID()];adminplayeropts=\ref[M]'>[M.real_name]</a><b>[caption]</b>[logout_status][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>
|
||||
return {"<tr><td><a href='?src=[UID()];adminplayeropts=\ref[M]'>[dname]</a><b>[caption]</b>[logout_status][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>
|
||||
<td><A href='?src=[usr.UID()];priv_msg=\ref[M]'>PM</A></td>[close ? "</tr>" : ""]"}
|
||||
|
||||
/datum/admins/proc/check_antagonists()
|
||||
@@ -424,7 +427,7 @@
|
||||
else
|
||||
dat += "<tr><td><i>Nuclear Operative not found!</i></td></tr>"
|
||||
dat += "</table><br><table><tr><td><B>Nuclear Disk(s)</B></td></tr>"
|
||||
for(var/obj/item/weapon/disk/nuclear/N in world)
|
||||
for(var/obj/item/weapon/disk/nuclear/N in poi_list)
|
||||
dat += "<tr><td>[N.name], "
|
||||
var/atom/disk_loc = N.loc
|
||||
while(!istype(disk_loc, /turf))
|
||||
|
||||
@@ -2173,6 +2173,7 @@
|
||||
else
|
||||
var/atom/O = new path(target)
|
||||
if(O)
|
||||
O.admin_spawned = TRUE
|
||||
O.dir = obj_dir
|
||||
if(obj_name)
|
||||
O.name = obj_name
|
||||
@@ -2305,11 +2306,11 @@
|
||||
if(gravity_is_on)
|
||||
log_admin("[key_name(usr)] toggled gravity on.", 1)
|
||||
message_admins("\blue [key_name_admin(usr)] toggled gravity on.", 1)
|
||||
command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.")
|
||||
event_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.")
|
||||
else
|
||||
log_admin("[key_name(usr)] toggled gravity off.", 1)
|
||||
message_admins("\blue [key_name_admin(usr)] toggled gravity off.", 1)
|
||||
command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artifical gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes. Have a nice day.")
|
||||
event_announcement.Announce("Feedback surge detected in mass-distributions systems. Artifical gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes. Have a nice day.")
|
||||
|
||||
if("power")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
@@ -2581,7 +2582,7 @@
|
||||
if(is_station_level(W.z) && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
|
||||
W.req_access = list()
|
||||
message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
|
||||
command_announcement.Announce("Centcomm airlock control override activated. Please take this time to get acquainted with your coworkers.", new_sound = 'sound/AI/commandreport.ogg')
|
||||
event_announcement.Announce("Centcomm airlock control override activated. Please take this time to get acquainted with your coworkers.", new_sound = 'sound/AI/commandreport.ogg')
|
||||
if("onlyone")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","OO")
|
||||
|
||||
@@ -119,6 +119,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
|
||||
for(var/client/X in modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
window_flash(X)
|
||||
to_chat(X, msg)
|
||||
|
||||
//show it to the person adminhelping too
|
||||
|
||||
@@ -133,6 +133,7 @@
|
||||
if(holder && !C.holder)
|
||||
recieve_message = "<span class='[recieve_span]' size='3'>-- Click the [recieve_pm_type]'s name to reply --</span>\n"
|
||||
if(C.adminhelped)
|
||||
window_flash(C)
|
||||
to_chat(C, recieve_message)
|
||||
C.adminhelped = 0
|
||||
|
||||
|
||||
@@ -1474,3 +1474,57 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
return
|
||||
|
||||
error_cache.showTo(usr)
|
||||
|
||||
/client/proc/jump_to_ruin()
|
||||
set category = "Debug"
|
||||
set name = "Jump to Ruin"
|
||||
set desc = "Displays a list of all placed ruins to teleport to."
|
||||
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
|
||||
var/list/names = list()
|
||||
for(var/i in ruin_landmarks)
|
||||
var/obj/effect/landmark/ruin/ruin_landmark = i
|
||||
var/datum/map_template/ruin/template = ruin_landmark.ruin_template
|
||||
|
||||
var/count = 1
|
||||
var/name = template.name
|
||||
var/original_name = name
|
||||
|
||||
while(name in names)
|
||||
count++
|
||||
name = "[original_name] ([count])"
|
||||
|
||||
names[name] = ruin_landmark
|
||||
|
||||
var/ruinname = input("Select ruin", "Jump to Ruin") as null|anything in names
|
||||
|
||||
var/obj/effect/landmark/ruin/landmark = names[ruinname]
|
||||
|
||||
if(istype(landmark))
|
||||
var/datum/map_template/ruin/template = landmark.ruin_template
|
||||
admin_forcemove(usr, get_turf(landmark))
|
||||
|
||||
to_chat(usr, "<span class='name'>[template.name]</span>")
|
||||
to_chat(usr, "<span class='italics'>[template.description]</span>")
|
||||
|
||||
log_admin("[key_name(usr)] jumped to ruin [ruinname]")
|
||||
if(!isobserver(usr))
|
||||
message_admins("[key_name_admin(usr)] jumped to ruin [ruinname]", 1)
|
||||
|
||||
feedback_add_details("admin_verb","JT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/toggle_medal_disable()
|
||||
set category = "Debug"
|
||||
set name = "Toggle Medal Disable"
|
||||
set desc = "Toggles the safety lock on trying to contact the medal hub."
|
||||
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
|
||||
global.medals_enabled = !global.medals_enabled
|
||||
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(src)] [global.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.</span>")
|
||||
feedback_add_details("admin_verb","TMH") // If...
|
||||
log_admin("[key_name(src)] [global.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.")
|
||||
|
||||
@@ -30,6 +30,12 @@ var/intercom_range_display_status = 0
|
||||
src.pixel_x = -224
|
||||
src.pixel_y = -224
|
||||
|
||||
/obj/effect/debugging/mapfix_marker
|
||||
name = "map fix marker"
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
icon_state = "mapfixmarker"
|
||||
desc = "I am a mappers mistake."
|
||||
|
||||
/obj/effect/debugging/marker
|
||||
icon = 'icons/turf/areas.dmi'
|
||||
icon_state = "yellow"
|
||||
|
||||
@@ -137,32 +137,38 @@
|
||||
for(var/mob/M in mob_list)
|
||||
if( istype(M , O.type) )
|
||||
M.vars[variable] = O.vars[variable]
|
||||
M.on_varedit(variable)
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
A.on_varedit(variable)
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
A.on_varedit(variable)
|
||||
|
||||
else
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.type == O.type)
|
||||
M.vars[variable] = O.vars[variable]
|
||||
M.on_varedit(variable)
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
A.on_varedit(variable)
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
A.on_varedit(variable)
|
||||
|
||||
if("edit referenced object")
|
||||
return .(O.vars[variable])
|
||||
|
||||
@@ -131,7 +131,7 @@ var/list/forbidden_varedit_object_types = list(
|
||||
L[var_value] = mod_list_add_ass() //haha
|
||||
if("No")
|
||||
L += var_value
|
||||
|
||||
|
||||
/client/proc/mod_list(var/list/L)
|
||||
if(!check_rights(R_VAREDIT)) return
|
||||
|
||||
@@ -440,6 +440,7 @@ var/list/forbidden_varedit_object_types = list(
|
||||
|
||||
if(var_as_text == null)
|
||||
var_as_text = "[O.vars[variable]]"
|
||||
O.on_varedit(variable)
|
||||
log_to_dd("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_as_text]")]")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [variable] to [var_as_text]")
|
||||
message_admins("[key_name_admin(src)] modified [original_name]'s [variable] to [var_as_text]", 1)
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
if(reload_cooldown > delta)
|
||||
return 1
|
||||
|
||||
command_announcement.Announce("Bluespace artillery fire detected. Brace for impact.")
|
||||
event_announcement.Announce("Bluespace artillery fire detected. Brace for impact.")
|
||||
message_admins("[key_name_admin(usr)] has launched an artillery strike.", 1)
|
||||
var/list/L = list()
|
||||
for(var/turf/T in get_area_turfs(targetarea.type))
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
var/corpseidicon = null //For setting it to be a gold, silver, centcomm etc ID
|
||||
var/timeofdeath = null
|
||||
var/coffin = 0
|
||||
var/brute_damage = 0
|
||||
var/oxy_damage = 0
|
||||
|
||||
/obj/effect/landmark/corpse/initialize()
|
||||
if(istype(src,/obj/effect/landmark/corpse/clown))
|
||||
@@ -37,34 +39,36 @@
|
||||
var/mob/living/carbon/human/human/M = new /mob/living/carbon/human/human (src.loc)
|
||||
M.real_name = src.name
|
||||
M.death(1) //Kills the new mob
|
||||
M.adjustOxyLoss(oxy_damage)
|
||||
M.adjustBruteLoss(brute_damage)
|
||||
M.timeofdeath = timeofdeath
|
||||
if(src.mob_species)
|
||||
M.set_species(src.mob_species)
|
||||
if(src.corpseuniform)
|
||||
M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform)
|
||||
if(src.corpsesuit)
|
||||
M.equip_to_slot_or_del(new src.corpsesuit(M), slot_wear_suit)
|
||||
if(src.corpseshoes)
|
||||
M.equip_to_slot_or_del(new src.corpseshoes(M), slot_shoes)
|
||||
if(src.corpsegloves)
|
||||
M.equip_to_slot_or_del(new src.corpsegloves(M), slot_gloves)
|
||||
if(src.corpseradio)
|
||||
M.equip_to_slot_or_del(new src.corpseradio(M), slot_l_ear)
|
||||
if(src.corpseglasses)
|
||||
M.equip_to_slot_or_del(new src.corpseglasses(M), slot_glasses)
|
||||
if(src.corpsemask)
|
||||
M.equip_to_slot_or_del(new src.corpsemask(M), slot_wear_mask)
|
||||
if(src.corpsehelmet)
|
||||
M.equip_to_slot_or_del(new src.corpsehelmet(M), slot_head)
|
||||
if(src.corpsebelt)
|
||||
M.equip_to_slot_or_del(new src.corpsebelt(M), slot_belt)
|
||||
if(src.corpsepocket1)
|
||||
M.equip_to_slot_or_del(new src.corpsepocket1(M), slot_r_store)
|
||||
if(src.corpsepocket2)
|
||||
M.equip_to_slot_or_del(new src.corpsepocket2(M), slot_l_store)
|
||||
if(src.corpseback)
|
||||
M.equip_to_slot_or_del(new src.corpseback(M), slot_back)
|
||||
if(src.corpseid == 1)
|
||||
if(mob_species)
|
||||
M.set_species(mob_species)
|
||||
if(corpseuniform)
|
||||
M.equip_to_slot_or_del(new corpseuniform(M), slot_w_uniform)
|
||||
if(corpsesuit)
|
||||
M.equip_to_slot_or_del(new corpsesuit(M), slot_wear_suit)
|
||||
if(corpseshoes)
|
||||
M.equip_to_slot_or_del(new corpseshoes(M), slot_shoes)
|
||||
if(corpsegloves)
|
||||
M.equip_to_slot_or_del(new corpsegloves(M), slot_gloves)
|
||||
if(corpseradio)
|
||||
M.equip_to_slot_or_del(new corpseradio(M), slot_l_ear)
|
||||
if(corpseglasses)
|
||||
M.equip_to_slot_or_del(new corpseglasses(M), slot_glasses)
|
||||
if(corpsemask)
|
||||
M.equip_to_slot_or_del(new corpsemask(M), slot_wear_mask)
|
||||
if(corpsehelmet)
|
||||
M.equip_to_slot_or_del(new corpsehelmet(M), slot_head)
|
||||
if(corpsebelt)
|
||||
M.equip_to_slot_or_del(new corpsebelt(M), slot_belt)
|
||||
if(corpsepocket1)
|
||||
M.equip_to_slot_or_del(new corpsepocket1(M), slot_r_store)
|
||||
if(corpsepocket2)
|
||||
M.equip_to_slot_or_del(new corpsepocket2(M), slot_l_store)
|
||||
if(corpseback)
|
||||
M.equip_to_slot_or_del(new corpseback(M), slot_back)
|
||||
if(corpseid == 1)
|
||||
var/obj/item/weapon/card/id/W = new(M)
|
||||
W.name = "[M.real_name]'s ID Card"
|
||||
var/datum/job/jobdatum
|
||||
@@ -73,9 +77,9 @@
|
||||
if(J.title == corpseidaccess)
|
||||
jobdatum = J
|
||||
break
|
||||
if(src.corpseidicon)
|
||||
if(corpseidicon)
|
||||
W.icon_state = corpseidicon
|
||||
if(src.corpseidaccess)
|
||||
if(corpseidaccess)
|
||||
if(jobdatum)
|
||||
W.access = jobdatum.get_access()
|
||||
else
|
||||
@@ -84,18 +88,14 @@
|
||||
W.assignment = corpseidjob
|
||||
W.registered_name = M.real_name
|
||||
M.equip_to_slot_or_del(W, slot_wear_id)
|
||||
if(src.coffin == 1)
|
||||
if(coffin == 1)
|
||||
var/obj/structure/closet/coffin/sarcophagus/sarc = locate(/obj/structure/closet/coffin/sarcophagus) in loc
|
||||
if(sarc) M.loc = sarc
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
// I'll work on making a list of corpses people request for maps, or that I think will be commonly used. Syndicate operatives for example.
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/effect/landmark/corpse/damaged
|
||||
brute_damage = 1000
|
||||
|
||||
/obj/effect/landmark/corpse/syndicatesoldier
|
||||
name = "Syndicate Operative"
|
||||
|
||||
@@ -205,7 +205,17 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
|
||||
template = safepick(possible_ruins)
|
||||
if(!template)
|
||||
return 0
|
||||
var/turf/central_turf = get_turf(src)
|
||||
for(var/i in template.get_affected_turfs(central_turf, 1))
|
||||
var/turf/T = i
|
||||
for(var/mob/living/simple_animal/monster in T)
|
||||
qdel(monster)
|
||||
for(var/obj/structure/flora/ash/plant in T)
|
||||
qdel(plant)
|
||||
template.load(get_turf(src),centered = 1)
|
||||
template.loaded++
|
||||
var/datum/map_template/ruin = template
|
||||
if(istype(ruin))
|
||||
new /obj/effect/landmark/ruin(central_turf, ruin)
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
@@ -93,6 +93,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
var/show_ghostitem_attack = TRUE
|
||||
var/UI_style_color = "#ffffff"
|
||||
var/UI_style_alpha = 255
|
||||
var/windowflashing = TRUE
|
||||
|
||||
|
||||
//character preferences
|
||||
@@ -418,6 +419,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
dat += "<h2>General Settings</h2>"
|
||||
dat += "<b>Fancy NanoUI:</b> <a href='?_src_=prefs;preference=nanoui'>[(nanoui_fancy) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Ghost-Item Attack Animation:</b> <a href='?_src_=prefs;preference=ghost_att_anim'>[(show_ghostitem_attack) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Window Flashing:</b> <a href='?_src_=prefs;preference=winflash'>[(windowflashing) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Custom UI settings:</b><br>"
|
||||
dat += " - <b>UI Style:</b> <a href='?_src_=prefs;preference=ui'><b>[UI_style]</b></a><br>"
|
||||
dat += " - <b>Color:</b> <a href='?_src_=prefs;preference=UIcolor'><b>[UI_style_color]</b></a> <table style='display:inline;' bgcolor='[UI_style_color]'<tr><td>__</td></tr></table><br>"
|
||||
@@ -1935,6 +1937,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if("ghost_att_anim")
|
||||
show_ghostitem_attack = !show_ghostitem_attack
|
||||
|
||||
if("winflash")
|
||||
windowflashing = !windowflashing
|
||||
|
||||
if("UIcolor")
|
||||
var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null
|
||||
if(!UI_style_color_new) return
|
||||
@@ -2149,38 +2154,31 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_FAT && character.species.flags & CAN_BE_FAT)
|
||||
character.dna.SetSEState(FATBLOCK,1,1)
|
||||
character.mutations += FAT
|
||||
character.mutations += OBESITY
|
||||
character.overeatduration = 600
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_NEARSIGHTED)
|
||||
character.dna.SetSEState(GLASSESBLOCK,1,1)
|
||||
character.disabilities |= NEARSIGHTED
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_EPILEPTIC)
|
||||
character.dna.SetSEState(EPILEPSYBLOCK,1,1)
|
||||
character.disabilities |= EPILEPSY
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_DEAF)
|
||||
character.dna.SetSEState(DEAFBLOCK,1,1)
|
||||
character.disabilities |= DEAF
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_BLIND)
|
||||
character.dna.SetSEState(BLINDBLOCK,1,1)
|
||||
character.disabilities |= BLIND
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_COLOURBLIND)
|
||||
character.dna.SetSEState(COLOURBLINDBLOCK,1,1)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_MUTE)
|
||||
character.dna.SetSEState(MUTEBLOCK,1,1)
|
||||
character.disabilities |= MUTE
|
||||
|
||||
S.handle_dna(character)
|
||||
|
||||
if(character.dna.dirtySE)
|
||||
character.dna.UpdateSE()
|
||||
domutcheck(character, null, MUTCHK_FORCED)
|
||||
domutcheck(character, null, MUTCHK_FORCED) //'Activates' all the above disabilities.
|
||||
|
||||
character.dna.ready_dna(character, flatten_SE = 0)
|
||||
character.sync_organ_dna(assimilate=1)
|
||||
|
||||
@@ -14,7 +14,8 @@
|
||||
nanoui_fancy,
|
||||
show_ghostitem_attack,
|
||||
lastchangelog,
|
||||
exp
|
||||
exp,
|
||||
windowflashing
|
||||
FROM [format_table_name("player")]
|
||||
WHERE ckey='[C.ckey]'"}
|
||||
)
|
||||
@@ -42,6 +43,7 @@
|
||||
show_ghostitem_attack = text2num(query.item[12])
|
||||
lastchangelog = query.item[13]
|
||||
exp = query.item[14]
|
||||
windowflashing = text2num(query.item[15])
|
||||
|
||||
//Sanitize
|
||||
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
|
||||
@@ -57,6 +59,7 @@
|
||||
show_ghostitem_attack = sanitize_integer(show_ghostitem_attack, 0, 1, initial(show_ghostitem_attack))
|
||||
lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
|
||||
exp = sanitize_text(exp, initial(exp))
|
||||
windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing))
|
||||
return 1
|
||||
|
||||
/datum/preferences/proc/save_preferences(client/C)
|
||||
|
||||
@@ -193,8 +193,9 @@ BLIND // can't see anything
|
||||
"Drask" = 'icons/mob/species/drask/gloves.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/gloves/proc/Touch()
|
||||
return
|
||||
// Called just before an attack_hand(), in mob/UnarmedAttack()
|
||||
/obj/item/clothing/gloves/proc/Touch(atom/A, proximity)
|
||||
return 0 // return 1 to cancel attack_hand()
|
||||
|
||||
/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/wirecutters))
|
||||
|
||||
@@ -56,3 +56,74 @@
|
||||
icon_state = "latex"
|
||||
item_state = "lgloves"
|
||||
flags = NODROP
|
||||
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/stun
|
||||
name = "stun gloves"
|
||||
desc = "Horrendous and awful. It smells like cancer. The fact it has wires attached to it is incidental."
|
||||
var/obj/item/weapon/stock_parts/cell/cell = null
|
||||
var/stun_strength = 5
|
||||
var/stun_cost = 3750
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/stun/New()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/stun/Destroy()
|
||||
if(cell)
|
||||
qdel(cell)
|
||||
cell = null
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/stun/Touch(atom/A, proximity)
|
||||
if(!ishuman(loc))
|
||||
return FALSE //Only works while worn
|
||||
if(!iscarbon(A))
|
||||
return FALSE
|
||||
if(!proximity)
|
||||
return FALSE
|
||||
if(cell)
|
||||
var/mob/living/carbon/human/H = loc
|
||||
if(H.a_intent == I_HARM)
|
||||
var/mob/living/carbon/C = A
|
||||
if(cell.use(stun_cost))
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(5, 0, loc)
|
||||
s.start()
|
||||
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>")
|
||||
C.Stun(stun_strength)
|
||||
C.Weaken(stun_strength)
|
||||
C.apply_effect(STUTTER, stun_strength)
|
||||
else
|
||||
to_chat(H, "<span class='notice'>Not enough charge!</span>")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/stun/update_icon()
|
||||
..()
|
||||
overlays.Cut()
|
||||
overlays += "gloves_wire"
|
||||
if(cell)
|
||||
overlays += "gloves_cell"
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/stun/attackby(obj/item/weapon/W, mob/living/user, params)
|
||||
if(istype(W, /obj/item/weapon/stock_parts/cell))
|
||||
if(!cell)
|
||||
if(!user.drop_item())
|
||||
to_chat(user, "<span class='warning'>[W] is stuck to you!</span>")
|
||||
return
|
||||
W.forceMove(src)
|
||||
cell = W
|
||||
to_chat(user, "<span class='notice'>You attach [W] to [src].</span>")
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] already has a cell.</span>")
|
||||
|
||||
else if(iswirecutter(W))
|
||||
if(cell)
|
||||
to_chat(user, "<span class='notice'>You cut [cell] away from [src].</span>")
|
||||
cell.forceMove(get_turf(loc))
|
||||
cell = null
|
||||
update_icon()
|
||||
@@ -361,6 +361,11 @@
|
||||
desc = "A hat with bells, to add some merryness to the suit."
|
||||
icon_state = "jester_hat"
|
||||
|
||||
/obj/item/clothing/head/rice_hat
|
||||
name = "rice hat"
|
||||
desc = "Welcome to the rice fields, motherfucker."
|
||||
icon_state = "rice_hat"
|
||||
|
||||
/obj/item/clothing/head/griffin
|
||||
name = "griffon head"
|
||||
desc = "Why not 'eagle head'? Who knows."
|
||||
|
||||
@@ -340,7 +340,7 @@
|
||||
icon_override = 'icons/goonstation/mob/clothing/mask.dmi'
|
||||
lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi'
|
||||
righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi'
|
||||
flags = NODROP
|
||||
flags = NODROP | AIRTIGHT | MASKCOVERSMOUTH
|
||||
|
||||
/obj/item/clothing/mask/cursedclown/equipped(mob/user, slot)
|
||||
..()
|
||||
|
||||
@@ -92,7 +92,7 @@ var/global/list/breach_burn_descriptors = list(
|
||||
if(!breaches)
|
||||
breaches = list()
|
||||
|
||||
if(damage > 25) return //We don't need to keep tracking it when it's at 250% pressure loss, really.
|
||||
if(damage >= 25) return //We don't need to keep tracking it when it's at 250% pressure loss, really.
|
||||
|
||||
if(!loc) return
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -125,7 +125,7 @@ var/global/list/breach_burn_descriptors = list(
|
||||
var/datum/breach/B = new()
|
||||
breaches += B
|
||||
|
||||
B.class = min(amount,5)
|
||||
B.class = min(amount,(5 - max(damage - 20,0))) //We cap the check at 25, this line could overshoot without the calculation if it gets enough dammage in one shot.
|
||||
|
||||
B.damtype = damtype
|
||||
B.update_descriptor()
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
gun.attack_self(holder.wearer)
|
||||
return 1
|
||||
|
||||
gun.process_fire(target,holder.wearer)
|
||||
gun.afterattack(target,holder.wearer)
|
||||
return 1
|
||||
|
||||
/obj/item/rig_module/mounted/egun
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
|
||||
/obj/item/rig_module/handheld
|
||||
name = "mounted device"
|
||||
desc = "Some kind of hardsuit extension."
|
||||
usable = 0
|
||||
selectable = 0
|
||||
toggleable = 1
|
||||
disruptive = 0
|
||||
activate_string = "Deploy"
|
||||
deactivate_string = "Retract"
|
||||
|
||||
var/device_type
|
||||
var/obj/item/device
|
||||
|
||||
/obj/item/rig_module/handheld/activate()
|
||||
if(!..())
|
||||
return
|
||||
|
||||
if(!holder.wearer.put_in_hands(device))
|
||||
to_chat(holder.wearer, "<span class='notice'>You need a free hand to hold \the [device].</span>")
|
||||
active = 0
|
||||
return
|
||||
|
||||
to_chat(holder.wearer, "<span class='notice'>You deploy \the [device].</span>")
|
||||
|
||||
|
||||
/obj/item/rig_module/handheld/deactivate()
|
||||
if(!..())
|
||||
return
|
||||
if(ismob(device.loc)) //Better check for the holder, instead of assuming the rigwearer has it.
|
||||
var/mob/M = device.loc //Helps in case the code fails to keep the module in one place, this should still return it.
|
||||
M.unEquip(device, 1)
|
||||
|
||||
device.loc = src
|
||||
to_chat(holder.wearer, "<span class='notice'>You retract \the [device].</span>")
|
||||
|
||||
/obj/item/rig_module/handheld/New()
|
||||
..()
|
||||
if(device_type)
|
||||
device = new device_type(src)
|
||||
device.flags |= NODROP //We don't want to drop it while it's active/inhand.
|
||||
activate_string += " [device]"
|
||||
deactivate_string += " [device]"
|
||||
|
||||
/obj/item/rig_module/handheld/horn
|
||||
name = "mounted bikehorn"
|
||||
desc = "For tactical honking"
|
||||
interface_name = "mounted bikehorn"
|
||||
interface_desc = "Honks"
|
||||
device_type = /obj/item/weapon/bikehorn
|
||||
@@ -94,7 +94,9 @@
|
||||
*/
|
||||
/obj/item/rig_module/device/New()
|
||||
..()
|
||||
if(device_type) device = new device_type(src)
|
||||
if(device_type)
|
||||
device = new device_type(src)
|
||||
device.flags |= ABSTRACT //Abstract in the sense that it's not an item that stands alone, but rather is just there to let the module act like it.
|
||||
|
||||
/obj/item/rig_module/device/engage(atom/target)
|
||||
if(!..() || !device)
|
||||
@@ -417,13 +419,15 @@
|
||||
interface_desc = "Leave your mark."
|
||||
engage_string = "Toggle stamp type"
|
||||
usable = 1
|
||||
var/iastamp
|
||||
var/deniedstamp
|
||||
var/obj/iastamp //Theese were just vars, but any device would need to be an object
|
||||
var/obj/deniedstamp //Stops assigning non-objects to theese vars, which probably would break quite a bit.
|
||||
|
||||
/obj/item/rig_module/device/stamp/New()
|
||||
..()
|
||||
iastamp = new /obj/item/weapon/stamp/law(src)
|
||||
deniedstamp = new /obj/item/weapon/stamp/denied(src)
|
||||
iastamp.flags |= ABSTRACT
|
||||
deniedstamp.flags |= ABSTRACT
|
||||
device = iastamp
|
||||
|
||||
/obj/item/rig_module/device/stamp/engage(atom/target)
|
||||
@@ -488,4 +492,4 @@
|
||||
W.update_icon()
|
||||
|
||||
/obj/item/rig_module/welding_tank/proc/get_fuel()
|
||||
return reagents.get_reagent_amount("fuel")
|
||||
return reagents.get_reagent_amount("fuel")
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
//Component/device holders.
|
||||
var/obj/item/weapon/tank/air_supply // Air tank, if any.
|
||||
var/obj/item/clothing/shoes/boots = null // Deployable boots, if any.
|
||||
var/obj/item/clothing/shoes/magboots/boots = null // Deployable boots, if any.
|
||||
var/obj/item/clothing/suit/space/new_rig/chest // Deployable chestpiece, if any.
|
||||
var/obj/item/clothing/head/helmet/space/new_rig/helmet = null // Deployable helmet, if any.
|
||||
var/obj/item/clothing/gloves/rig/gloves = null // Deployable gauntlets, if any.
|
||||
@@ -76,6 +76,7 @@
|
||||
var/airtight = 1 //If set, will adjust AIRTIGHT and STOPSPRESSUREDMAGE flags on components. Otherwise it should leave them untouched.
|
||||
|
||||
var/emp_protection = 0
|
||||
var/has_emergency_release = 1 //Allows suit to be removed from outside.
|
||||
|
||||
// Wiring! How exciting.
|
||||
var/datum/wires/rig/wires
|
||||
@@ -126,14 +127,17 @@
|
||||
if(helm_type)
|
||||
helmet = new helm_type(src)
|
||||
verbs |= /obj/item/weapon/rig/proc/toggle_helmet
|
||||
helmet.item_color="[initial(icon_state)]_sealed" //For the lightswitching to know the correct string to manipulate
|
||||
if(boot_type)
|
||||
boots = new boot_type(src)
|
||||
verbs |= /obj/item/weapon/rig/proc/toggle_boots
|
||||
boots.magboot_state="[initial(icon_state)]_sealed" //For the magboot (de)activation to know the correct string to manipulate
|
||||
if(chest_type)
|
||||
chest = new chest_type(src)
|
||||
if(allowed)
|
||||
chest.allowed = allowed
|
||||
chest.slowdown = offline_slowdown
|
||||
chest.holder = src
|
||||
verbs |= /obj/item/weapon/rig/proc/toggle_chest
|
||||
|
||||
for(var/obj/item/piece in list(gloves,helmet,boots,chest))
|
||||
@@ -183,6 +187,10 @@
|
||||
/obj/item/weapon/rig/proc/reset()
|
||||
offline = 2
|
||||
flags &= ~NODROP
|
||||
if(helmet && helmet.on)
|
||||
helmet.toggle_light(wearer)
|
||||
if(boots && boots.magpulse)
|
||||
boots.attack_self(wearer)
|
||||
for(var/obj/item/piece in list(helmet,boots,gloves,chest))
|
||||
if(!piece) continue
|
||||
piece.icon_state = "[initial(icon_state)]"
|
||||
@@ -254,6 +262,7 @@
|
||||
switch(msg_type)
|
||||
if("boots")
|
||||
to_chat(wearer, "<font color='blue'>\The [correct_piece] seal around your feet.</font>")
|
||||
correct_piece.icon_state = "[initial(icon_state)]_sealed0" //Solution to not need a sprite for off, on, and unused magboots.
|
||||
if(user != wearer)
|
||||
to_chat(user, "<span class='notice'>\The [correct_piece] has been sealed.</span>")
|
||||
wearer.update_inv_shoes()
|
||||
@@ -269,6 +278,7 @@
|
||||
wearer.update_inv_wear_suit()
|
||||
if("helmet")
|
||||
to_chat(wearer, "<font color='blue'>\The [correct_piece] hisses closed.</font>")
|
||||
correct_piece.icon_state = "[initial(icon_state)]_sealed0" //Solution to not need a sprite for off, on, and unused helmet light.
|
||||
if(user != wearer)
|
||||
to_chat(user, "<span class='notice'>\The [correct_piece] has been sealed.</span>")
|
||||
wearer.update_inv_head()
|
||||
@@ -383,10 +393,14 @@
|
||||
sealing = FALSE
|
||||
|
||||
if(failed_to_seal)
|
||||
for(var/obj/item/piece in list(helmet, boots, gloves, chest))
|
||||
for(var/obj/item/piece in list(gloves, chest))
|
||||
if(!piece)
|
||||
continue
|
||||
piece.icon_state = "[initial(icon_state)]_sealed"
|
||||
if(helmet)
|
||||
helmet.icon_state = "[initial(icon_state)]_sealed[helmet.on]"
|
||||
if(boots)
|
||||
boots.icon_state = "[initial(icon_state)]_sealed[boots.magpulse]"
|
||||
if(airtight)
|
||||
update_component_sealed()
|
||||
update_icon(1)
|
||||
@@ -406,6 +420,10 @@
|
||||
update_icon(1)
|
||||
|
||||
/obj/item/weapon/rig/proc/update_component_sealed()
|
||||
if(istype(boots) && !(flags & NODROP) && boots.magpulse) //If we have (active) boots and unsealed the suit, we deactivate the magboots.
|
||||
boots.attack_self(wearer)
|
||||
if(istype(helmet) && !(flags & NODROP) && helmet.on) //If we have an (active) headlamp and unsealed the suit, we deactivate the headlamp.
|
||||
helmet.toggle_light(wearer)
|
||||
for(var/obj/item/piece in list(helmet,boots,gloves,chest))
|
||||
if(!(flags & NODROP))
|
||||
piece.flags &= ~STOPSPRESSUREDMAGE
|
||||
@@ -695,6 +713,8 @@
|
||||
M.visible_message("<font color='blue'><b>[M] struggles into \the [src].</b></font>", "<font color='blue'><b>You struggle into \the [src].</b></font>")
|
||||
wearer = M
|
||||
wearer.wearing_rig = src
|
||||
if(has_emergency_release)
|
||||
M.verbs |= /obj/item/weapon/rig/proc/emergency_release
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/rig/proc/toggle_piece(var/piece, var/mob/living/user, var/deploy_mode, var/force)
|
||||
@@ -705,15 +725,15 @@
|
||||
if(isliving(uneq_piece.loc))
|
||||
var/mob/living/L = uneq_piece.loc
|
||||
L.unEquip(uneq_piece, 1)
|
||||
uneq_piece.flags &= ~NODROP
|
||||
uneq_piece.forceMove(src)
|
||||
return 0
|
||||
|
||||
if(sealing || !cell || !cell.charge)
|
||||
return 0
|
||||
|
||||
if(user == wearer && user.incapacitated()) // If the user isn't wearing the suit it's probably an AI.
|
||||
return 0
|
||||
if(!(deploy_mode == ONLY_RETRACT && force)) //This should be the case while stripping, stripping does trigger the if statement below.
|
||||
if(user == wearer && user.incapacitated()) // If the user isn't wearing the suit it's probably an AI.
|
||||
return 0
|
||||
|
||||
var/obj/item/check_slot
|
||||
var/equip_to
|
||||
@@ -752,7 +772,6 @@
|
||||
if(to_strip)
|
||||
to_strip.unEquip(use_obj, 1)
|
||||
|
||||
use_obj.flags &= ~NODROP
|
||||
use_obj.forceMove(src)
|
||||
if(wearer)
|
||||
to_chat(wearer, "<span class='notice'>Your [use_obj] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.")
|
||||
@@ -762,13 +781,11 @@
|
||||
to_chat(wearer, "<span class='danger'>You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way.</span>")
|
||||
return
|
||||
use_obj.forceMove(wearer)
|
||||
use_obj.flags &= ~NODROP
|
||||
if(!wearer.equip_to_slot_if_possible(use_obj, equip_to, 0, 1))
|
||||
use_obj.forceMove(src)
|
||||
else
|
||||
if(wearer)
|
||||
to_chat(wearer, "<span class='notice'>Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly.</span>")
|
||||
use_obj.flags |= NODROP
|
||||
|
||||
if(piece == "helmet" && helmet)
|
||||
helmet.update_light(wearer)
|
||||
@@ -777,17 +794,17 @@
|
||||
if(!wearer || !user)
|
||||
return 0
|
||||
|
||||
if(flags & NODROP)
|
||||
if(wearer.head && wearer.head != helmet)
|
||||
if(flags & NODROP) //We need to check if we have the part, the person is wearing something in the parts slot, and if yes, are they the same.
|
||||
if(helmet && wearer.head && wearer.head != helmet)
|
||||
to_chat(user, "<span class='danger'>\The [wearer.head] is blocking \the [src] from deploying!</span>")
|
||||
return 0
|
||||
if(wearer.gloves && wearer.gloves != gloves)
|
||||
if(gloves && wearer.gloves && wearer.gloves != gloves)
|
||||
to_chat(user, "<span class='danger'>\The [wearer.gloves] is preventing \the [src] from deploying!</span>")
|
||||
return 0
|
||||
if(wearer.shoes && wearer.shoes != boots)
|
||||
if(boots && wearer.shoes && wearer.shoes != boots)
|
||||
to_chat(user, "<span class='danger'>\The [wearer.shoes] is preventing \the [src] from deploying!</span>")
|
||||
return 0
|
||||
if(wearer.wear_suit && wearer.wear_suit != chest)
|
||||
if(chest && wearer.wear_suit && wearer.wear_suit != chest)
|
||||
to_chat(user, "<span class='danger'>\The [wearer.wear_suit] is preventing \the [src] from deploying!</span>")
|
||||
return 0
|
||||
|
||||
@@ -797,6 +814,7 @@
|
||||
|
||||
/obj/item/weapon/rig/dropped(var/mob/user)
|
||||
..()
|
||||
user.verbs -= /obj/item/weapon/rig/proc/emergency_release
|
||||
for(var/piece in list("helmet","gauntlets","chest","boots"))
|
||||
toggle_piece(piece, user, ONLY_RETRACT, 1)
|
||||
if(wearer)
|
||||
@@ -996,6 +1014,38 @@
|
||||
else
|
||||
return null
|
||||
|
||||
/obj/item/weapon/rig/proc/emergency_release()
|
||||
set name = "Suit Emergency Release"
|
||||
set desc = "Activate the suits emergency release system."
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
var/obj/item/weapon/rig/T = get_rig()
|
||||
return T.do_emergency_release(usr)
|
||||
|
||||
/obj/item/weapon/rig/proc/do_emergency_release(var/mob/living/user)
|
||||
if(!can_touch(user, wearer) || !has_emergency_release)
|
||||
return can_touch(user,wearer)
|
||||
usr.visible_message("<span class='warning'>[user] starts activating \the [src] emergency seals release!</span>")
|
||||
if(!do_after(user,240, target = wearer))
|
||||
to_chat(user, "<span class='notice'>You need to focus on activating the emergency release.</span>")
|
||||
return 0
|
||||
usr.visible_message("<span class='warning'>[user] activated \the [src] emergency seals release!</span>")
|
||||
malfunctioning += 1
|
||||
malfunction_delay = 30
|
||||
unseal(user)
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/rig/proc/can_touch(var/mob/user, var/mob/wearer)
|
||||
if(!user)
|
||||
return 0
|
||||
if(!wearer.Adjacent(user))
|
||||
return 0
|
||||
if(user.restrained())
|
||||
to_chat(user, "<span class='notice'>You need your hands free for this.</span>")
|
||||
return 0
|
||||
if(user.stat || user.paralysis || user.sleeping || user.lying || user.weakened)
|
||||
return 0
|
||||
return 1
|
||||
#undef ONLY_DEPLOY
|
||||
#undef ONLY_RETRACT
|
||||
#undef SEAL_DELAY
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
/obj/item/clothing/suit/space/new_rig/calc_breach_damage()
|
||||
..()
|
||||
holder.update_armor() //New dammage, new armormultiplikator.
|
||||
return damage
|
||||
|
||||
/obj/item/weapon/rig/proc/update_armor()
|
||||
var/multi = 1 //Multiplicative modification to the armor, maybe add an additive later on
|
||||
if(chest)
|
||||
multi *= (100 - chest.damage) / 100 //If we have some breaches, lower the armor value.
|
||||
|
||||
//TODO check for other armor mods, likely modules, which need to be coded.
|
||||
|
||||
for(var/obj/item/piece in list(gloves, helmet, boots, chest))
|
||||
if(!istype(piece)) //Do we have the piece
|
||||
continue
|
||||
if(islist(armor)) //Did we even give them some armor, if this is the case, the list should be initialized from New()
|
||||
var/list/L = armor
|
||||
for(var/armortype in L)
|
||||
piece.armor[armortype] = L[armortype]*multi
|
||||
|
||||
//Perfect place to also add something like shield modules, or any other hit_reaction modules check.
|
||||
@@ -141,7 +141,7 @@
|
||||
if(user.r_hand && user.l_hand)
|
||||
cell.forceMove(get_turf(user))
|
||||
else
|
||||
cell.forceMove(user.put_in_hands(cell))
|
||||
user.put_in_hands(cell)
|
||||
cell = null
|
||||
else
|
||||
to_chat(user, "There is nothing loaded in that mount.")
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/space/new_rig
|
||||
name = "helmet"
|
||||
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | THICKMATERIAL
|
||||
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | THICKMATERIAL | NODROP
|
||||
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEMASK
|
||||
body_parts_covered = HEAD
|
||||
heat_protection = HEAD
|
||||
@@ -12,11 +12,12 @@
|
||||
var/brightness_on = 4
|
||||
var/on = 0
|
||||
sprite_sheets = list(
|
||||
"Tajara" = 'icons/mob/species/tajaran/helmet.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/helmet.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/helmet.dmi'
|
||||
)
|
||||
species_restricted = null
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet_light)
|
||||
|
||||
flash_protect = 2
|
||||
|
||||
@@ -28,13 +29,17 @@
|
||||
toggle_light(user)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/new_rig/proc/toggle_light(mob/user)
|
||||
on = !on
|
||||
icon_state = "rig[on]-[item_color]"
|
||||
if(flags & AIRTIGHT) //Could also check for STOPSPRESSUREDMAGE, but one is enough, both get toggled when the seal gets toggled.
|
||||
|
||||
if(on)
|
||||
set_light(brightness_on)
|
||||
on = !on
|
||||
icon_state = "[item_color][on]"
|
||||
|
||||
if(on)
|
||||
set_light(brightness_on)
|
||||
else
|
||||
set_light(0)
|
||||
else
|
||||
set_light(0)
|
||||
to_chat(user, "<span class='warning'>You cannot turn the light on while the suit isn't sealed.</span>")
|
||||
|
||||
if(istype(user,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
@@ -42,7 +47,7 @@
|
||||
|
||||
/obj/item/clothing/gloves/rig
|
||||
name = "gauntlets"
|
||||
flags = THICKMATERIAL
|
||||
flags = THICKMATERIAL | NODROP
|
||||
body_parts_covered = HANDS
|
||||
heat_protection = HANDS
|
||||
cold_protection = HANDS
|
||||
@@ -51,12 +56,19 @@
|
||||
|
||||
/obj/item/clothing/shoes/magboots/rig
|
||||
name = "boots"
|
||||
flags = NODROP
|
||||
body_parts_covered = FEET
|
||||
cold_protection = FEET
|
||||
heat_protection = FEET
|
||||
species_restricted = null
|
||||
gender = PLURAL
|
||||
|
||||
/obj/item/clothing/shoes/magboots/rig/attack_self(mob/user)
|
||||
if(flags & AIRTIGHT) //Could also check for STOPSPRESSUREDMAGE, but one is enough, both get toggled when the seal gets toggled.
|
||||
..(user)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You cannot activate mag-pulse traction system while the suit is not sealed.</span>")
|
||||
|
||||
/obj/item/clothing/suit/space/new_rig
|
||||
name = "chestpiece"
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
|
||||
@@ -64,14 +76,14 @@
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
flags_inv = HIDEJUMPSUIT|HIDETAIL
|
||||
flags = STOPSPRESSUREDMAGE | THICKMATERIAL | AIRTIGHT
|
||||
flags = STOPSPRESSUREDMAGE | THICKMATERIAL | AIRTIGHT | NODROP
|
||||
slowdown = 0
|
||||
//will reach 10 breach damage after 25 laser carbine blasts, 3 revolver hits, or ~1 PTR hit. Completely immune to smg or sts hits.
|
||||
breach_threshold = 38
|
||||
breach_threshold = 20
|
||||
resilience = 0.2
|
||||
can_breach = 1
|
||||
var/obj/item/weapon/rig/holder
|
||||
sprite_sheets = list(
|
||||
"Tajara" = 'icons/mob/species/tajaran/suit.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/suit.dmi'
|
||||
)
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
name = "stealth suit control module"
|
||||
suit_type = "stealth"
|
||||
desc = "A highly advanced and expensive suit designed for covert operations."
|
||||
icon_state = "stealth_rig"
|
||||
icon_state = "ninja_rig" //supposed to be "stealth_rig", but as it currently only has a semi-copied ninja rig sprite, we can just use them directly.
|
||||
|
||||
req_access = list(access_syndicate)
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
item_state = "apron"
|
||||
blood_overlay_type = "armor"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer,/obj/item/weapon/minihoe)
|
||||
allowed = list(/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/cultivator,/obj/item/weapon/reagent_containers/spray/pestspray,/obj/item/weapon/hatchet,/obj/item/weapon/storage/bag/plants)
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi'
|
||||
|
||||
@@ -421,7 +421,7 @@
|
||||
/obj/item/clothing/suit/hooded/wintercoat/hydro
|
||||
name = "hydroponics winter coat"
|
||||
icon_state = "wintercoat_hydro"
|
||||
allowed = list(/obj/item/weapon/reagent_containers/spray, /obj/item/device/analyzer/plant_analyzer, /obj/item/seeds, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/hatchet, /obj/item/weapon/storage/bag/plants)
|
||||
allowed = list(/obj/item/weapon/reagent_containers/spray, /obj/item/device/plant_analyzer, /obj/item/seeds, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/hatchet, /obj/item/weapon/storage/bag/plants)
|
||||
hoodtype = /obj/item/clothing/head/winterhood/hydro
|
||||
|
||||
/obj/item/clothing/head/winterhood/hydro
|
||||
@@ -773,6 +773,13 @@
|
||||
adjust_flavour = null
|
||||
burn_state = FIRE_PROOF
|
||||
|
||||
/obj/item/clothing/suit/jacket/leather/overcoat
|
||||
name = "leather overcoat"
|
||||
desc = "That's a damn fine coat."
|
||||
icon_state = "leathercoat"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
|
||||
|
||||
/obj/item/clothing/suit/officercoat
|
||||
name = "Clown Officer's Coat"
|
||||
desc = "A classy clown officer's overcoat, also designed by Hugo Boss."
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
New()
|
||||
..()
|
||||
crew_announcement.newscast = 1
|
||||
crew_announcement.newscast = 0
|
||||
|
||||
Reset()
|
||||
..()
|
||||
|
||||
@@ -1,44 +1,30 @@
|
||||
|
||||
|
||||
/obj/item/weapon/disk/file/arcade
|
||||
name = "Arcade game grab pack"
|
||||
desc = "A program install disk."
|
||||
icon = 'icons/obj/stock_parts.dmi'
|
||||
icon_state = "datadisk_arcade"
|
||||
spawn_files = list(/datum/file/program/arcade,/datum/file/program/arcade,/datum/file/program/arcade,/datum/file/program/arcade)
|
||||
|
||||
/*/obj/item/weapon/disk/file/aifixer
|
||||
name = "AI System Integrity Restorer"
|
||||
desc = "A program install disk."
|
||||
icon = 'icons/obj/stock_parts.dmi'
|
||||
icon_state = "datadisk_arcade"
|
||||
spawn_files = list(/datum/file/program/aifixer)*/
|
||||
|
||||
/obj/item/weapon/disk/file/atmos_alert
|
||||
name = "Atmospheric Alert Notifier"
|
||||
desc = "A program install disk."
|
||||
icon = 'icons/obj/stock_parts.dmi'
|
||||
icon_state = "datadisk_arcade"
|
||||
spawn_files = list(/datum/file/program/atmos_alert)
|
||||
|
||||
/obj/item/weapon/disk/file/cameras
|
||||
name = "Camera Viewer"
|
||||
desc = "A program install disk."
|
||||
icon = 'icons/obj/stock_parts.dmi'
|
||||
icon_state = "datadisk_arcade"
|
||||
spawn_files = list(/datum/file/program/security)
|
||||
|
||||
/obj/item/weapon/disk/file/card
|
||||
name = "ID Card Modifier"
|
||||
desc = "A program install disk."
|
||||
icon = 'icons/obj/stock_parts.dmi'
|
||||
icon_state = "datadisk_arcade"
|
||||
spawn_files = list(/datum/file/program/card_comp)
|
||||
/*
|
||||
/obj/item/weapon/disk/file/genetics
|
||||
name = "Genetics & Cloning"
|
||||
desc = "A program install disk."
|
||||
icon = 'icons/obj/stock_parts.dmi'
|
||||
icon_state = "datadisk_arcade"
|
||||
spawn_files = list(/datum/file/program/cloning,/datum/file/program/dnascanner)
|
||||
*/
|
||||
|
||||
@@ -163,6 +163,7 @@
|
||||
//parent_type = /obj/item/part/computer/storage // todon't: do this
|
||||
name = "Data Disk"
|
||||
desc = "A device that can be inserted and removed into computers easily as a form of portable data storage. This one stores 1 Megabyte"
|
||||
icon_state = "datadisk_arcade"
|
||||
var/list/files
|
||||
var/list/spawn_files = list()
|
||||
var/writeprotect = 0
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
var/time = 30 //time in deciseconds
|
||||
var/parts[] = list() //type paths of items that will be placed in the result
|
||||
var/chem_catalists[] = list() //like tools but for reagents
|
||||
var/fruit[] = list() //grown products required by the recipe
|
||||
var/category = CAT_MISC // Recipe category
|
||||
|
||||
/datum/crafting_recipe/proc/AdjustChems(var/obj/resultobj as obj)
|
||||
@@ -308,4 +307,11 @@
|
||||
time = 20
|
||||
reqs = list(/obj/item/stack/sheet/mineral/bananium = 5,
|
||||
/obj/item/weapon/bikehorn)
|
||||
category = CAT_MISC
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/bonfire
|
||||
name = "Bonfire"
|
||||
time = 60
|
||||
reqs = list(/obj/item/weapon/grown/log = 5)
|
||||
result = /obj/structure/bonfire
|
||||
category = CAT_PRIMAL
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
/datum/event/alien_infestation/announce()
|
||||
if(successSpawn)
|
||||
command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
|
||||
event_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
|
||||
|
||||
/datum/event/alien_infestation/start()
|
||||
var/list/vents = list()
|
||||
@@ -29,6 +29,8 @@
|
||||
respawnable_list -= C.client
|
||||
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
|
||||
new_xeno.key = C.key
|
||||
if(ticker && ticker.mode)
|
||||
ticker.mode.xenos += new_xeno.mind
|
||||
|
||||
spawncount--
|
||||
successSpawn = 1
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
setup(safety_loop)
|
||||
|
||||
/datum/event/anomaly/announce()
|
||||
command_announcement.Announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert")
|
||||
event_announcement.Announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
/datum/event/anomaly/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
endWhen = 160
|
||||
|
||||
/datum/event/anomaly/anomaly_bluespace/announce()
|
||||
command_announcement.Announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
event_announcement.Announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
/datum/event/anomaly/anomaly_bluespace/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
@@ -33,7 +33,7 @@
|
||||
var/turf/TO = get_turf(chosen) // the turf of origin we're travelling TO
|
||||
|
||||
playsound(TO, 'sound/effects/phasein.ogg', 100, 1)
|
||||
command_announcement.Announce("Massive bluespace translocation detected.", "Anomaly Alert")
|
||||
event_announcement.Announce("Massive bluespace translocation detected.", "Anomaly Alert")
|
||||
|
||||
var/list/flashers = list()
|
||||
for(var/mob/living/carbon/C in viewers(TO, null))
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
endWhen = 180
|
||||
|
||||
/datum/event/anomaly/anomaly_flux/announce()
|
||||
command_announcement.Announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
event_announcement.Announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
/datum/event/anomaly/anomaly_flux/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
endWhen = 70
|
||||
|
||||
/datum/event/anomaly/anomaly_grav/announce()
|
||||
command_announcement.Announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
event_announcement.Announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
/datum/event/anomaly/anomaly_grav/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
endWhen = 110
|
||||
|
||||
/datum/event/anomaly/anomaly_pyro/announce()
|
||||
command_announcement.Announce("Atmospheric anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
event_announcement.Announce("Atmospheric anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
/datum/event/anomaly/anomaly_pyro/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
endWhen = 80
|
||||
|
||||
/datum/event/anomaly/anomaly_vortex/announce()
|
||||
command_announcement.Announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
|
||||
event_announcement.Announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
|
||||
|
||||
/datum/event/anomaly/anomaly_vortex/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
var/obj/effect/blob/core/Blob
|
||||
|
||||
/datum/event/blob/announce()
|
||||
command_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
|
||||
event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
|
||||
|
||||
/datum/event/blob/start()
|
||||
var/turf/T = pick(blobstart)
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
"You don't want to buy anything? Yeah, well I didn't want to buy your mom either.")
|
||||
|
||||
/datum/event/brand_intelligence/announce()
|
||||
command_announcement.Announce("Rampant brand intelligence has been detected aboard [station_name()], please stand-by. The origin is believed to be \a [originMachine.name].", "Machine Learning Alert")
|
||||
event_announcement.Announce("Rampant brand intelligence has been detected aboard [station_name()], please stand-by. The origin is believed to be \a [originMachine.name].", "Machine Learning Alert")
|
||||
|
||||
/datum/event/brand_intelligence/start()
|
||||
for(var/obj/machinery/vending/V in machines)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
announceWhen = 5
|
||||
|
||||
/datum/event/cargo_bonus/announce()
|
||||
command_announcement.Announce("Congratulations! [station_name()] was chosen for a supply limit increase. Please contact the local cargo department for details!", "Supply Alert")
|
||||
event_announcement.Announce("Congratulations! [station_name()] was chosen for a supply limit increase. Please contact the local cargo department for details!", "Supply Alert")
|
||||
|
||||
/datum/event/cargo_bonus/start()
|
||||
supply_controller.points += rand(100,500)
|
||||
@@ -14,7 +14,7 @@
|
||||
announcement = "Massive migration of unknown biological entities has been detected near [station_name()], please stand-by."
|
||||
else
|
||||
announcement = "Unknown biological [spawned_carp.len == 1 ? "entity has" : "entities have"] been detected near [station_name()], please stand-by."
|
||||
command_announcement.Announce(announcement, "Lifesign Alert")
|
||||
event_announcement.Announce(announcement, "Lifesign Alert")
|
||||
|
||||
/datum/event/carp_migration/start()
|
||||
if(severity == EVENT_LEVEL_MAJOR)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
to_chat(A, "<br>")
|
||||
|
||||
if(prob(30)) //most of the time, we don't want an announcement, so as to allow AIs to fake blackouts.
|
||||
command_announcement.Announce(alert)
|
||||
event_announcement.Announce(alert)
|
||||
|
||||
/datum/event/communications_blackout/start()
|
||||
for(var/obj/machinery/telecomms/T in telecomms_list)
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
/proc/communications_blackout(var/silent = 1)
|
||||
if(!silent)
|
||||
command_announcement.Announce("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT", new_sound = 'sound/misc/interference.ogg')
|
||||
event_announcement.Announce("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT", new_sound = 'sound/misc/interference.ogg')
|
||||
else // AIs will always know if there's a comm blackout, rogue AIs could then lie about comm blackouts in the future while they shutdown comms
|
||||
for(var/mob/living/silicon/ai/A in player_list)
|
||||
to_chat(A, "<br>")
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
announceWhen = rand(15, 30)
|
||||
|
||||
/datum/event/disease_outbreak/announce()
|
||||
command_announcement.Announce("Confirmed outbreak of level 7 major viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
|
||||
event_announcement.Announce("Confirmed outbreak of level 7 major viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
|
||||
|
||||
/datum/event/disease_outbreak/start()
|
||||
if(!virus_type)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
var/lightsoutRange = 25
|
||||
|
||||
/datum/event/electrical_storm/announce()
|
||||
command_announcement.Announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert")
|
||||
event_announcement.Announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert")
|
||||
|
||||
/datum/event/electrical_storm/start()
|
||||
var/list/epicentreList = list()
|
||||
|
||||
@@ -8,14 +8,14 @@
|
||||
power_failure(0)
|
||||
|
||||
/datum/event/grid_check/announce()
|
||||
command_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg')
|
||||
event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg')
|
||||
|
||||
/datum/event/grid_check/end()
|
||||
power_restore()
|
||||
|
||||
/proc/power_failure(var/announce = 1)
|
||||
if(announce)
|
||||
command_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg')
|
||||
event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg')
|
||||
|
||||
var/list/skipped_areas = list(/area/turret_protected/ai)
|
||||
var/list/skipped_areas_apc = list(/area/engine/engineering)
|
||||
@@ -45,7 +45,7 @@
|
||||
var/list/skipped_areas_apc = list(/area/engine/engineering)
|
||||
|
||||
if(announce)
|
||||
command_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
|
||||
event_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
|
||||
for(var/obj/machinery/power/apc/C in apcs)
|
||||
var/area/current_area = get_area(C)
|
||||
if(current_area.type in skipped_areas_apc || !is_station_level(C.z))
|
||||
@@ -64,7 +64,7 @@
|
||||
|
||||
/proc/power_restore_quick(var/announce = 1)
|
||||
if(announce)
|
||||
command_announcement.Announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
|
||||
event_announcement.Announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
|
||||
for(var/obj/machinery/power/smes/S in machines)
|
||||
if(!is_station_level(S.z))
|
||||
continue
|
||||
|
||||
@@ -11,7 +11,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
|
||||
announceWhen = 5
|
||||
|
||||
/datum/event/immovable_rod/announce()
|
||||
command_announcement.Announce("What the fuck was that?!", "General Alert")
|
||||
event_announcement.Announce("What the fuck was that?!", "General Alert")
|
||||
|
||||
/datum/event/immovable_rod/start()
|
||||
var/startside = pick(cardinal)
|
||||
@@ -34,8 +34,13 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
|
||||
loc = start
|
||||
z_original = z
|
||||
destination = end
|
||||
poi_list |= src
|
||||
if(end && end.z==z_original)
|
||||
walk_towards(src, destination, 1)
|
||||
|
||||
/obj/effect/immovablerod/Destroy()
|
||||
poi_list.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/immovablerod/Move()
|
||||
if(z != z_original || loc == destination)
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
|
||||
|
||||
/datum/event/infestation/announce()
|
||||
command_announcement.Announce("Bioscans indicate that [vermstring] have been breeding in [locstring]. Clear them out, before this starts to affect productivity.", "Lifesign Alert")
|
||||
event_announcement.Announce("Bioscans indicate that [vermstring] have been breeding in [locstring]. Clear them out, before this starts to affect productivity.", "Lifesign Alert")
|
||||
|
||||
#undef LOC_KITCHEN
|
||||
#undef LOC_ATMOS
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
/datum/event/ion_storm/announce()
|
||||
if(announceEvent == ION_ANNOUNCE || (announceEvent == ION_RANDOM && prob(ionAnnounceChance)))
|
||||
command_announcement.Announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", 'sound/AI/ionstorm.ogg')
|
||||
event_announcement.Announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", 'sound/AI/ionstorm.ogg')
|
||||
|
||||
|
||||
/datum/event/ion_storm/start()
|
||||
|
||||
@@ -9,4 +9,4 @@
|
||||
H.AdjustHallucinate(rand(50, 100))
|
||||
|
||||
/datum/event/mass_hallucination/announce()
|
||||
command_announcement.Announce("It seems that station [station_name()] is passing through a minor radiation field, this may cause some hallucination, but no further damage")
|
||||
event_announcement.Announce("It seems that station [station_name()] is passing through a minor radiation field, this may cause some hallucination, but no further damage")
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/event/meteor_wave/gore/announce()
|
||||
command_announcement.Announce("Unknown biological debris have been detected near [station_name()], please stand-by.", "Debris Alert")
|
||||
event_announcement.Announce("Unknown biological debris have been detected near [station_name()], please stand-by.", "Debris Alert")
|
||||
|
||||
/datum/event/meteor_wave/gore/setup()
|
||||
waves = 3
|
||||
@@ -14,4 +14,4 @@
|
||||
|
||||
|
||||
/datum/event/meteor_wave/gore/end()
|
||||
command_announcement.Announce("The station has cleared the debris.", "Debris Alert")
|
||||
event_announcement.Announce("The station has cleared the debris.", "Debris Alert")
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/datum/event/meteor_wave/goreop/announce()
|
||||
var/meteor_declaration = "MeteorOps have declared their intent to utterly destroy [station_name()] with their own bodies, and dares the crew to try and stop them."
|
||||
command_announcement.Announce(meteor_declaration, "Declaration of 'War'", 'sound/effects/siren.ogg')
|
||||
event_announcement.Announce(meteor_declaration, "Declaration of 'War'", 'sound/effects/siren.ogg')
|
||||
|
||||
/datum/event/meteor_wave/goreop/setup()
|
||||
waves = 3
|
||||
@@ -16,4 +16,4 @@
|
||||
|
||||
|
||||
/datum/event/meteor_wave/goreops/end()
|
||||
command_announcement.Announce("All MeteorOps are dead. Major Station Victory.", "MeteorOps")
|
||||
event_announcement.Announce("All MeteorOps are dead. Major Station Victory.", "MeteorOps")
|
||||
@@ -1,8 +1,8 @@
|
||||
/datum/event/dust/meaty/announce()
|
||||
if(prob(16))
|
||||
command_announcement.Announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
|
||||
event_announcement.Announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
|
||||
else
|
||||
command_announcement.Announce("Meaty ores have been detected on collision course with the station.", "Meaty Ore Alert", new_sound = 'sound/AI/meteors.ogg')
|
||||
event_announcement.Announce("Meaty ores have been detected on collision course with the station.", "Meaty Ore Alert", new_sound = 'sound/AI/meteors.ogg')
|
||||
|
||||
/datum/event/dust/meaty/setup()
|
||||
qnty = rand(45,125)
|
||||
|
||||
@@ -10,9 +10,9 @@
|
||||
/datum/event/meteor_wave/announce()
|
||||
switch(severity)
|
||||
if(EVENT_LEVEL_MAJOR)
|
||||
command_announcement.Announce("Meteors have been detected on collision course with the station.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg')
|
||||
event_announcement.Announce("Meteors have been detected on collision course with the station.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg')
|
||||
else
|
||||
command_announcement.Announce("The station is now in a meteor shower.", "Meteor Alert")
|
||||
event_announcement.Announce("The station is now in a meteor shower.", "Meteor Alert")
|
||||
|
||||
//meteor showers are lighter and more common,
|
||||
/datum/event/meteor_wave/tick()
|
||||
@@ -25,9 +25,9 @@
|
||||
/datum/event/meteor_wave/end()
|
||||
switch(severity)
|
||||
if(EVENT_LEVEL_MAJOR)
|
||||
command_announcement.Announce("The station has cleared the meteor storm.", "Meteor Alert")
|
||||
event_announcement.Announce("The station has cleared the meteor storm.", "Meteor Alert")
|
||||
else
|
||||
command_announcement.Announce("The station has cleared the meteor shower", "Meteor Alert")
|
||||
event_announcement.Announce("The station has cleared the meteor shower", "Meteor Alert")
|
||||
|
||||
/datum/event/meteor_wave/proc/get_meteors()
|
||||
switch(severity)
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
/datum/event/prison_break/announce()
|
||||
if(areas && areas.len > 0)
|
||||
command_announcement.Announce("[pick("Gr3y.T1d3 virus","Malignant trojan")] detected in [station_name()] [(eventDept == "Security")? "imprisonment":"containment"] subroutines. Secure any compromised areas immediately. Station AI involvement is recommended.", "[eventDept] Alert")
|
||||
event_announcement.Announce("[pick("Gr3y.T1d3 virus","Malignant trojan")] detected in [station_name()] [(eventDept == "Security")? "imprisonment":"containment"] subroutines. Secure any compromised areas immediately. Station AI involvement is recommended.", "[eventDept] Alert")
|
||||
|
||||
/datum/event/prison_break/start()
|
||||
for(var/area/A in world)
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
/datum/event/radiation_storm/start()
|
||||
spawn()
|
||||
command_announcement.Announce("High levels of radiation detected near the station. Please evacuate into one of the shielded maintenance tunnels.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg')
|
||||
event_announcement.Announce("High levels of radiation detected near the station. Please evacuate into one of the shielded maintenance tunnels.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg')
|
||||
|
||||
for(var/area/A in world)
|
||||
if(!is_station_level(A.z) || is_safe_zone(A))
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
sleep(600)
|
||||
|
||||
command_announcement.Announce("The station has entered the radiation belt. Please remain in a sheltered area until we have passed the radiation belt.", "Anomaly Alert")
|
||||
event_announcement.Announce("The station has entered the radiation belt. Please remain in a sheltered area until we have passed the radiation belt.", "Anomaly Alert")
|
||||
|
||||
for(var/i = 0, i < 10, i++)
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
sleep(100)
|
||||
|
||||
command_announcement.Announce("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert")
|
||||
event_announcement.Announce("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert")
|
||||
|
||||
for(var/area/A in world)
|
||||
if(!is_station_level(A.z) || is_safe_zone(A))
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
msg = "Contact has been lost with a combat drone wing operating out of the NSV Icarus. If any are sighted in the area, approach with caution."
|
||||
else
|
||||
msg = "Unidentified hackers have targetted a combat drone wing deployed from the NSV Icarus. If any are sighted in the area, approach with caution."
|
||||
command_announcement.Announce(msg, "Rogue drone alert")
|
||||
event_announcement.Announce(msg, "Rogue drone alert")
|
||||
|
||||
/datum/event/rogue_drone/tick()
|
||||
return
|
||||
@@ -48,6 +48,6 @@
|
||||
num_recovered++
|
||||
|
||||
if(num_recovered > drones_list.len * 0.75)
|
||||
command_announcement.Announce("Icarus drone control reports the malfunctioning wing has been recovered safely.", "Rogue drone alert")
|
||||
event_announcement.Announce("Icarus drone control reports the malfunctioning wing has been recovered safely.", "Rogue drone alert")
|
||||
else
|
||||
command_announcement.Announce("Icarus drone control registers disappointment at the loss of the drones, but the survivors have been recovered.", "Rogue drone alert")
|
||||
event_announcement.Announce("Icarus drone control registers disappointment at the loss of the drones, but the survivors have been recovered.", "Rogue drone alert")
|
||||
|
||||
@@ -1,11 +1,570 @@
|
||||
/var/global/spacevines_spawned = 0
|
||||
|
||||
/datum/event/spacevine
|
||||
announceWhen = 10
|
||||
//Types of usual mutations
|
||||
#define POSITIVE 1
|
||||
#define NEGATIVE 2
|
||||
#define MINOR_NEGATIVE 3
|
||||
|
||||
/datum/event/spacevine/start()
|
||||
spacevine_infestation()
|
||||
spacevines_spawned = 1
|
||||
var/list/turfs = list() //list of all the empty floor turfs in the hallway areas
|
||||
|
||||
/datum/event/spacevine/announce()
|
||||
command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
|
||||
var/obj/effect/spacevine/SV = new()
|
||||
|
||||
for(var/area/hallway/A in world)
|
||||
for(var/turf/F in A)
|
||||
if(F.Enter(SV))
|
||||
turfs += F
|
||||
|
||||
qdel(SV)
|
||||
|
||||
if(turfs.len) //Pick a turf to spawn at if we can
|
||||
var/turf/T = pick(turfs)
|
||||
new/obj/effect/spacevine_controller(T) //spawn a controller at turf
|
||||
|
||||
|
||||
/datum/spacevine_mutation
|
||||
var/name = ""
|
||||
var/severity = 1
|
||||
var/hue
|
||||
var/quality
|
||||
|
||||
/datum/spacevine_mutation/proc/add_mutation_to_vinepiece(obj/effect/spacevine/holder)
|
||||
holder.mutations |= src
|
||||
holder.color = hue
|
||||
|
||||
/datum/spacevine_mutation/proc/process_mutation(obj/effect/spacevine/holder)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/process_temperature(obj/effect/spacevine/holder, temp, volume)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_birth(obj/effect/spacevine/holder)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_grow(obj/effect/spacevine/holder)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_death(obj/effect/spacevine/holder)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_hit(obj/effect/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
|
||||
. = expected_damage
|
||||
|
||||
/datum/spacevine_mutation/proc/on_cross(obj/effect/spacevine/holder, mob/crosser)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_chem(obj/effect/spacevine/holder, datum/reagent/R)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_eat(obj/effect/spacevine/holder, mob/living/eater)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_spread(obj/effect/spacevine/holder, turf/target)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_buckle(obj/effect/spacevine/holder, mob/living/buckled)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_explosion(severity, obj/effect/spacevine/holder)
|
||||
return
|
||||
|
||||
|
||||
/datum/spacevine_mutation/space_covering
|
||||
name = "space protective"
|
||||
hue = "#aa77aa"
|
||||
quality = POSITIVE
|
||||
|
||||
/turf/simulated/floor/vines
|
||||
color = "#aa77aa"
|
||||
icon_state = "vinefloor"
|
||||
broken_states = list()
|
||||
|
||||
|
||||
//All of this shit is useless for vines
|
||||
|
||||
/turf/simulated/floor/vines/attackby()
|
||||
return
|
||||
|
||||
/turf/simulated/floor/vines/burn_tile()
|
||||
return
|
||||
|
||||
/turf/simulated/floor/vines/break_tile()
|
||||
return
|
||||
|
||||
/turf/simulated/floor/vines/make_plating()
|
||||
return
|
||||
|
||||
/turf/simulated/floor/vines/break_tile_to_plating()
|
||||
return
|
||||
|
||||
/turf/simulated/floor/vines/ex_act(severity)
|
||||
if(severity < 3)
|
||||
ChangeTurf(baseturf)
|
||||
|
||||
/turf/simulated/floor/vines/narsie_act()
|
||||
if(prob(20))
|
||||
ChangeTurf(baseturf) //nar sie eats this shit
|
||||
|
||||
/turf/simulated/floor/vines/singularity_pull(S, current_size)
|
||||
if(current_size >= STAGE_FIVE)
|
||||
if(prob(50))
|
||||
ChangeTurf(baseturf)
|
||||
|
||||
/turf/simulated/floor/vines/ChangeTurf(turf/open/floor/T)
|
||||
. = ..()
|
||||
//Do this *after* the turf has changed as qdel in spacevines will call changeturf again if it hasn't
|
||||
for(var/obj/effect/spacevine/SV in src)
|
||||
qdel(SV)
|
||||
|
||||
/datum/spacevine_mutation/space_covering
|
||||
var/static/list/coverable_turfs
|
||||
|
||||
/datum/spacevine_mutation/space_covering/New()
|
||||
. = ..()
|
||||
if(!coverable_turfs)
|
||||
coverable_turfs = typecacheof(list(
|
||||
/turf/space
|
||||
))
|
||||
coverable_turfs -= typecacheof(list(
|
||||
/turf/space/transit
|
||||
))
|
||||
|
||||
/datum/spacevine_mutation/space_covering/on_grow(obj/effect/spacevine/holder)
|
||||
process_mutation(holder)
|
||||
|
||||
/datum/spacevine_mutation/space_covering/process_mutation(obj/effect/spacevine/holder)
|
||||
var/turf/T = get_turf(holder)
|
||||
if(is_type_in_typecache(T, coverable_turfs))
|
||||
var/currtype = T.type
|
||||
T.ChangeTurf(/turf/simulated/floor/vines)
|
||||
T.baseturf = currtype
|
||||
|
||||
/datum/spacevine_mutation/space_covering/on_death(obj/effect/spacevine/holder)
|
||||
var/turf/T = get_turf(holder)
|
||||
if(istype(T, /turf/simulated/floor/vines))
|
||||
T.ChangeTurf(T.baseturf)
|
||||
|
||||
/datum/spacevine_mutation/bluespace
|
||||
name = "bluespace"
|
||||
hue = "#3333ff"
|
||||
quality = MINOR_NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/bluespace/on_spread(obj/effect/spacevine/holder, turf/target)
|
||||
if(holder.energy > 1 && !locate(/obj/effect/spacevine) in target)
|
||||
holder.master.spawn_spacevine_piece(target, holder)
|
||||
|
||||
/datum/spacevine_mutation/light
|
||||
name = "light"
|
||||
hue = "#ffff00"
|
||||
quality = POSITIVE
|
||||
severity = 4
|
||||
|
||||
/datum/spacevine_mutation/light/on_grow(obj/effect/spacevine/holder)
|
||||
if(holder.energy)
|
||||
holder.set_light(severity)
|
||||
|
||||
/datum/spacevine_mutation/toxicity
|
||||
name = "toxic"
|
||||
hue = "#ff00ff"
|
||||
severity = 10
|
||||
quality = NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/toxicity/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
|
||||
if(issilicon(crosser))
|
||||
return
|
||||
if(prob(severity) && istype(crosser) && !isvineimmune(crosser))
|
||||
to_chat(crosser, "<span class='alert'>You accidently touch the vine and feel a strange sensation.</span>")
|
||||
crosser.adjustToxLoss(5)
|
||||
|
||||
/datum/spacevine_mutation/toxicity/on_eat(obj/effect/spacevine/holder, mob/living/eater)
|
||||
if(!isvineimmune(eater))
|
||||
eater.adjustToxLoss(5)
|
||||
|
||||
/datum/spacevine_mutation/explosive //OH SHIT IT CAN CHAINREACT RUN!!!
|
||||
name = "explosive"
|
||||
hue = "#ff0000"
|
||||
quality = NEGATIVE
|
||||
severity = 2
|
||||
|
||||
/datum/spacevine_mutation/explosive/on_explosion(explosion_severity, obj/effect/spacevine/holder)
|
||||
if(explosion_severity < 3)
|
||||
qdel(holder)
|
||||
else
|
||||
. = 1
|
||||
spawn(5)
|
||||
qdel(holder)
|
||||
|
||||
/datum/spacevine_mutation/explosive/on_death(obj/effect/spacevine/holder, mob/hitter, obj/item/I)
|
||||
explosion(holder.loc, 0, 0, severity, 0, 0)
|
||||
|
||||
/datum/spacevine_mutation/fire_proof
|
||||
name = "fire proof"
|
||||
hue = "#ff8888"
|
||||
quality = MINOR_NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/fire_proof/process_temperature(obj/effect/spacevine/holder, temp, volume)
|
||||
return 1
|
||||
|
||||
/datum/spacevine_mutation/fire_proof/on_hit(obj/effect/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
|
||||
if(I && I.damtype == "fire")
|
||||
. = 0
|
||||
else
|
||||
. = expected_damage
|
||||
|
||||
/datum/spacevine_mutation/vine_eating
|
||||
name = "vine eating"
|
||||
hue = "#ff7700"
|
||||
quality = MINOR_NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/vine_eating/on_spread(obj/effect/spacevine/holder, turf/target)
|
||||
var/obj/effect/spacevine/prey = locate() in target
|
||||
if(prey && !prey.mutations.Find(src)) //Eat all vines that are not of the same origin
|
||||
qdel(prey)
|
||||
|
||||
/datum/spacevine_mutation/aggressive_spread //very OP, but im out of other ideas currently
|
||||
name = "aggressive spreading"
|
||||
hue = "#333333"
|
||||
severity = 3
|
||||
quality = NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/aggressive_spread/on_spread(obj/effect/spacevine/holder, turf/target)
|
||||
target.ex_act(severity) // vine immunity handled at /mob/ex_act
|
||||
|
||||
/datum/spacevine_mutation/aggressive_spread/on_buckle(obj/effect/spacevine/holder, mob/living/buckled)
|
||||
buckled.ex_act(severity)
|
||||
|
||||
/datum/spacevine_mutation/transparency
|
||||
name = "transparent"
|
||||
hue = ""
|
||||
quality = POSITIVE
|
||||
|
||||
/datum/spacevine_mutation/transparency/on_grow(obj/effect/spacevine/holder)
|
||||
holder.set_opacity(0)
|
||||
holder.alpha = 125
|
||||
|
||||
/datum/spacevine_mutation/thorns
|
||||
name = "thorny"
|
||||
hue = "#666666"
|
||||
severity = 10
|
||||
quality = NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/thorns/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
|
||||
if(prob(severity) && istype(crosser) && !isvineimmune(holder))
|
||||
var/mob/living/M = crosser
|
||||
M.adjustBruteLoss(5)
|
||||
to_chat(M, "<span class='alert'>You cut yourself on the thorny vines.</span>")
|
||||
|
||||
/datum/spacevine_mutation/thorns/on_hit(obj/effect/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
|
||||
if(prob(severity) && istype(hitter) && !isvineimmune(holder))
|
||||
var/mob/living/M = hitter
|
||||
M.adjustBruteLoss(5)
|
||||
to_chat(M, "<span class='alert'>You cut yourself on the thorny vines.</span>")
|
||||
. = expected_damage
|
||||
|
||||
/datum/spacevine_mutation/woodening
|
||||
name = "hardened"
|
||||
hue = "#997700"
|
||||
quality = NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/woodening/on_grow(obj/effect/spacevine/holder)
|
||||
if(holder.energy)
|
||||
holder.density = 1
|
||||
holder.maxhealth = 100
|
||||
holder.health = holder.maxhealth
|
||||
|
||||
/datum/spacevine_mutation/woodening/on_hit(obj/effect/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
|
||||
if(!is_sharp(I))
|
||||
. = expected_damage * 0.5
|
||||
else
|
||||
. = expected_damage
|
||||
|
||||
/datum/spacevine_mutation/flowering
|
||||
name = "flowering"
|
||||
hue = "#0A480D"
|
||||
quality = NEGATIVE
|
||||
severity = 10
|
||||
|
||||
/datum/spacevine_mutation/flowering/on_grow(obj/effect/spacevine/holder)
|
||||
if(holder.energy == 2 && prob(severity) && !locate(/obj/structure/alien/resin/flower_bud_enemy) in range(5,holder))
|
||||
new /obj/structure/alien/resin/flower_bud_enemy(get_turf(holder))
|
||||
|
||||
/datum/spacevine_mutation/flowering/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
|
||||
if(prob(25))
|
||||
holder.entangle(crosser)
|
||||
|
||||
|
||||
// SPACE VINES (Note that this code is very similar to Biomass code)
|
||||
/obj/effect/spacevine
|
||||
name = "space vines"
|
||||
desc = "An extremely expansionistic species of vine."
|
||||
icon = 'icons/effects/spacevines.dmi'
|
||||
icon_state = "Light1"
|
||||
anchored = 1
|
||||
density = 0
|
||||
layer = MOB_LAYER + 0.8
|
||||
mouse_opacity = 2 //Clicking anywhere on the turf is good enough
|
||||
pass_flags = PASSTABLE | PASSGRILLE
|
||||
var/health = 50
|
||||
var/maxhealth = 50
|
||||
var/energy = 0
|
||||
var/obj/effect/spacevine_controller/master = null
|
||||
var/list/mutations = list()
|
||||
|
||||
/obj/effect/spacevine/New()
|
||||
..()
|
||||
color = "#ffffff"
|
||||
|
||||
/obj/effect/spacevine/examine(mob/user)
|
||||
..()
|
||||
var/text = "This one is a"
|
||||
if(mutations.len)
|
||||
for(var/A in mutations)
|
||||
var/datum/spacevine_mutation/SM = A
|
||||
text += " [SM.name]"
|
||||
else
|
||||
text += " normal"
|
||||
text += " vine."
|
||||
to_chat(user, text)
|
||||
|
||||
/obj/effect/spacevine/Destroy()
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
SM.on_death(src)
|
||||
if(master)
|
||||
master.vines -= src
|
||||
master.growth_queue -= src
|
||||
if(!master.vines.len)
|
||||
var/obj/item/seeds/kudzu/KZ = new(loc)
|
||||
KZ.mutations |= mutations
|
||||
KZ.set_potency(master.mutativeness * 10)
|
||||
KZ.set_production((master.spread_cap / initial(master.spread_cap)) * 5)
|
||||
master = null
|
||||
mutations.Cut()
|
||||
set_opacity(0)
|
||||
if(buckled_mob)
|
||||
unbuckle_mob()
|
||||
return ..()
|
||||
|
||||
/obj/effect/spacevine/proc/add_mutation(datum/spacevine_mutation/mutation)
|
||||
mutations |= mutation
|
||||
color = mutation.hue
|
||||
|
||||
/obj/effect/spacevine/proc/on_chem_effect(datum/reagent/R)
|
||||
var/override = 0
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
override += SM.on_chem(src, R)
|
||||
if(!override && istype(R, /datum/reagent/glyphosate))
|
||||
if(prob(50))
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spacevine/proc/eat(mob/eater)
|
||||
var/override = 0
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
override += SM.on_eat(src, eater)
|
||||
if(!override)
|
||||
if(prob(10))
|
||||
eater.say("Nom")
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spacevine/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if (!W || !user || !W.type)
|
||||
return
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
var/force = W.force
|
||||
|
||||
if(istype(W, /obj/item/weapon/scythe))
|
||||
force = force * 4
|
||||
for(var/obj/effect/spacevine/B in orange(1,src))
|
||||
B.health = health - force
|
||||
if(B.health < 1)
|
||||
qdel(B)
|
||||
|
||||
health = health - force
|
||||
|
||||
if(health < 1)
|
||||
qdel(src)
|
||||
|
||||
return
|
||||
|
||||
if(is_sharp(W))
|
||||
force = force * 4
|
||||
|
||||
if(W && W.damtype == "fire")
|
||||
force = force * 4
|
||||
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
force = SM.on_hit(src, user, W, force) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
|
||||
|
||||
health = health - force
|
||||
if(health < 1)
|
||||
qdel(src)
|
||||
|
||||
..()
|
||||
|
||||
/obj/effect/spacevine/Crossed(mob/crosser)
|
||||
if(isliving(crosser))
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
SM.on_cross(src, crosser)
|
||||
|
||||
/obj/effect/spacevine/attack_hand(mob/user)
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
SM.on_hit(src, user)
|
||||
user_unbuckle_mob(user, user)
|
||||
|
||||
/obj/effect/spacevine/attack_alien(mob/living/user)
|
||||
eat(user)
|
||||
|
||||
/obj/effect/spacevine_controller
|
||||
invisibility = 101
|
||||
var/list/obj/effect/spacevine/vines = list()
|
||||
var/list/growth_queue = list()
|
||||
var/spread_multiplier = 5
|
||||
var/spread_cap = 30
|
||||
var/list/mutations_list = list()
|
||||
var/mutativeness = 1
|
||||
|
||||
/obj/effect/spacevine_controller/New(loc, list/muts, potency, production)
|
||||
color = "#ffffff"
|
||||
spawn_spacevine_piece(loc, , muts)
|
||||
processing_objects.Add(src)
|
||||
init_subtypes(/datum/spacevine_mutation/, mutations_list)
|
||||
if(potency != null)
|
||||
mutativeness = potency / 10
|
||||
if(production != null)
|
||||
spread_cap *= production / 5
|
||||
spread_multiplier /= production / 5
|
||||
..()
|
||||
|
||||
|
||||
/obj/effect/spacevine_controller/ex_act() //only killing all vines will end this suffering
|
||||
return
|
||||
|
||||
/obj/effect/spacevine_controller/singularity_act()
|
||||
return
|
||||
|
||||
/obj/effect/spacevine_controller/singularity_pull()
|
||||
return
|
||||
|
||||
/obj/effect/spacevine_controller/Destroy()
|
||||
processing_objects.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/effect/spacevine/parent, list/muts)
|
||||
var/obj/effect/spacevine/SV = new(location)
|
||||
growth_queue += SV
|
||||
vines += SV
|
||||
SV.master = src
|
||||
if(muts && muts.len)
|
||||
for(var/datum/spacevine_mutation/M in muts)
|
||||
M.add_mutation_to_vinepiece(SV)
|
||||
return
|
||||
if(parent)
|
||||
SV.mutations |= parent.mutations
|
||||
SV.color = parent.color
|
||||
if(prob(mutativeness))
|
||||
var/list/random_mutations_picked = mutations_list - SV.mutations
|
||||
if(random_mutations_picked.len)
|
||||
var/datum/spacevine_mutation/randmut = pick(random_mutations_picked)
|
||||
randmut.add_mutation_to_vinepiece(SV)
|
||||
|
||||
for(var/datum/spacevine_mutation/SM in SV.mutations)
|
||||
SM.on_birth(SV)
|
||||
|
||||
/obj/effect/spacevine_controller/process()
|
||||
if(!vines)
|
||||
qdel(src) //space vines exterminated. Remove the controller
|
||||
return
|
||||
if(!growth_queue)
|
||||
qdel(src) //Sanity check
|
||||
return
|
||||
|
||||
var/length = 0
|
||||
|
||||
length = min( spread_cap , max( 1 , vines.len / spread_multiplier ) )
|
||||
var/i = 0
|
||||
var/list/obj/effect/spacevine/queue_end = list()
|
||||
|
||||
for(var/obj/effect/spacevine/SV in growth_queue)
|
||||
if(qdeleted(SV))
|
||||
continue
|
||||
i++
|
||||
queue_end += SV
|
||||
growth_queue -= SV
|
||||
for(var/datum/spacevine_mutation/SM in SV.mutations)
|
||||
SM.process_mutation(SV)
|
||||
if(SV.energy < 2) //If tile isn't fully grown
|
||||
if(prob(20))
|
||||
SV.grow()
|
||||
else //If tile is fully grown
|
||||
SV.entangle_mob()
|
||||
|
||||
//if(prob(25))
|
||||
SV.spread()
|
||||
if(i >= length)
|
||||
break
|
||||
|
||||
growth_queue = growth_queue + queue_end
|
||||
|
||||
/obj/effect/spacevine/proc/grow()
|
||||
if(!energy)
|
||||
icon_state = pick("Med1", "Med2", "Med3")
|
||||
energy = 1
|
||||
set_opacity(1)
|
||||
else
|
||||
icon_state = pick("Hvy1", "Hvy2", "Hvy3")
|
||||
energy = 2
|
||||
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
SM.on_grow(src)
|
||||
|
||||
/obj/effect/spacevine/proc/entangle_mob()
|
||||
if(!buckled_mob && prob(25))
|
||||
for(var/mob/living/V in loc)
|
||||
entangle(V)
|
||||
if(has_buckled_mobs())
|
||||
break //only capture one mob at a time
|
||||
|
||||
|
||||
/obj/effect/spacevine/proc/entangle(mob/living/V)
|
||||
if(!V || isvineimmune(V))
|
||||
return
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
SM.on_buckle(src, V)
|
||||
if((V.stat != DEAD) && (V.buckled != src)) //not dead or captured
|
||||
to_chat(V, "<span class='danger'>The vines [pick("wind", "tangle", "tighten")] around you!</span>")
|
||||
buckle_mob(V, 1)
|
||||
|
||||
/obj/effect/spacevine/proc/spread()
|
||||
var/direction = pick(cardinal)
|
||||
var/turf/stepturf = get_step(src,direction)
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
SM.on_spread(src, stepturf)
|
||||
stepturf = get_step(src,direction) //in case turf changes, to make sure no runtimes happen
|
||||
if(!locate(/obj/effect/spacevine, stepturf))
|
||||
if(stepturf.Enter(src))
|
||||
if(master)
|
||||
master.spawn_spacevine_piece(stepturf, src)
|
||||
|
||||
/obj/effect/spacevine/ex_act(severity)
|
||||
var/i
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
i += SM.on_explosion(severity, src)
|
||||
if(!i && prob(100/severity))
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spacevine/temperature_expose(null, temp, volume)
|
||||
var/override = 0
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
override += SM.process_temperature(src, temp, volume)
|
||||
if(!override)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spacevine/CanPass(atom/movable/mover, turf/target, height=0)
|
||||
if(isvineimmune(mover))
|
||||
. = TRUE
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/proc/isvineimmune(atom/A)
|
||||
. = FALSE
|
||||
if(isliving(A))
|
||||
var/mob/living/M = A
|
||||
if(("vines" in M.faction) || ("plants" in M.faction))
|
||||
. = TRUE
|
||||
@@ -10,7 +10,7 @@
|
||||
sent_spiders_to_station = 1
|
||||
|
||||
/datum/event/spider_infestation/announce()
|
||||
command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
|
||||
event_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
|
||||
|
||||
/datum/event/spider_infestation/start()
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
var/obj/effect/tear/TE
|
||||
|
||||
/datum/event/tear/announce()
|
||||
command_announcement.Announce("A tear in the fabric of space and time has opened. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
event_announcement.Announce("A tear in the fabric of space and time has opened. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
/datum/event/tear/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
var/list/vents = list()
|
||||
|
||||
/datum/event/vent_clog/announce()
|
||||
command_announcement.Announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert")
|
||||
event_announcement.Announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert")
|
||||
|
||||
/datum/event/vent_clog/setup()
|
||||
endWhen = rand(25, 100)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
endWhen = announceWhen + 1
|
||||
|
||||
/datum/event/wallrot/announce()
|
||||
command_announcement.Announce("Harmful fungi detected on station. Station structures may be contaminated.", "Biohazard Alert")
|
||||
event_announcement.Announce("Harmful fungi detected on station. Station structures may be contaminated.", "Biohazard Alert")
|
||||
|
||||
/datum/event/wallrot/start()
|
||||
spawn()
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
wormholes += new /obj/effect/portal/wormhole(T, null, null, -1)
|
||||
|
||||
/datum/event/wormholes/announce()
|
||||
command_announcement.Announce("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert", new_sound = 'sound/AI/spanomalies.ogg')
|
||||
event_announcement.Announce("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert", new_sound = 'sound/AI/spanomalies.ogg')
|
||||
|
||||
/datum/event/wormholes/tick()
|
||||
if(activeFor % shift_frequency == 0)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfish,
|
||||
"clownfish" = /obj/item/weapon/bananapeel/clownfish,
|
||||
"clownfish" = /obj/item/weapon/grown/bananapeel/clownfish,
|
||||
"shark" = /obj/item/weapon/fish/shark,
|
||||
"baby space carp" = /obj/item/weapon/fish/babycarp,
|
||||
"catfish" = /obj/item/weapon/fish/catfish,
|
||||
@@ -208,7 +208,7 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/weapon/bananapeel/clownfish
|
||||
/obj/item/weapon/grown/bananapeel/clownfish
|
||||
name = "clown fish"
|
||||
desc = "Even underwater, you cannot escape HONKing."
|
||||
icon = 'icons/obj/fish_items.dmi'
|
||||
|
||||
@@ -213,12 +213,7 @@
|
||||
for(var/i = 1, i <= slots.len, i++)
|
||||
var/obj/item/O = slots[i]
|
||||
if(istype(O, recipe.ingredients[i]))
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O
|
||||
if(G.seed && G.seed.kitchen_tag == recipe.tags[i])
|
||||
number_matches++
|
||||
else
|
||||
number_matches++
|
||||
number_matches++
|
||||
if(number_matches == 3)
|
||||
return recipe
|
||||
return null
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
var/name = ""
|
||||
var/description = ""
|
||||
var/list/ingredients[3]
|
||||
var/list/tags[3]
|
||||
var/datum/reagent/result = null
|
||||
|
||||
|
||||
@@ -12,12 +11,10 @@
|
||||
name = "Example"
|
||||
description = "This is an example."
|
||||
ingredients = list(thing_1, thing_2, thing_3)
|
||||
tags = list(null, "tag_2", null)
|
||||
result = "water"
|
||||
|
||||
The ingredients list must have 3 non-null entries.
|
||||
The tags list must have 3 entries, using null where a tag is unused.
|
||||
Failing to ensure both lists have EXACTLY 3 entries (unless the system is updated in the future to use a different number) will result in runtimes.
|
||||
Failing to ensure the list has EXACTLY 3 entries (unless the system is updated in the future to use a different number) will result in runtimes.
|
||||
There is no excuse to do this wrong now that there is an example for you. --FalseIncarnate
|
||||
*/
|
||||
|
||||
@@ -25,62 +22,55 @@ There is no excuse to do this wrong now that there is an example for you. --Fals
|
||||
/datum/bottler_recipe/Paradise_Punch
|
||||
name = "Paradise Punch"
|
||||
description = "Tastes just how you'd think Paradise would if you could bottle it."
|
||||
ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown)
|
||||
tags = list("grapes", "banana", "cherries")
|
||||
ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown/grapes,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries)
|
||||
result = "paradise_punch"
|
||||
|
||||
/datum/bottler_recipe/Applepocalypse
|
||||
name = "Apple-pocalypse"
|
||||
description = "If doomsday came in fruit form, it'd probably be apples."
|
||||
ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown)
|
||||
tags = list("apple", "apple", "apple")
|
||||
ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown/apple,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple)
|
||||
result = "apple-pocalypse"
|
||||
|
||||
/datum/bottler_recipe/Berry_Banned
|
||||
name = "Berry Banned"
|
||||
description = "Reason for ban: Excessive Flavor."
|
||||
ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown)
|
||||
tags = list("berries", "berries", "berries")
|
||||
ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown/berries,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries)
|
||||
result = "berry_banned"
|
||||
|
||||
/datum/bottler_recipe/Berry_Banned2
|
||||
name = "Berry Banned"
|
||||
description = "Reason for ban: Excessive Flavor."
|
||||
ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown)
|
||||
tags = list("poisonberries", "poisonberries", "poisonberries")
|
||||
ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison)
|
||||
result = "berry_banned2"
|
||||
|
||||
/datum/bottler_recipe/Blackeye_Brew
|
||||
name = "Blackeye Brew"
|
||||
description = "Creamy, smooth flavor, just like the bald heads of the masses. Supposedly aged for 30 years."
|
||||
ingredients = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/icecream)
|
||||
tags = list(null, "sugarcane", null)
|
||||
result = "blackeye_brew"
|
||||
|
||||
/datum/bottler_recipe/Grape_Granade
|
||||
name = "Grape Granade"
|
||||
description = "Exploding with grape flavor and a favorite among ERT members system-wide."
|
||||
ingredients = list(/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/grapes,
|
||||
/obj/item/device/flash)
|
||||
tags = list(null, "grapes", null)
|
||||
result = "grape_granade"
|
||||
|
||||
/datum/bottler_recipe/Meteor_Malt
|
||||
name = "Meteor Malt"
|
||||
description = "Soft drinks have been detected on collision course with your tastebuds."
|
||||
ingredients = list(/obj/item/weapon/ore,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/wheat,
|
||||
/obj/item/weapon/ore)
|
||||
tags = list(null, "wheat", null)
|
||||
result = "meteor_malt"
|
||||
|
||||
@@ -331,4 +331,11 @@
|
||||
name = "cup"
|
||||
desc = "A cup with the british flag emblazoned on it."
|
||||
icon_state = "britcup"
|
||||
volume = 30
|
||||
volume = 30
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mushroom_bowl
|
||||
name = "mushroom bowl"
|
||||
desc = "A bowl made out of mushrooms. Not food, though it might have contained some at some point."
|
||||
icon = 'icons/obj/lavaland/ash_flora.dmi'
|
||||
icon_state = "mushroom_bowl"
|
||||
w_class = 2
|
||||
@@ -44,4 +44,12 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/ham
|
||||
name = "Ham"
|
||||
desc = "Taste like bacon."
|
||||
list_reagents = list("protein" = 3, "porktonium" = 10)
|
||||
list_reagents = list("protein" = 3, "porktonium" = 10)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/meatwheat
|
||||
name = "meatwheat clump"
|
||||
desc = "This doesn't look like meat, but your standards aren't <i>that</i> high to begin with."
|
||||
list_reagents = list("nutriment" = 3, "vitamin" = 2, "blood" = 5)
|
||||
filling_color = rgb(150, 0, 0)
|
||||
icon_state = "meatwheat_clump"
|
||||
bitesize = 4
|
||||
@@ -11,7 +11,9 @@
|
||||
var/eatverb
|
||||
var/wrapped = 0
|
||||
var/dried_type = null
|
||||
var/dry = 0
|
||||
var/cooktype[0]
|
||||
var/cooked_type = null //for microwave cooking. path of the resulting item after microwaving
|
||||
|
||||
|
||||
//Placeholder for effect that trigger on eating that aren't tied to reagents.
|
||||
@@ -25,12 +27,8 @@
|
||||
user.visible_message("<span class='notice'>[user] finishes eating \the [src].</span>")
|
||||
user.unEquip(src) //so icons update :[
|
||||
Post_Consume(M)
|
||||
if(trash)
|
||||
if(ispath(trash,/obj/item))
|
||||
var/obj/item/TrashItem = new trash(user)
|
||||
user.put_in_hands(TrashItem)
|
||||
else if(istype(trash,/obj/item))
|
||||
user.put_in_hands(trash)
|
||||
var/obj/item/trash_item = generate_trash(usr)
|
||||
usr.put_in_hands(trash_item)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -173,6 +171,19 @@
|
||||
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/proc/generate_trash(atom/location)
|
||||
if(trash)
|
||||
if(ispath(trash, /obj/item))
|
||||
. = new trash(location)
|
||||
trash = null
|
||||
return
|
||||
else if(istype(trash, /obj/item))
|
||||
var/obj/item/trash_item = trash
|
||||
trash_item.forceMove(location)
|
||||
. = trash
|
||||
trash = null
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/Destroy()
|
||||
if(contents)
|
||||
for(var/atom/movable/something in contents)
|
||||
@@ -887,6 +898,12 @@
|
||||
junkiness = 25
|
||||
list_reagents = list("protein" = 1, "sugar" = 3)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sosjerky/healthy
|
||||
name = "homemade beef jerky"
|
||||
desc = "Homemade beef jerky made from the finest space cows."
|
||||
list_reagents = list("nutriment" = 3, "vitamin" = 1)
|
||||
junkiness = 0
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pistachios
|
||||
name = "Pistachios"
|
||||
icon_state = "pistachios"
|
||||
@@ -905,6 +922,12 @@
|
||||
junkiness = 25
|
||||
list_reagents = list("plantmatter" = 2, "sugar" = 4)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/no_raisin/healthy
|
||||
name = "homemade raisins"
|
||||
desc = "homemade raisins, the best in all of spess."
|
||||
list_reagents = list("nutriment" = 3, "vitamin" = 2)
|
||||
junkiness = 0
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie
|
||||
name = "Space Twinkie"
|
||||
icon_state = "space_twinkie"
|
||||
@@ -2472,4 +2495,27 @@
|
||||
trash = /obj/item/trash/tastybread
|
||||
filling_color = "#A66829"
|
||||
junkiness = 20
|
||||
list_reagents = list("nutriment" = 2, "sugar" = 4)
|
||||
list_reagents = list("nutriment" = 2, "sugar" = 4)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/yakiimo
|
||||
name = "yaki imo"
|
||||
desc = "Made with roasted sweet potatoes!"
|
||||
icon_state = "yakiimo"
|
||||
trash = /obj/item/trash/plate
|
||||
list_reagents = list("nutriment" = 5, "vitamin" = 4)
|
||||
filling_color = "#8B1105"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/roastparsnip
|
||||
name = "roast parsnip"
|
||||
desc = "Sweet and crunchy."
|
||||
icon_state = "roastparsnip"
|
||||
trash = /obj/item/trash/plate
|
||||
list_reagents = list("nutriment" = 3, "vitamin" = 4)
|
||||
filling_color = "#FF5500"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tatortot
|
||||
name = "tator tot"
|
||||
desc = "A large fried potato nugget that may or may not try to valid you."
|
||||
icon_state = "tatortot"
|
||||
list_reagents = list("nutriment" = 4)
|
||||
filling_color = "FFD700"
|
||||
@@ -48,11 +48,7 @@
|
||||
return 0
|
||||
for(var/Type in subtypesof(/datum/deepfryer_special))
|
||||
var/datum/deepfryer_special/P = new Type()
|
||||
if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/grown))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/G = I
|
||||
if(G.seed.kitchen_tag != P.input)
|
||||
continue
|
||||
else if(!istype(I, P.input))
|
||||
if(!istype(I, P.input))
|
||||
continue
|
||||
return P
|
||||
return 0
|
||||
|
||||
@@ -258,8 +258,8 @@
|
||||
new /obj/effect/decal/cleanable/blood/gibs(src)
|
||||
|
||||
if(!UserOverride)
|
||||
occupant.attack_log += "\[[time_stamp()]\] Was gibbed by [key_name(user)]" //One shall not simply gib a mob unnoticed!
|
||||
user.attack_log += "\[[time_stamp()]\] Gibbed [key_name(occupant)]"
|
||||
occupant.create_attack_log("Was gibbed by [key_name(user)]") //One shall not simply gib a mob unnoticed!)
|
||||
user.create_attack_log("Gibbed [key_name(occupant)]")
|
||||
|
||||
if(occupant.ckey)
|
||||
msg_admin_attack("[key_name_admin(user)] gibbed [key_name_admin(occupant)]")
|
||||
@@ -270,7 +270,7 @@
|
||||
occupant.LAssailant = user
|
||||
|
||||
else //this looks ugly but it's better than a copy-pasted startgibbing proc override
|
||||
occupant.attack_log += "\[[time_stamp()]\] Was gibbed by <b>an autogibber (\the [src])</b>"
|
||||
occupant.create_attack_log("Was gibbed by <b>an autogibber (\the [src])</b>")
|
||||
|
||||
occupant.emote("scream")
|
||||
playsound(get_turf(src), 'sound/goonstation/effects/gib.ogg', 50, 1)
|
||||
|
||||
@@ -4,27 +4,29 @@
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "juicer1"
|
||||
layer = 2.9
|
||||
density = 0
|
||||
density = 1
|
||||
anchored = 0
|
||||
use_power = 1
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 100
|
||||
pass_flags = PASSTABLE
|
||||
var/obj/item/weapon/reagent_containers/beaker = null
|
||||
var/global/list/allowed_items = list(
|
||||
var/global/list/allowed_items = list (
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = "tomatojuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot = "carrotjuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/grapes = "grapejuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/grapes/green = "grapejuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana = "banana",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/potato = "potato",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon = "lemonjuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = "orangejuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime = "limejuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon = "watermelonjuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/watermelonslice = "watermelonjuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown = "water",
|
||||
)
|
||||
|
||||
var/global/list/allowed_tags = list (
|
||||
"tomato" = "tomatojuice",
|
||||
"carrot" = "carrotjuice",
|
||||
"berries" = "berryjuice",
|
||||
"banana" = "banana",
|
||||
"potato" = "potato",
|
||||
"lemon" = "lemonjuice",
|
||||
"orange" = "orangejuice",
|
||||
"lime" = "limejuice",
|
||||
"poisonberries" = "poisonberryjuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison = "poisonberryjuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries = "berryjuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = "pumpkinjuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin = "blumpkinjuice",
|
||||
)
|
||||
|
||||
/obj/machinery/juicer/New()
|
||||
@@ -135,23 +137,18 @@
|
||||
beaker = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/juicer/proc/get_juice_id(var/obj/item/weapon/reagent_containers/food/snacks/O)
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/watermelonslice))
|
||||
return "watermelonjuice"
|
||||
else if(istype(O, /obj.item/weapon/reagent_containers/food/snacks/grown))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O
|
||||
for(var/i in allowed_tags)
|
||||
if(G.seed.kitchen_tag == allowed_tags[i])
|
||||
return allowed_tags[i]
|
||||
return "water"
|
||||
/obj/machinery/juicer/proc/get_juice_id(obj/item/weapon/reagent_containers/food/snacks/grown/O)
|
||||
for (var/i in allowed_items)
|
||||
if (istype(O, i))
|
||||
return allowed_items[i]
|
||||
|
||||
/obj/machinery/juicer/proc/get_juice_amount(var/obj/item/weapon/reagent_containers/food/snacks/grown/O)
|
||||
if(!istype(O))
|
||||
/obj/machinery/juicer/proc/get_juice_amount(obj/item/weapon/reagent_containers/food/snacks/grown/O)
|
||||
if(!istype(O) || !O.seed)
|
||||
return 5
|
||||
else if(O.potency == -1)
|
||||
else if (O.seed.potency == -1)
|
||||
return 5
|
||||
else
|
||||
return round(5*sqrt(O.potency))
|
||||
return round(5*sqrt(O.seed.potency))
|
||||
|
||||
/obj/machinery/juicer/proc/juice()
|
||||
power_change() //it is a portable machine
|
||||
@@ -167,19 +164,21 @@
|
||||
if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
|
||||
break
|
||||
|
||||
/obj/structure/closet/crate/juice
|
||||
New()
|
||||
..()
|
||||
new/obj/machinery/juicer(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
|
||||
/obj/structure/closet/crate/juice/New()
|
||||
..()
|
||||
new/obj/machinery/juicer(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/grapes(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/grapes(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/grapes(src)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
use_power = 1
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 100
|
||||
flags = OPENCONTAINER | NOREACT
|
||||
flags = OPENCONTAINER
|
||||
var/operating = 0 // Is it on?
|
||||
var/dirty = 0 // = {0..100} Does it need cleaning?
|
||||
var/broken = 0 // ={0,1,2} How broken is it???
|
||||
@@ -33,6 +33,7 @@
|
||||
|
||||
/obj/machinery/kitchen_machine/New()
|
||||
create_reagents(100)
|
||||
reagents.set_reacting(FALSE)
|
||||
if(!available_recipes)
|
||||
available_recipes = new
|
||||
acceptable_items = new
|
||||
@@ -45,7 +46,7 @@
|
||||
acceptable_items |= item
|
||||
for(var/reagent in recipe.reagents)
|
||||
acceptable_reagents |= reagent
|
||||
if(recipe.items || recipe.fruit)
|
||||
if(recipe.items)
|
||||
max_n_of_items = max(max_n_of_items,recipe.count_n_items())
|
||||
else
|
||||
qdel(recipe)
|
||||
|
||||
@@ -71,21 +71,34 @@
|
||||
input = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
output = /obj/item/weapon/reagent_containers/food/snacks/meatball
|
||||
|
||||
/datum/food_processor_process/potato
|
||||
input = "potato"
|
||||
/datum/food_processor_process/potatowedges
|
||||
input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato/wedges
|
||||
output = /obj/item/weapon/reagent_containers/food/snacks/fries
|
||||
|
||||
/datum/food_processor_process/sweetpotato
|
||||
input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato/sweet
|
||||
output = /obj/item/weapon/reagent_containers/food/snacks/yakiimo
|
||||
|
||||
/datum/food_processor_process/potato
|
||||
input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato
|
||||
output = /obj/item/weapon/reagent_containers/food/snacks/tatortot
|
||||
|
||||
/datum/food_processor_process/carrot
|
||||
input = "carrot"
|
||||
input = /obj/item/weapon/reagent_containers/food/snacks/grown/carrot
|
||||
output = /obj/item/weapon/reagent_containers/food/snacks/carrotfries
|
||||
|
||||
/datum/food_processor_process/soybeans
|
||||
input = "soybeans"
|
||||
input = /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans
|
||||
output = /obj/item/weapon/reagent_containers/food/snacks/soydope
|
||||
|
||||
/datum/food_processor_process/spaghetti
|
||||
input = /obj/item/weapon/reagent_containers/food/snacks/doughslice
|
||||
output = /obj/item/weapon/reagent_containers/food/snacks/spagetti
|
||||
|
||||
/datum/food_processor_process/parsnip
|
||||
input = /obj/item/weapon/reagent_containers/food/snacks/grown/parsnip
|
||||
output = /obj/item/weapon/reagent_containers/food/snacks/roastparsnip
|
||||
|
||||
/////////////////////////
|
||||
///END OBJECT RECIPIES///
|
||||
/////////////////////////
|
||||
@@ -142,14 +155,10 @@
|
||||
|
||||
//END RECIPE DATUMS
|
||||
|
||||
/obj/machinery/processor/proc/select_recipe(var/X)
|
||||
/obj/machinery/processor/proc/select_recipe(X)
|
||||
for(var/Type in subtypesof(/datum/food_processor_process) - /datum/food_processor_process/mob)
|
||||
var/datum/food_processor_process/P = new Type()
|
||||
if(istype(X, /obj/item/weapon/reagent_containers/food/snacks/grown))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/G = X
|
||||
if(G.seed.kitchen_tag != P.input)
|
||||
continue
|
||||
else if(!istype(X, P.input))
|
||||
if(!istype(X, P.input))
|
||||
continue
|
||||
return P
|
||||
return 0
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
use_power = 1
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 100
|
||||
flags = NOREACT
|
||||
var/max_n_of_items = 1500
|
||||
var/icon_on = "smartfridge"
|
||||
var/icon_off = "smartfridge-off"
|
||||
@@ -25,6 +24,8 @@
|
||||
|
||||
/obj/machinery/smartfridge/New()
|
||||
..()
|
||||
create_reagents()
|
||||
reagents.set_reacting(FALSE)
|
||||
component_parts = list()
|
||||
var/obj/item/weapon/circuitboard/smartfridge/board = new(null)
|
||||
board.set_type(type)
|
||||
@@ -54,7 +55,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/smartfridge/proc/accept_check(obj/item/O)
|
||||
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/))
|
||||
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/) || istype(O,/obj/item/weapon/grown/))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -192,14 +193,15 @@
|
||||
* Item Adding
|
||||
********************/
|
||||
|
||||
/obj/machinery/smartfridge/attackby(obj/item/O, mob/user)
|
||||
if(istype(O, /obj/item/weapon/screwdriver) && anchored)
|
||||
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
|
||||
panel_open = !panel_open
|
||||
to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
|
||||
overlays.Cut()
|
||||
if(panel_open)
|
||||
overlays += image(icon, "[initial(icon_state)]-panel")
|
||||
/obj/machinery/smartfridge/default_deconstruction_screwdriver(mob/user, obj/item/weapon/screwdriver/S)
|
||||
. = ..(user, icon_state, icon_state, S)
|
||||
|
||||
overlays.Cut()
|
||||
if(panel_open)
|
||||
overlays += image(icon, "[initial(icon_state)]-panel")
|
||||
|
||||
/obj/machinery/smartfridge/attackby(obj/item/O, var/mob/user)
|
||||
if(default_deconstruction_screwdriver(user, O))
|
||||
return
|
||||
|
||||
if(exchange_parts(user, O))
|
||||
@@ -305,7 +307,7 @@
|
||||
to_chat(user, "<span class='notice'>Some items are refused.</span>")
|
||||
nanomanager.update_uis(src)
|
||||
|
||||
/obj/machinery/smartfridge/secure/emag_act(user)
|
||||
/obj/machinery/smartfridge/secure/emag_act(mob/user)
|
||||
emagged = 1
|
||||
locked = -1
|
||||
to_chat(user, "You short out the product lock on [src].")
|
||||
@@ -401,6 +403,127 @@
|
||||
visible_message("<span class='warning'>[src] launches [throw_item.name] at [target.name]!</span>")
|
||||
return 1
|
||||
|
||||
// ----------------------------
|
||||
// Drying Rack 'smartfridge'
|
||||
// ----------------------------
|
||||
/obj/machinery/smartfridge/drying_rack
|
||||
name = "drying rack"
|
||||
desc = "A wooden contraption, used to dry plant products, food and leather."
|
||||
icon = 'icons/obj/hydroponics/equipment.dmi'
|
||||
icon_state = "drying_rack_on"
|
||||
use_power = 1
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 200
|
||||
icon_on = "drying_rack_on"
|
||||
icon_off = "drying_rack"
|
||||
var/drying = FALSE
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/New()
|
||||
..()
|
||||
if(component_parts && component_parts.len)
|
||||
component_parts.Cut()
|
||||
component_parts = null
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/Destroy()
|
||||
new /obj/item/stack/sheet/wood(loc, 10)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/RefreshParts()
|
||||
return
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/default_deconstruction_screwdriver()
|
||||
return
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/exchange_parts()
|
||||
return
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/spawn_frame()
|
||||
return
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/default_deconstruction_crowbar(obj/item/weapon/crowbar/C, ignore_panel = 1)
|
||||
..()
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/power_change()
|
||||
if(powered() && anchored)
|
||||
stat &= ~NOPOWER
|
||||
else
|
||||
stat |= NOPOWER
|
||||
toggle_drying(TRUE)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/load() //For updating the filled overlay
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/update_icon()
|
||||
..()
|
||||
overlays.Cut()
|
||||
if(drying)
|
||||
overlays += "drying_rack_drying"
|
||||
if(contents.len)
|
||||
overlays += "drying_rack_filled"
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/process()
|
||||
..()
|
||||
if(drying)
|
||||
if(rack_dry())//no need to update unless something got dried
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/accept_check(obj/item/O)
|
||||
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/S = O
|
||||
if(S.dried_type)
|
||||
return TRUE
|
||||
if(istype(O,/obj/item/stack/sheet/wetleather/))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/proc/toggle_drying(forceoff)
|
||||
if(drying || forceoff)
|
||||
drying = FALSE
|
||||
use_power = 1
|
||||
else
|
||||
drying = TRUE
|
||||
use_power = 2
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/proc/rack_dry()
|
||||
for(var/obj/item/weapon/reagent_containers/food/snacks/S in contents)
|
||||
if(S.dried_type == S.type)//if the dried type is the same as the object's type, don't bother creating a whole new item...
|
||||
S.color = "#ad7257"
|
||||
S.dry = TRUE
|
||||
S.forceMove(get_turf(src))
|
||||
else
|
||||
var/dried = S.dried_type
|
||||
new dried(loc)
|
||||
qdel(S)
|
||||
return TRUE
|
||||
for(var/obj/item/stack/sheet/wetleather/WL in contents)
|
||||
var/obj/item/stack/sheet/leather/L = new(loc)
|
||||
L.amount = WL.amount
|
||||
qdel(WL)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/emp_act(severity)
|
||||
..()
|
||||
atmos_spawn_air(SPAWN_HEAT)
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/verb/adjust_drying()
|
||||
set category = "Object"
|
||||
set name = "Toggle Drying"
|
||||
set src in view(1)
|
||||
|
||||
if(!iscarbon(usr))
|
||||
to_chat(usr, "<span class='warning'>You can't do that!</span>")
|
||||
return
|
||||
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
|
||||
toggle_drying(FALSE)
|
||||
update_icon()
|
||||
|
||||
/************************
|
||||
* Secure SmartFridges
|
||||
*************************/
|
||||
@@ -413,4 +536,4 @@
|
||||
to_chat(usr, "<span class='warning'>Access denied.</span>")
|
||||
nanomanager.update_uis(src)
|
||||
return 0
|
||||
return ..()
|
||||
return ..()
|
||||
@@ -27,14 +27,14 @@
|
||||
|
||||
/datum/recipe/candy/fudge_peanut
|
||||
reagents = list("sugar" = 5, "milk" = 5)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar)
|
||||
fruit = list("peanuts" = 3)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar, /obj/item/weapon/reagent_containers/food/snacks/grown/peanuts,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/peanuts, /obj/item/weapon/reagent_containers/food/snacks/grown/peanuts)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/peanut
|
||||
|
||||
/datum/recipe/candy/fudge_cherry
|
||||
reagents = list("sugar" = 5, "milk" = 5)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar)
|
||||
fruit = list("cherries" = 3)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar, /obj/item/weapon/reagent_containers/food/snacks/grown/cherries,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries, /obj/item/weapon/reagent_containers/food/snacks/grown/cherries)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/cherry
|
||||
|
||||
/datum/recipe/candy/fudge_cookies_n_cream
|
||||
@@ -50,8 +50,8 @@
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/caramel,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/peanuts
|
||||
)
|
||||
fruit = list("peanuts" = 1)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/turtle
|
||||
|
||||
/datum/recipe/candy/fudge
|
||||
@@ -319,10 +319,7 @@
|
||||
|
||||
/datum/recipe/candy/gummybear_wtf2
|
||||
reagents = list()
|
||||
fruit = list("ambrosia" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear
|
||||
)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/wtf
|
||||
|
||||
// ***********************************************************
|
||||
@@ -386,10 +383,7 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/wtf
|
||||
|
||||
/datum/recipe/candy/gummyworm_wtf2
|
||||
fruit = list("ambrosia" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm
|
||||
)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/wtf
|
||||
|
||||
// ***********************************************************
|
||||
@@ -489,10 +483,7 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/wtf
|
||||
|
||||
/datum/recipe/candy/jellybean_wtf2
|
||||
fruit = list("ambrosia" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean
|
||||
)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/wtf
|
||||
|
||||
// ***********************************************************
|
||||
|
||||
@@ -10,11 +10,8 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/boiledegg
|
||||
|
||||
/datum/recipe/microwave/dionaroast
|
||||
fruit = list("apple" = 1)
|
||||
reagents = list("facid" = 5) //It dissolves the carapace. Still poisonous, though.
|
||||
items = list(
|
||||
/obj/item/weapon/holder/diona,
|
||||
)
|
||||
items = list(/obj/item/weapon/holder/diona, /obj/item/weapon/reagent_containers/food/snacks/grown/apple)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/dionaroast
|
||||
|
||||
/datum/recipe/microwave/jellydonut
|
||||
@@ -150,16 +147,16 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/warmdonkpocket
|
||||
|
||||
/datum/recipe/microwave/eggplantparm
|
||||
fruit = list("eggplant" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/eggplant
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/eggplantparm
|
||||
|
||||
/datum/recipe/microwave/soylenviridians
|
||||
fruit = list("soybeans" = 1)
|
||||
reagents = list("flour" = 10)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soylenviridians
|
||||
|
||||
/datum/recipe/microwave/soylentgreen
|
||||
@@ -185,25 +182,27 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/cheesyfries
|
||||
|
||||
/datum/recipe/microwave/cubancarp
|
||||
fruit = list("chili" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/carpmeat,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/chili
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/cubancarp
|
||||
|
||||
/datum/recipe/microwave/popcorn
|
||||
fruit = list("corn" = 1)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/corn)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/popcorn
|
||||
|
||||
/datum/recipe/microwave/spacylibertyduff
|
||||
reagents = list("water" = 5, "vodka" = 5)
|
||||
fruit = list("libertycap" = 3)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap, /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff
|
||||
|
||||
/datum/recipe/microwave/amanitajelly
|
||||
reagents = list("water" = 5, "vodka" = 5)
|
||||
fruit = list("amanita" = 3)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita, /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/amanitajelly
|
||||
|
||||
/datum/recipe/microwave/amanitajelly/make_food(obj/container)
|
||||
@@ -213,23 +212,18 @@
|
||||
|
||||
/datum/recipe/microwave/meatballsoup
|
||||
reagents = list("water" = 10)
|
||||
fruit = list("potato" = 1, "carrot" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meatball ,
|
||||
)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/meatball, /obj/item/weapon/reagent_containers/food/snacks/grown/potato, /obj/item/weapon/reagent_containers/food/snacks/grown/carrot)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/meatballsoup
|
||||
|
||||
/datum/recipe/microwave/vegetablesoup
|
||||
reagents = list("water" = 10)
|
||||
fruit = list("carrot" = 1, "corn" = 1, "eggplant" = 1, "potato" = 1)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/potato, /obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/corn, /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/vegetablesoup
|
||||
|
||||
/datum/recipe/microwave/nettlesoup
|
||||
reagents = list("water" = 10)
|
||||
fruit = list("nettle" = 1, "potato" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/egg,
|
||||
)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/egg, /obj/item/weapon/grown/nettle/basic, /obj/item/weapon/reagent_containers/food/snacks/grown/potato)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/nettlesoup
|
||||
|
||||
/datum/recipe/microwave/wishsoup
|
||||
@@ -237,17 +231,11 @@
|
||||
result= /obj/item/weapon/reagent_containers/food/snacks/wishsoup
|
||||
|
||||
/datum/recipe/microwave/hotchili
|
||||
fruit = list("chili" = 1, "tomato" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat,
|
||||
)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/meat, /obj/item/weapon/reagent_containers/food/snacks/grown/chili, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/hotchili
|
||||
|
||||
/datum/recipe/microwave/coldchili
|
||||
fruit = list("icechili" = 1, "tomato" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat,
|
||||
)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/meat, /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/coldchili
|
||||
|
||||
/datum/recipe/microwave/spellburger
|
||||
@@ -275,10 +263,7 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger
|
||||
|
||||
/datum/recipe/microwave/enchiladas
|
||||
fruit = list("chili" = 2, "corn" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cutlet,
|
||||
)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/cutlet, /obj/item/weapon/reagent_containers/food/snacks/grown/chili, /obj/item/weapon/reagent_containers/food/snacks/grown/corn)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas
|
||||
|
||||
/datum/recipe/microwave/burrito
|
||||
@@ -292,11 +277,8 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burrito
|
||||
|
||||
/datum/recipe/microwave/monkeysdelight
|
||||
fruit = list("banana" = 1)
|
||||
reagents = list("sodiumchloride" = 1, "blackpepper" = 1, "flour" = 10)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/monkeycube
|
||||
)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube, /obj/item/weapon/reagent_containers/food/snacks/grown/banana)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/monkeysdelight
|
||||
|
||||
/datum/recipe/microwave/fishandchips
|
||||
@@ -323,15 +305,14 @@
|
||||
|
||||
/datum/recipe/microwave/tomatosoup
|
||||
reagents = list("water" = 10)
|
||||
fruit = list("tomato" = 2)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/tomato, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/tomatosoup
|
||||
|
||||
/datum/recipe/microwave/stew
|
||||
reagents = list("water" = 10)
|
||||
fruit = list("tomato" = 1, "potato" = 1, "carrot" = 1, "eggplant" = 1, "mushroom" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat,
|
||||
)
|
||||
items= list(/obj/item/weapon/reagent_containers/food/snacks/grown/tomato, /obj/item/weapon/reagent_containers/food/snacks/grown/potato,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot, /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, /obj/item/weapon/reagent_containers/food/snacks/meat)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/stew
|
||||
|
||||
/datum/recipe/microwave/slimetoast
|
||||
@@ -359,11 +340,8 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/milosoup
|
||||
|
||||
/datum/recipe/microwave/stewedsoymeat
|
||||
fruit = list("carrot" = 1, "tomato" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/soydope,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/soydope,
|
||||
)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/soydope, /obj/item/weapon/reagent_containers/food/snacks/soydope,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat
|
||||
|
||||
/datum/recipe/microwave/boiledspagetti
|
||||
@@ -383,17 +361,12 @@
|
||||
|
||||
/datum/recipe/microwave/pastatomato
|
||||
reagents = list("water" = 5)
|
||||
fruit = list("tomato" = 2)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/spagetti,
|
||||
)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/spagetti, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pastatomato
|
||||
|
||||
/datum/recipe/microwave/poppypretzel
|
||||
items = list(
|
||||
/obj/item/seeds/poppyseed,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
)
|
||||
items = list(/obj/item/seeds/poppy, /obj/item/weapon/reagent_containers/food/snacks/dough)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/poppypretzel
|
||||
|
||||
/datum/recipe/microwave/meatballspagetti
|
||||
@@ -418,19 +391,19 @@
|
||||
|
||||
/datum/recipe/microwave/superbiteburger
|
||||
reagents = list("sodiumchloride" = 5, "blackpepper" = 5)
|
||||
fruit = list("tomato" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/boiledegg,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/superbiteburger
|
||||
|
||||
/datum/recipe/microwave/candiedapple
|
||||
reagents = list("water" = 5, "sugar" = 5)
|
||||
fruit = list("apple" = 1)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/apple)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candiedapple
|
||||
|
||||
/datum/recipe/microwave/slimeburger
|
||||
@@ -473,19 +446,18 @@ datum/recipe/microwave/slimesandwich
|
||||
|
||||
/datum/recipe/microwave/bloodsoup
|
||||
reagents = list("blood" = 10)
|
||||
fruit = list("bloodtomato" = 2)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/bloodsoup
|
||||
|
||||
/datum/recipe/microwave/slimesoup
|
||||
reagents = list("water" = 10, "slimejelly" = 5)
|
||||
items = list()
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/slimesoup
|
||||
|
||||
/datum/recipe/microwave/clownstears
|
||||
reagents = list("water" = 10)
|
||||
fruit = list("banana" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/ore/bananium,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/clownstears
|
||||
|
||||
@@ -519,25 +491,26 @@ datum/recipe/microwave/slimesandwich
|
||||
|
||||
/datum/recipe/microwave/mushroomsoup
|
||||
reagents = list("water" = 5, "milk" = 5)
|
||||
fruit = list("mushroom" = 1)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/mushroomsoup
|
||||
|
||||
/datum/recipe/microwave/chawanmushi
|
||||
reagents = list("water" = 5, "soysauce" = 5)
|
||||
fruit = list("mushroom" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/egg,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/egg,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/chawanmushi
|
||||
|
||||
/datum/recipe/microwave/beetsoup
|
||||
reagents = list("water" = 10)
|
||||
fruit = list("whitebeet" = 1, "cabbage" = 1)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/whitebeet, /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/beetsoup
|
||||
|
||||
/datum/recipe/microwave/herbsalad
|
||||
fruit = list("ambrosia" = 3, "apple" = 1)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, /obj/item/weapon/reagent_containers/food/snacks/grown/apple)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/herbsalad
|
||||
|
||||
/datum/recipe/microwave/herbsalad/make_food(obj/container)
|
||||
@@ -546,14 +519,14 @@ datum/recipe/microwave/slimesandwich
|
||||
return being_cooked
|
||||
|
||||
/datum/recipe/microwave/aesirsalad
|
||||
fruit = list("ambrosiadeus" = 3, "goldapple" = 1)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus, /obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/aesirsalad
|
||||
|
||||
/datum/recipe/microwave/validsalad
|
||||
fruit = list("ambrosia" = 3, "potato" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meatball,
|
||||
)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, /obj/item/weapon/reagent_containers/food/snacks/grown/potato,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meatball)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/validsalad
|
||||
|
||||
/datum/recipe/microwave/validsalad/make_food(obj/container)
|
||||
@@ -565,15 +538,12 @@ datum/recipe/microwave/slimesandwich
|
||||
|
||||
/datum/recipe/microwave/wrap
|
||||
reagents = list("soysauce" = 10)
|
||||
fruit = list("cabbage" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/friedegg,
|
||||
)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/friedegg, /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage )
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/wrap
|
||||
|
||||
/datum/recipe/microwave/beans
|
||||
reagents = list("ketchup" = 5)
|
||||
fruit = list("soybeans" = 2)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans, /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/beans
|
||||
|
||||
/datum/recipe/microwave/benedict
|
||||
@@ -586,10 +556,10 @@ datum/recipe/microwave/slimesandwich
|
||||
|
||||
/datum/recipe/microwave/meatbun
|
||||
reagents = list("soysauce" = 5)
|
||||
fruit = list("cabbage" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meatball,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/meatbun
|
||||
|
||||
@@ -610,9 +580,9 @@ datum/recipe/microwave/slimesandwich
|
||||
|
||||
/datum/recipe/microwave/friedbanana
|
||||
reagents = list("sugar" = 10, "cornoil" = 5)
|
||||
fruit = list("banana" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/friedbanana
|
||||
|
||||
@@ -655,8 +625,8 @@ datum/recipe/microwave/slimesandwich
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sashimi
|
||||
|
||||
/datum/recipe/microwave/mashedtaters
|
||||
fruit = list("potato" = 1)
|
||||
reagents = list("gravy" = 5)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/potato)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/mashed_potatoes
|
||||
|
||||
//////////////////////////////////////////
|
||||
|
||||
@@ -51,11 +51,11 @@
|
||||
|
||||
/datum/recipe/oven/bananabread
|
||||
reagents = list("milk" = 5, "sugar" = 15)
|
||||
fruit = list("banana" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread
|
||||
|
||||
@@ -68,11 +68,13 @@
|
||||
|
||||
/datum/recipe/oven/carrotcake
|
||||
reagents = list("milk" = 5, "sugar" = 15)
|
||||
fruit = list("carrot" = 3)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake
|
||||
|
||||
@@ -119,24 +121,24 @@
|
||||
|
||||
/datum/recipe/oven/pie
|
||||
reagents = list("sugar" = 5)
|
||||
fruit = list("banana" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie
|
||||
|
||||
/datum/recipe/oven/cherrypie
|
||||
reagents = list("sugar" = 10)
|
||||
fruit = list("cherries" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/cherrypie
|
||||
|
||||
/datum/recipe/oven/berryclafoutis
|
||||
fruit = list("berries" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/berryclafoutis
|
||||
|
||||
@@ -155,9 +157,9 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread
|
||||
|
||||
/datum/recipe/oven/loadedbakedpotato
|
||||
fruit = list("potato" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/potato
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato
|
||||
|
||||
@@ -194,71 +196,80 @@
|
||||
return .
|
||||
|
||||
/datum/recipe/oven/pizzamargherita
|
||||
fruit = list("tomato" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita
|
||||
|
||||
/datum/recipe/oven/meatpizza
|
||||
fruit = list("tomato" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza
|
||||
|
||||
/datum/recipe/oven/syntipizza
|
||||
fruit = list("tomato" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza
|
||||
|
||||
/datum/recipe/oven/mushroompizza
|
||||
fruit = list("mushroom" = 5, "tomato" = 1)
|
||||
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza
|
||||
|
||||
/datum/recipe/oven/vegetablepizza
|
||||
fruit = list("eggplant" = 1, "carrot" = 1, "corn" = 1, "tomato" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/eggplant,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/corn,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza
|
||||
|
||||
/datum/recipe/oven/amanita_pie
|
||||
fruit = list("amanita" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/amanita_pie
|
||||
|
||||
/datum/recipe/oven/plump_pie
|
||||
fruit = list("plumphelmet" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/plump_pie
|
||||
|
||||
/datum/recipe/oven/plumphelmetbiscuit
|
||||
fruit = list("plumphelmet" = 1)
|
||||
reagents = list("water" = 5, "flour" = 5)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit
|
||||
|
||||
/datum/recipe/oven/creamcheesebread
|
||||
@@ -301,49 +312,53 @@
|
||||
return being_cooked
|
||||
|
||||
/datum/recipe/oven/applepie
|
||||
fruit = list("apple" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/applepie
|
||||
|
||||
/datum/recipe/oven/applecake
|
||||
reagents = list("milk" = 5, "sugar" = 5)
|
||||
fruit = list("apple" = 2)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake
|
||||
|
||||
/datum/recipe/oven/orangecake
|
||||
reagents = list("milk" = 5)
|
||||
fruit = list("orange" = 2)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake
|
||||
|
||||
/datum/recipe/oven/limecake
|
||||
reagents = list("milk" = 5)
|
||||
fruit = list("lime" = 2)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake
|
||||
|
||||
/datum/recipe/oven/lemoncake
|
||||
reagents = list("milk" = 5)
|
||||
fruit = list("lemon" = 2)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake
|
||||
|
||||
@@ -370,17 +385,17 @@
|
||||
|
||||
/datum/recipe/oven/pumpkinpie
|
||||
reagents = list("milk" = 5, "sugar" = 5)
|
||||
fruit = list("pumpkin" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie
|
||||
|
||||
/datum/recipe/oven/appletart
|
||||
fruit = list("goldapple" = 1)
|
||||
reagents = list("sugar" = 5, "milk" = 5, "flour" = 10)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/egg
|
||||
/obj/item/weapon/reagent_containers/food/snacks/egg,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/appletart
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
tools[] = list() //type paths of items needed but not consumed
|
||||
time = 30 //time in deciseconds
|
||||
parts[] = list() //type paths of items that will be placed in the result
|
||||
fruit[] = list() //grown products required by the recipe
|
||||
*/
|
||||
|
||||
/datum/crafting_recipe/sandwich
|
||||
@@ -55,45 +54,6 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry
|
||||
category = CAT_FOOD
|
||||
|
||||
/* Temporarily disabled until we can find a workaround for this fruit shit.
|
||||
/datum/crafting_recipe/herbsalad
|
||||
name = "herb salad"
|
||||
fruit = list("ambrosia" = 3, "apple" = 1)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/herbsalad
|
||||
|
||||
/datum/crafting_recipe/herbsalad/AdjustChems(var/obj/resultobj as obj)
|
||||
if(istype(resultobj, /obj/item/weapon/reagent_containers))
|
||||
var/obj/item/weapon/reagent_containers/RC = resultobj
|
||||
RC.reagents.del_reagent("toxin")
|
||||
|
||||
/datum/crafting_recipe/aesirsalad
|
||||
name = "Aesir salad"
|
||||
fruit = list("ambrosiadeus" = 3, "goldapple" = 1)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/aesirsalad
|
||||
|
||||
/datum/crafting_recipe/validsalad
|
||||
name = "valid salad"
|
||||
fruit = list("ambrosia" = 3, "potato" = 1)
|
||||
reqs = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meatball = 1,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/validsalad
|
||||
|
||||
/datum/crafting_recipe/validsalad/AdjustChems(var/obj/resultobj as obj)
|
||||
if(istype(resultobj, /obj/item/weapon/reagent_containers))
|
||||
var/obj/item/weapon/reagent_containers/RC = resultobj
|
||||
RC.reagents.del_reagent("toxin")
|
||||
|
||||
/datum/crafting_recipe/wrap
|
||||
name = "egg wrap"
|
||||
fruit = list("cabbage" = 1)
|
||||
reqs = list(
|
||||
/datum/reagent/soysauce = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/friedegg = 1,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/wrap
|
||||
*/
|
||||
|
||||
/datum/crafting_recipe/notasandwich
|
||||
name = "not-a-sandwich"
|
||||
reqs = list(
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
|
||||
===============================================================================
|
||||
How Garbage Collection Works
|
||||
How Garbage Collection Works
|
||||
===============================================================================
|
||||
|
||||
In BYOND, there are exactly two ways anything gets deleted:
|
||||
@@ -31,8 +31,8 @@ that can't be. There are two main procs involved in this process:
|
||||
/proc/qdel(datumToDelete)
|
||||
This is, effectively, a replacement for del that tells an object to prepare itself to be soft deleted by calling its
|
||||
Destroy() proc. Depending on the qdel hint returned by Destroy(), qdel will queue the object in the garbage collector
|
||||
(to be hard deleted if it isn't soft deleted), directly delete the object, pool the object, or ignore the object and
|
||||
assume it will handle deleting itself. An object passed into qdel will have its gcDestroyed var set, so
|
||||
(to be hard deleted if it isn't soft deleted), directly delete the object, or ignore the object and
|
||||
assume it will handle deleting itself. An object passed into qdel will have its gcDestroyed var set, so
|
||||
isnull(gcDestroyed) will be true if an object is not being destroyed, and false if it is (which means you should get
|
||||
rid of the reference you have to it).
|
||||
|
||||
@@ -50,7 +50,7 @@ that can't be. There are two main procs involved in this process:
|
||||
should use a Del proc for any necessary cleanup, as a Destroy proc on them will not automatically get called.
|
||||
|
||||
When called by qdel, Destroy is expected to return a qdel hint, which determines whether the object should be directly
|
||||
deleted, queued for deletion, pooled, or ignored entirely; which of these are appropriate will vary, though objects
|
||||
deleted, queued for deletion, or ignored entirely; which of these are appropriate will vary, though objects
|
||||
should be pooled or queued whenever possible. The full list of qdel hints are in the code for the qdel proc.
|
||||
|
||||
As mentioned above, gcDestroyed can be used to tell whether an object is being destroyed. This is important, because if
|
||||
@@ -62,7 +62,4 @@ reference immediately.
|
||||
The inner workings of the GC itself and the stuff related to testing it probably don't need a detailed description - if
|
||||
you intend to work with them, it would be best to read the code to understand what they do.
|
||||
|
||||
Pooling is related to GC, in that it's meant to reduce deletion overhead, but it does so by re-using objects instead of
|
||||
deleting them at all. Explaining pooling is outside the scope of this file.
|
||||
|
||||
*/
|
||||
@@ -149,8 +149,6 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
|
||||
del(D)
|
||||
if(garbageCollector)
|
||||
garbageCollector.dels_count++
|
||||
if(QDEL_HINT_PUTINPOOL) //qdel will put this object in the pool.
|
||||
PlaceInPool(D,0)
|
||||
if(QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion.
|
||||
#ifdef TESTING
|
||||
D.find_references(remove_from_queue = FALSE)
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
/obj/structure/beebox
|
||||
name = "apiary"
|
||||
desc = "Dr Miles Manners is just your average Wasp themed super hero by day, but by night he becomes DR BEES!"
|
||||
icon = 'icons/obj/apiary_bees.dmi'
|
||||
icon = 'icons/obj/hydroponics/equipment.dmi'
|
||||
icon_state = "beebox"
|
||||
anchored = 1
|
||||
density = 1
|
||||
@@ -251,4 +251,4 @@
|
||||
if(!user.put_in_active_hand(QB))
|
||||
QB.forceMove(get_turf(src))
|
||||
visible_message("<span class='notice'>[user] removes the queen from the apiary.</span>")
|
||||
queen_bee = null
|
||||
queen_bee = null
|
||||
|
||||
@@ -13,4 +13,5 @@
|
||||
icon_state = "beekeeper"
|
||||
item_state = "beekeeper"
|
||||
flags = THICKMATERIAL
|
||||
allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer,/obj/item/weapon/minihoe)
|
||||
allowed = list (/obj/item/weapon/reagent_containers/spray,/obj/item/device/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/cultivator)
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
|
||||
/obj/item/honey_frame
|
||||
name = "honey frame"
|
||||
desc = "a scaffold for bees to build honeycomb on"
|
||||
icon = 'icons/obj/apiary_bees.dmi'
|
||||
desc = "A scaffold for bees to build honeycomb on."
|
||||
icon = 'icons/obj/hydroponics/equipment.dmi'
|
||||
icon_state = "honey_frame"
|
||||
var/honeycomb_capacity = 10 //10 Honeycomb per frame by default, researchable frames perhaps?
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/honeycomb
|
||||
name = "honeycomb"
|
||||
desc = "a hexagonal mesh of honeycomb"
|
||||
icon = 'icons/obj/apiary_bees.dmi'
|
||||
desc = "A hexagonal mesh of honeycomb."
|
||||
icon = 'icons/obj/hydroponics/harvest.dmi'
|
||||
icon_state = "honeycomb"
|
||||
possible_transfer_amounts = list()
|
||||
disease_amount = 0
|
||||
@@ -22,10 +22,10 @@
|
||||
overlays.Cut()
|
||||
var/image/honey
|
||||
if(honey_color)
|
||||
honey = image(icon = 'icons/obj/apiary_bees.dmi', icon_state = "greyscale_honey")
|
||||
honey = image(icon = 'icons/obj/hydroponics/harvest.dmi', icon_state = "greyscale_honey")
|
||||
honey.color = honey_color
|
||||
else
|
||||
honey = image(icon = 'icons/obj/apiary_bees.dmi', icon_state = "honey")
|
||||
honey = image(icon = 'icons/obj/hydroponics/harvest.dmi', icon_state = "honey")
|
||||
overlays += honey
|
||||
|
||||
|
||||
@@ -37,4 +37,4 @@
|
||||
reagents.add_reagent(R.id,5)
|
||||
else
|
||||
honey_color = ""
|
||||
update_icon()
|
||||
update_icon()
|
||||
@@ -0,0 +1,325 @@
|
||||
/obj/machinery/biogenerator
|
||||
name = "Biogenerator"
|
||||
desc = "Converts plants into biomass, which can be used to construct useful items."
|
||||
icon = 'icons/obj/biogenerator.dmi'
|
||||
icon_state = "biogen-empty"
|
||||
density = 1
|
||||
anchored = 1
|
||||
use_power = 1
|
||||
idle_power_usage = 40
|
||||
var/processing = 0
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker = null
|
||||
var/points = 0
|
||||
var/menustat = "menu"
|
||||
var/efficiency = 0
|
||||
var/productivity = 0
|
||||
var/max_items = 40
|
||||
var/datum/research/files
|
||||
var/list/show_categories = list("Food", "Botany Chemicals", "Leather and Cloth")
|
||||
var/list/timesFiveCategories = list("Food", "Botany Chemicals")
|
||||
|
||||
/obj/machinery/biogenerator/New()
|
||||
..()
|
||||
files = new /datum/research/biogenerator(src)
|
||||
create_reagents(1000)
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/weapon/circuitboard/biogenerator(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
|
||||
component_parts += new /obj/item/stack/cable_coil(null, 1)
|
||||
RefreshParts()
|
||||
|
||||
/obj/machinery/biogenerator/Destroy()
|
||||
if(beaker)
|
||||
qdel(beaker)
|
||||
beaker = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/biogenerator/ex_act(severity)
|
||||
if(beaker)
|
||||
beaker.ex_act(severity)
|
||||
..()
|
||||
|
||||
/obj/machinery/biogenerator/RefreshParts()
|
||||
var/E = 0
|
||||
var/P = 0
|
||||
var/max_storage = 40
|
||||
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
|
||||
P += B.rating
|
||||
max_storage = 40 * B.rating
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
|
||||
E += M.rating
|
||||
efficiency = E
|
||||
productivity = P
|
||||
max_items = max_storage
|
||||
|
||||
/obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well.
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/biogenerator/update_icon()
|
||||
if(panel_open)
|
||||
icon_state = "biogen-empty-o"
|
||||
else if(!beaker)
|
||||
icon_state = "biogen-empty"
|
||||
else if(!processing)
|
||||
icon_state = "biogen-stand"
|
||||
else
|
||||
icon_state = "biogen-work"
|
||||
return
|
||||
|
||||
/obj/machinery/biogenerator/attackby(obj/item/O, mob/user, params)
|
||||
if(user.a_intent == I_HARM)
|
||||
return ..()
|
||||
|
||||
if(processing)
|
||||
to_chat(user, "<span class='warning'>The biogenerator is currently processing.</span>")
|
||||
return
|
||||
|
||||
if(default_deconstruction_screwdriver(user, "biogen-empty-o", "biogen-empty", O))
|
||||
if(beaker)
|
||||
var/obj/item/weapon/reagent_containers/glass/B = beaker
|
||||
B.forceMove(loc)
|
||||
beaker = null
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(exchange_parts(user, O))
|
||||
return
|
||||
|
||||
if(default_deconstruction_crowbar(O))
|
||||
return
|
||||
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/glass))
|
||||
. = 1 //no afterattack
|
||||
if(!panel_open)
|
||||
if(beaker)
|
||||
to_chat(user, "<span class='warning'>A container is already loaded into the machine.</span>")
|
||||
else
|
||||
if(!user.drop_item())
|
||||
return
|
||||
O.forceMove(src)
|
||||
beaker = O
|
||||
to_chat(user, "<span class='notice'>You add the container to the machine.</span>")
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Close the maintenance panel first.</span>")
|
||||
return
|
||||
|
||||
else if(istype(O, /obj/item/weapon/storage/bag/plants))
|
||||
var/obj/item/weapon/storage/bag/plants/PB = O
|
||||
var/i = 0
|
||||
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
|
||||
i++
|
||||
if(i >= max_items)
|
||||
to_chat(user, "<span class='warning'>The biogenerator is already full! Activate it.</span>")
|
||||
else
|
||||
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in PB.contents)
|
||||
if(i >= max_items)
|
||||
break
|
||||
PB.remove_from_storage(G, src)
|
||||
i++
|
||||
if(i<max_items)
|
||||
to_chat(user, "<span class='info'>You empty the plant bag into the biogenerator.</span>")
|
||||
else if(PB.contents.len == 0)
|
||||
to_chat(user, "<span class='info'>You empty the plant bag into the biogenerator, filling it to its capacity.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='info'>You fill the biogenerator to its capacity.</span>")
|
||||
return 1 //no afterattack
|
||||
|
||||
else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
|
||||
var/i = 0
|
||||
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
|
||||
i++
|
||||
if(i >= max_items)
|
||||
to_chat(user, "<span class='warning'>The biogenerator is full! Activate it.</span>")
|
||||
else
|
||||
user.unEquip(O)
|
||||
O.forceMove(src)
|
||||
to_chat(user, "<span class='info'>You put [O.name] in [name]</span>")
|
||||
return 1 //no afterattack
|
||||
else if (istype(O, /obj/item/weapon/disk/design_disk))
|
||||
user.visible_message("[user] begins to load [O] in [src]...",
|
||||
"You begin to load a design from [O]...",
|
||||
"You hear the chatter of a floppy drive.")
|
||||
processing = 1
|
||||
var/obj/item/weapon/disk/design_disk/D = O
|
||||
if(do_after(user, 10, target = src))
|
||||
files.AddDesign2Known(D.blueprint)
|
||||
processing = 0
|
||||
return 1
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You cannot put this in [name]!</span>")
|
||||
|
||||
/obj/machinery/biogenerator/interact(mob/user)
|
||||
if(stat & BROKEN || panel_open)
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat
|
||||
if(processing)
|
||||
dat += "<div class='statusDisplay'>Biogenerator is processing! Please wait...</div><BR>"
|
||||
else
|
||||
switch(menustat)
|
||||
if("nopoints")
|
||||
dat += "<div class='statusDisplay'>You do not have enough biomass to create products.<BR>Please, put growns into reactor and activate it.</div>"
|
||||
menustat = "menu"
|
||||
if("complete")
|
||||
dat += "<div class='statusDisplay'>Operation complete.</div>"
|
||||
menustat = "menu"
|
||||
if("void")
|
||||
dat += "<div class='statusDisplay'>Error: No growns inside.<BR>Please, put growns into reactor.</div>"
|
||||
menustat = "menu"
|
||||
if("nobeakerspace")
|
||||
dat += "<div class='statusDisplay'>Not enough space left in container. Unable to create product.</div>"
|
||||
menustat = "menu"
|
||||
if(beaker)
|
||||
var/categories = show_categories.Copy()
|
||||
for(var/V in categories)
|
||||
categories[V] = list()
|
||||
for(var/V in files.known_designs)
|
||||
var/datum/design/D = files.known_designs[V]
|
||||
for(var/C in categories)
|
||||
if(C in D.category)
|
||||
categories[C] += D
|
||||
|
||||
dat += "<div class='statusDisplay'>Biomass: [points] units.</div><BR>"
|
||||
dat += "<A href='?src=[src.UID()];activate=1'>Activate</A><A href='?src=[src.UID()];detach=1'>Detach Container</A>"
|
||||
for(var/cat in categories)
|
||||
dat += "<h3>[cat]:</h3>"
|
||||
dat += "<div class='statusDisplay'>"
|
||||
for(var/V in categories[cat])
|
||||
var/datum/design/D = V
|
||||
dat += "[D.name]: <A href='?src=[src.UID()];create=[D.UID()];amount=1'>Make</A>"
|
||||
if(cat in timesFiveCategories)
|
||||
dat += "<A href='?src=[src.UID()];create=[D.UID()];amount=5'>x5</A>"
|
||||
if(ispath(D.build_path, /obj/item/stack))
|
||||
dat += "<A href='?src=[src.UID()];create=[D.UID()];amount=10'>x10</A>"
|
||||
dat += "([D.materials[MAT_BIOMASS]/efficiency])<br>"
|
||||
dat += "</div>"
|
||||
else
|
||||
dat += "<div class='statusDisplay'>No container inside, please insert container.</div>"
|
||||
|
||||
var/datum/browser/popup = new(user, "biogen", name, 350, 520)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
return
|
||||
|
||||
/obj/machinery/biogenerator/attack_hand(mob/user)
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/biogenerator/proc/activate()
|
||||
if(usr.stat != 0)
|
||||
return
|
||||
if(stat != 0) //NOPOWER etc
|
||||
return
|
||||
if(processing)
|
||||
to_chat(usr, "<span class='warning'>The biogenerator is in the process of working.</span>")
|
||||
return
|
||||
var/S = 0
|
||||
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/I in contents)
|
||||
S += 5
|
||||
if(I.reagents.get_reagent_amount("nutriment") < 0.1)
|
||||
points += 1*productivity
|
||||
else
|
||||
points += I.reagents.get_reagent_amount("nutriment")*10*productivity
|
||||
qdel(I)
|
||||
if(S)
|
||||
processing = 1
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
playsound(loc, 'sound/machines/blender.ogg', 50, 1)
|
||||
use_power(S*30)
|
||||
sleep(S+15/productivity)
|
||||
processing = 0
|
||||
update_icon()
|
||||
else
|
||||
menustat = "void"
|
||||
return
|
||||
|
||||
/obj/machinery/biogenerator/proc/check_cost(list/materials, multiplier = 1, remove_points = 1)
|
||||
if(materials.len != 1 || materials[1] != MAT_BIOMASS)
|
||||
return 0
|
||||
if (materials[MAT_BIOMASS]*multiplier/efficiency > points)
|
||||
menustat = "nopoints"
|
||||
return 0
|
||||
else
|
||||
if(remove_points)
|
||||
points -= materials[MAT_BIOMASS]*multiplier/efficiency
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
/obj/machinery/biogenerator/proc/check_container_volume(list/reagents, multiplier = 1)
|
||||
var/sum_reagents = 0
|
||||
for(var/R in reagents)
|
||||
sum_reagents += reagents[R]
|
||||
sum_reagents *= multiplier
|
||||
|
||||
if(beaker.reagents.total_volume + sum_reagents > beaker.reagents.maximum_volume)
|
||||
menustat = "nobeakerspace"
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
/obj/machinery/biogenerator/proc/create_product(datum/design/D, amount)
|
||||
if(!beaker || !loc)
|
||||
return 0
|
||||
|
||||
if(ispath(D.build_path, /obj/item/stack))
|
||||
if(!check_container_volume(D.make_reagents, amount))
|
||||
return 0
|
||||
if(!check_cost(D.materials, amount))
|
||||
return 0
|
||||
|
||||
var/obj/item/stack/product = new D.build_path(loc)
|
||||
product.amount = amount
|
||||
for(var/R in D.make_reagents)
|
||||
beaker.reagents.add_reagent(R, D.make_reagents[R]*amount)
|
||||
else
|
||||
var/i = amount
|
||||
while(i > 0)
|
||||
if(!check_container_volume(D.make_reagents))
|
||||
return .
|
||||
if(!check_cost(D.materials))
|
||||
return .
|
||||
if(D.build_path)
|
||||
new D.build_path(loc)
|
||||
for(var/R in D.make_reagents)
|
||||
beaker.reagents.add_reagent(R, D.make_reagents[R])
|
||||
. = 1
|
||||
--i
|
||||
|
||||
menustat = "complete"
|
||||
update_icon()
|
||||
return .
|
||||
|
||||
/obj/machinery/biogenerator/proc/detach()
|
||||
if(beaker)
|
||||
beaker.forceMove(loc)
|
||||
beaker = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/biogenerator/Topic(href, href_list)
|
||||
if(..() || panel_open)
|
||||
return
|
||||
|
||||
usr.set_machine(src)
|
||||
|
||||
if(href_list["activate"])
|
||||
activate()
|
||||
updateUsrDialog()
|
||||
|
||||
else if(href_list["detach"])
|
||||
detach()
|
||||
updateUsrDialog()
|
||||
|
||||
else if(href_list["create"])
|
||||
var/amount = (text2num(href_list["amount"]))
|
||||
var/datum/design/D = locate(href_list["create"])
|
||||
create_product(D, amount)
|
||||
updateUsrDialog()
|
||||
|
||||
else if(href_list["menu"])
|
||||
menustat = "menu"
|
||||
updateUsrDialog()
|
||||
@@ -0,0 +1,410 @@
|
||||
/obj/machinery/plantgenes
|
||||
name = "plant DNA manipulator"
|
||||
desc = "An advanced device designed to manipulate plant genetic makeup."
|
||||
icon = 'icons/obj/hydroponics/equipment.dmi'
|
||||
icon_state = "dnamod"
|
||||
density = 1
|
||||
anchored = 1
|
||||
|
||||
var/obj/item/seeds/seed
|
||||
var/obj/item/weapon/disk/plantgene/disk
|
||||
|
||||
var/list/core_genes = list()
|
||||
var/list/reagent_genes = list()
|
||||
var/list/trait_genes = list()
|
||||
|
||||
var/datum/plant_gene/target
|
||||
var/operation = ""
|
||||
var/rating = 0
|
||||
var/max_extract_pot = 50
|
||||
// The cap on potency gene extraction.
|
||||
// This number is for T1, each upgraded part adds 5% for a tech level above T1.
|
||||
// At T4, it reaches 95%.
|
||||
|
||||
/obj/machinery/plantgenes/New()
|
||||
..()
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/weapon/circuitboard/plantgenes(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
|
||||
RefreshParts()
|
||||
|
||||
/obj/machinery/plantgenes/RefreshParts()
|
||||
rating = 0
|
||||
for(var/I in component_parts)
|
||||
if(istype(I, /obj/item/weapon/stock_parts))
|
||||
var/obj/item/weapon/stock_parts/S = I
|
||||
rating += S.rating-1
|
||||
max_extract_pot = initial(max_extract_pot) + rating*5
|
||||
|
||||
/obj/machinery/plantgenes/update_icon()
|
||||
..()
|
||||
overlays.Cut()
|
||||
if((stat & (BROKEN|NOPOWER)))
|
||||
icon_state = "dnamod-off"
|
||||
else
|
||||
icon_state = "dnamod"
|
||||
if(seed)
|
||||
overlays += "dnamod-dna"
|
||||
if(panel_open)
|
||||
overlays += "dnamod-open"
|
||||
|
||||
/obj/machinery/plantgenes/attackby(obj/item/I, mob/user, params)
|
||||
if(default_deconstruction_screwdriver(user, "dnamod", "dnamod", I))
|
||||
update_icon()
|
||||
return
|
||||
if(exchange_parts(user, I))
|
||||
return
|
||||
if(default_deconstruction_crowbar(I))
|
||||
return
|
||||
if(isrobot(user))
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/seeds))
|
||||
if(seed)
|
||||
to_chat(user, "<span class='warning'>A sample is already loaded into the machine!</span>")
|
||||
else
|
||||
if(!user.drop_item())
|
||||
return
|
||||
insert_seed(I)
|
||||
to_chat(user, "<span class='notice'>You add [I] to the machine.</span>")
|
||||
interact(user)
|
||||
return
|
||||
else if(istype(I, /obj/item/weapon/disk/plantgene))
|
||||
if(disk)
|
||||
to_chat(user, "<span class='warning'>A data disk is already loaded into the machine!</span>")
|
||||
else
|
||||
if(!user.drop_item())
|
||||
return
|
||||
disk = I
|
||||
disk.forceMove(src)
|
||||
to_chat(user, "<span class='notice'>You add [I] to the machine.</span>")
|
||||
interact(user)
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
/obj/machinery/plantgenes/attack_hand(mob/user)
|
||||
if(..())
|
||||
return
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/plantgenes/interact(mob/user)
|
||||
user.set_machine(src)
|
||||
if(!user)
|
||||
return
|
||||
|
||||
var/datum/browser/popup = new(user, "plantdna", "Plant DNA Manipulator", 450, 600)
|
||||
if(!(in_range(src, user) || issilicon(user)))
|
||||
popup.close()
|
||||
return
|
||||
|
||||
var/dat = ""
|
||||
|
||||
if(operation)
|
||||
if(!seed || (!target && operation != "insert"))
|
||||
operation = ""
|
||||
target = null
|
||||
interact(user)
|
||||
return
|
||||
if((operation == "replace" || operation == "insert") && (!disk || !disk.gene))
|
||||
operation = ""
|
||||
target = null
|
||||
interact(user)
|
||||
return
|
||||
|
||||
dat += "<div class='line'><h3>Confirm Operation</h3></div>"
|
||||
dat += "<div class='statusDisplay'>Are you sure you want to [operation] "
|
||||
switch(operation)
|
||||
if("remove")
|
||||
dat += "<span class='highlight'>[target.get_name()]</span> gene from \the <span class='highlight'>[seed]</span>?<br>"
|
||||
if("extract")
|
||||
dat += "<span class='highlight'>[target.get_name()]</span> gene from \the <span class='highlight'>[seed]</span>?<br>"
|
||||
dat += "<span class='bad'>The sample will be destroyed in process!</span>"
|
||||
if(istype(target, /datum/plant_gene/core/potency))
|
||||
var/datum/plant_gene/core/gene = target
|
||||
if(gene.value > max_extract_pot)
|
||||
dat += "<br><br>This device's extraction capabilities are currently limited to [max_extract_pot] potency. "
|
||||
dat += "Target gene will be degraded to [max_extract_pot] potency on extraction."
|
||||
if("replace")
|
||||
dat += "<span class='highlight'>[target.get_name()]</span> gene with <span class='highlight'>[disk.gene.get_name()]</span>?<br>"
|
||||
if("insert")
|
||||
dat += "<span class='highlight'>[disk.gene.get_name()]</span> gene into \the <span class='highlight'>[seed]</span>?<br>"
|
||||
dat += "</div><div class='line'><a href='?src=[UID()];gene=[target && target.UID()];op=[operation]'>Confirm</a> "
|
||||
dat += "<a href='?src=[UID()];abort=1'>Abort</a></div>"
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
return
|
||||
|
||||
dat+= "<div class='statusDisplay'>"
|
||||
|
||||
dat += "<div class='line'><div class='statusLabel'>Plant Sample:</div><div class='statusValue'><a href='?src=[UID()];eject_seed=1'>"
|
||||
dat += seed ? seed.name : "None"
|
||||
dat += "</a></div></div>"
|
||||
|
||||
dat += "<div class='line'><div class='statusLabel'>Data Disk:</div><div class='statusValue'><a href='?src=[UID()];eject_disk=1'>"
|
||||
if(!disk)
|
||||
dat += "None"
|
||||
else if(!disk.gene)
|
||||
dat += "Empty Disk"
|
||||
else
|
||||
dat += disk.gene.get_name()
|
||||
if(disk && disk.read_only)
|
||||
dat += " (RO)"
|
||||
dat += "</a></div></div>"
|
||||
|
||||
dat += "<br></div>"
|
||||
|
||||
if(seed)
|
||||
var/can_insert = disk && disk.gene && disk.gene.can_add(seed)
|
||||
var/can_extract = disk && !disk.read_only
|
||||
|
||||
dat += "<div class='line'><h3>Core Genes</h3></div><div class='statusDisplay'><table>"
|
||||
for(var/a in core_genes)
|
||||
var/datum/plant_gene/G = a
|
||||
if(!G)
|
||||
continue
|
||||
dat += "<tr><td width='260px'>[G.get_name()]</td><td>"
|
||||
if(can_extract)
|
||||
dat += "<a href='?src=[UID()];gene=[G.UID()];op=extract'>Extract</a>"
|
||||
if(can_insert && istype(disk.gene, G.type))
|
||||
dat += "<a href='?src=[UID()];gene=[G.UID()];op=replace'>Replace</a>"
|
||||
dat += "</td></tr>"
|
||||
dat += "</table></div>"
|
||||
|
||||
if(seed.yield != -1)
|
||||
dat += "<div class='line'><h3>Content Genes</h3></div><div class='statusDisplay'>"
|
||||
if(reagent_genes.len)
|
||||
dat += "<table>"
|
||||
for(var/a in reagent_genes)
|
||||
var/datum/plant_gene/G = a
|
||||
dat += "<tr><td width='260px'>[G.get_name()]</td><td>"
|
||||
if(can_extract)
|
||||
dat += "<a href='?src=[UID()];gene=[G.UID()];op=extract'>Extract</a>"
|
||||
dat += "<a href='?src=[UID()];gene=[G.UID()];op=remove'>Remove</a>"
|
||||
dat += "</td></tr>"
|
||||
dat += "</table>"
|
||||
else
|
||||
dat += "No content-related genes detected in sample.<br>"
|
||||
dat += "</div>"
|
||||
if(can_insert && istype(disk.gene, /datum/plant_gene/reagent))
|
||||
dat += "<a href='?src=[UID()];op=insert'>Insert: [disk.gene.get_name()]</a>"
|
||||
|
||||
dat += "<div class='line'><h3>Trait Genes</h3></div><div class='statusDisplay'>"
|
||||
if(trait_genes.len)
|
||||
dat += "<table>"
|
||||
for(var/a in trait_genes)
|
||||
var/datum/plant_gene/G = a
|
||||
dat += "<tr><td width='260px'>[G.get_name()]</td><td>"
|
||||
if(can_extract)
|
||||
dat += "<a href='?src=[UID()];gene=[G.UID()];op=extract'>Extract</a>"
|
||||
dat += "<a href='?src=[UID()];gene=[G.UID()];op=remove'>Remove</a>"
|
||||
dat += "</td></tr>"
|
||||
dat += "</table>"
|
||||
else
|
||||
dat += "No trait-related genes detected in sample.<br>"
|
||||
if(can_insert && istype(disk.gene, /datum/plant_gene/trait))
|
||||
dat += "<a href='?src=[UID()];op=insert'>Insert: [disk.gene.get_name()]</a>"
|
||||
dat += "</div>"
|
||||
else
|
||||
dat += "<br>No sample found.<br><span class='highlight'>Please, insert a plant sample to use this device.</span>"
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
|
||||
/obj/machinery/plantgenes/Topic(var/href, var/list/href_list)
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
|
||||
if(href_list["eject_seed"] && !operation)
|
||||
if(seed)
|
||||
seed.forceMove(loc)
|
||||
seed.verb_pickup()
|
||||
seed = null
|
||||
update_genes()
|
||||
update_icon()
|
||||
else
|
||||
var/obj/item/I = usr.get_active_hand()
|
||||
if(istype(I, /obj/item/seeds))
|
||||
if(!usr.drop_item())
|
||||
return
|
||||
insert_seed(I)
|
||||
to_chat(usr, "<span class='notice'>You add [I] to the machine.</span>")
|
||||
update_icon()
|
||||
else if(href_list["eject_disk"] && !operation)
|
||||
if(disk)
|
||||
disk.forceMove(loc)
|
||||
disk.verb_pickup()
|
||||
disk = null
|
||||
update_genes()
|
||||
else
|
||||
var/obj/item/I = usr.get_active_hand()
|
||||
if(istype(I, /obj/item/weapon/disk/plantgene))
|
||||
if(!usr.drop_item())
|
||||
return
|
||||
disk = I
|
||||
disk.forceMove(src)
|
||||
to_chat(usr, "<span class='notice'>You add [I] to the machine.</span>")
|
||||
else if(href_list["op"] == "insert" && disk && disk.gene && seed)
|
||||
if(!operation) // Wait for confirmation
|
||||
operation = "insert"
|
||||
else
|
||||
if(!istype(disk.gene, /datum/plant_gene/core) && disk.gene.can_add(seed))
|
||||
seed.genes += disk.gene.Copy()
|
||||
if(istype(disk.gene, /datum/plant_gene/reagent))
|
||||
seed.reagents_from_genes()
|
||||
update_genes()
|
||||
repaint_seed()
|
||||
operation = ""
|
||||
target = null
|
||||
|
||||
else if(href_list["gene"] && seed)
|
||||
var/datum/plant_gene/G = seed.get_gene(href_list["gene"])
|
||||
if(!G || !href_list["op"] || !(href_list["op"] in list("remove", "extract", "replace")))
|
||||
interact(usr)
|
||||
return
|
||||
|
||||
if(!operation || target != G) // Wait for confirmation
|
||||
target = G
|
||||
operation = href_list["op"]
|
||||
|
||||
else if(operation == href_list["op"] && target == G)
|
||||
switch(href_list["op"])
|
||||
if("remove")
|
||||
if(!istype(G, /datum/plant_gene/core))
|
||||
seed.genes -= G
|
||||
if(istype(G, /datum/plant_gene/reagent))
|
||||
seed.reagents_from_genes()
|
||||
repaint_seed()
|
||||
if("extract")
|
||||
if(disk && !disk.read_only)
|
||||
disk.gene = G
|
||||
if(istype(G, /datum/plant_gene/core/potency))
|
||||
var/datum/plant_gene/core/gene = G
|
||||
gene.value = min(gene.value, max_extract_pot)
|
||||
disk.update_name()
|
||||
qdel(seed)
|
||||
seed = null
|
||||
update_icon()
|
||||
if("replace")
|
||||
if(disk && disk.gene && istype(disk.gene, G.type) && istype(G, /datum/plant_gene/core))
|
||||
seed.genes -= G
|
||||
var/datum/plant_gene/core/C = disk.gene.Copy()
|
||||
seed.genes += C
|
||||
C.apply_stat(seed)
|
||||
repaint_seed()
|
||||
if("insert")
|
||||
if(disk && disk.gene && !istype(disk.gene, /datum/plant_gene/core) && disk.gene.can_add(seed))
|
||||
seed.genes += disk.gene.Copy()
|
||||
if(istype(disk.gene, /datum/plant_gene/reagent))
|
||||
seed.reagents_from_genes()
|
||||
repaint_seed()
|
||||
|
||||
update_genes()
|
||||
operation = ""
|
||||
target = null
|
||||
else if(href_list["abort"])
|
||||
operation = ""
|
||||
target = null
|
||||
|
||||
interact(usr)
|
||||
|
||||
/obj/machinery/plantgenes/proc/insert_seed(obj/item/seeds/S)
|
||||
if(!istype(S) || seed)
|
||||
return
|
||||
S.forceMove(src)
|
||||
seed = S
|
||||
update_genes()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/plantgenes/proc/update_genes()
|
||||
core_genes = list()
|
||||
reagent_genes = list()
|
||||
trait_genes = list()
|
||||
|
||||
if(seed)
|
||||
var/gene_paths = list(
|
||||
/datum/plant_gene/core/potency,
|
||||
/datum/plant_gene/core/yield,
|
||||
/datum/plant_gene/core/production,
|
||||
/datum/plant_gene/core/endurance,
|
||||
/datum/plant_gene/core/lifespan,
|
||||
/datum/plant_gene/core/weed_rate,
|
||||
/datum/plant_gene/core/weed_chance
|
||||
)
|
||||
for(var/a in gene_paths)
|
||||
core_genes += seed.get_gene(a)
|
||||
|
||||
for(var/datum/plant_gene/reagent/G in seed.genes)
|
||||
reagent_genes += G
|
||||
for(var/datum/plant_gene/trait/G in seed.genes)
|
||||
trait_genes += G
|
||||
|
||||
/obj/machinery/plantgenes/proc/repaint_seed()
|
||||
if(!seed)
|
||||
return
|
||||
if(copytext(seed.name, 1, 13) == "experimental")
|
||||
return // Already modded name and icon
|
||||
seed.name = "experimental " + seed.name
|
||||
seed.icon_state = "seed-x"
|
||||
|
||||
/*
|
||||
* Plant DNA disk
|
||||
*/
|
||||
|
||||
/obj/item/weapon/disk/plantgene
|
||||
name = "plant data disk"
|
||||
desc = "A disk for storing plant genetic data."
|
||||
icon_state = "datadisk_hydro"
|
||||
materials = list(MAT_METAL=30, MAT_GLASS=10)
|
||||
var/datum/plant_gene/gene
|
||||
var/read_only = 0 //Well, it's still a floppy disk
|
||||
|
||||
/obj/item/weapon/disk/plantgene/New()
|
||||
..()
|
||||
overlays += "datadisk_gene"
|
||||
pixel_x = rand(-5, 5)
|
||||
pixel_y = rand(-5, 5)
|
||||
|
||||
/obj/item/weapon/disk/plantgene/attackby(obj/item/weapon/W, mob/user, params)
|
||||
..()
|
||||
if(istype(W, /obj/item/weapon/pen))
|
||||
var/t = stripped_input(user, "What would you like the label to be?", name, null)
|
||||
if(user.get_active_hand() != W)
|
||||
return
|
||||
if(!in_range(src, user) && loc != user)
|
||||
return
|
||||
if(t)
|
||||
name = "plant data disk - '[t]'"
|
||||
else
|
||||
name = "plant data disk"
|
||||
|
||||
/obj/item/weapon/disk/plantgene/proc/update_name()
|
||||
if(gene)
|
||||
name = "plant data disk - '[gene.get_name()]'"
|
||||
else
|
||||
name = "plant data disk"
|
||||
|
||||
/obj/item/weapon/disk/plantgene/attack_self(mob/user)
|
||||
read_only = !read_only
|
||||
to_chat(user, "<span class='notice'>You flip the write-protect tab to [read_only ? "protected" : "unprotected"].</span>")
|
||||
|
||||
/obj/item/weapon/disk/plantgene/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "The write-protect tab is set to [read_only ? "protected" : "unprotected"].")
|
||||
|
||||
|
||||
/*
|
||||
* Plant DNA Disks Box
|
||||
*/
|
||||
/obj/item/weapon/storage/box/disks_plantgene
|
||||
name = "plant data disks box"
|
||||
icon_state = "disk_kit"
|
||||
|
||||
/obj/item/weapon/storage/box/disks_plantgene/New()
|
||||
..()
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/weapon/disk/plantgene(src)
|
||||
+133
-520
@@ -1,535 +1,148 @@
|
||||
//Grown foods.
|
||||
// ***********************************************************
|
||||
// Foods that are produced from hydroponics ~~~~~~~~~~
|
||||
// Data from the seeds carry over to these grown foods
|
||||
// ***********************************************************
|
||||
|
||||
// Base type. Subtypes are found in /grown dir.
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown
|
||||
|
||||
name = "fruit"
|
||||
icon = 'icons/obj/hydroponics_products.dmi'
|
||||
icon_state = "blank"
|
||||
desc = "Nutritious! Probably."
|
||||
|
||||
var/plantname
|
||||
var/datum/seed/seed
|
||||
var/potency = -1
|
||||
var/awakening = 0
|
||||
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/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.
|
||||
burn_state = FLAMMABLE
|
||||
origin_tech = "biotech=1"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/New(newloc,planttype)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/New(newloc, var/obj/item/seeds/new_seed = null)
|
||||
..()
|
||||
if(!dried_type)
|
||||
if(new_seed)
|
||||
seed = new_seed.Copy()
|
||||
else if(ispath(seed))
|
||||
// This is for adminspawn or map-placed growns. They get the default stats of their seed type.
|
||||
seed = new seed()
|
||||
seed.adjust_potency(50-seed.potency)
|
||||
|
||||
pixel_x = rand(-5, 5)
|
||||
pixel_y = rand(-5, 5)
|
||||
|
||||
if(dried_type == -1)
|
||||
dried_type = type
|
||||
src.pixel_x = rand(-5.0, 5)
|
||||
src.pixel_y = rand(-5.0, 5)
|
||||
|
||||
// Fill the object up with the appropriate reagents.
|
||||
if(planttype)
|
||||
plantname = planttype
|
||||
|
||||
if(!plantname)
|
||||
return
|
||||
|
||||
if(!plant_controller)
|
||||
sleep(250) // ugly hack, should mean roundstart plants are fine.
|
||||
if(!plant_controller)
|
||||
to_chat(world, "<span class='danger'>Plant controller does not exist and [src] requires it. Aborting.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
seed = plant_controller.seeds[plantname]
|
||||
|
||||
if(!seed)
|
||||
return
|
||||
|
||||
name = "[seed.seed_name]"
|
||||
|
||||
if(seed.modular_icon == 1)
|
||||
update_icon()
|
||||
else
|
||||
icon = 'icons/obj/harvest.dmi'
|
||||
icon_state = seed.preset_icon
|
||||
|
||||
if(!seed.chems)
|
||||
return
|
||||
|
||||
potency = seed.get_trait(TRAIT_POTENCY)
|
||||
|
||||
for(var/rid in seed.chems)
|
||||
var/list/reagent_data = seed.chems[rid]
|
||||
if(reagent_data && reagent_data.len)
|
||||
var/rtotal = reagent_data[1]
|
||||
if(reagent_data.len > 1 && potency > 0)
|
||||
rtotal += round(potency/reagent_data[2])
|
||||
reagents.add_reagent(rid,max(1,rtotal))
|
||||
update_desc()
|
||||
update_trash()
|
||||
if(reagents.total_volume > 0)
|
||||
bitesize = 1+round(reagents.total_volume / 2, 1)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/proc/update_trash()
|
||||
if(!seed)
|
||||
return
|
||||
trash = seed.trash_type
|
||||
if(seed.kitchen_tag)
|
||||
if(seed.kitchen_tag == "watermelon") // 15% chance to leave behind a pack of watermelon seeds
|
||||
if(prob(15))
|
||||
var/obj/item/seeds/seeds = new()
|
||||
seeds.seed = seed
|
||||
seeds.update_seed()
|
||||
trash = seeds
|
||||
else
|
||||
trash = null
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/proc/update_desc()
|
||||
|
||||
if(!seed)
|
||||
return
|
||||
if(!plant_controller)
|
||||
sleep(250) // ugly hack, should mean roundstart plants are fine.
|
||||
if(!plant_controller)
|
||||
to_chat(world, "<span class='danger'>Plant controller does not exist and [src] requires it. Aborting.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
if(plant_controller.product_descs["[seed.uid]"])
|
||||
desc = plant_controller.product_descs["[seed.uid]"]
|
||||
else
|
||||
var/list/descriptors = list()
|
||||
if(reagents.has_reagent("sugar") || reagents.has_reagent("cherryjelly") || reagents.has_reagent("honey") || reagents.has_reagent("berryjuice"))
|
||||
descriptors |= "sweet"
|
||||
if(reagents.has_reagent("charcoal"))
|
||||
descriptors |= "astringent"
|
||||
if(reagents.has_reagent("frostoil"))
|
||||
descriptors |= "numbing"
|
||||
if(reagents.has_reagent("nutriment"))
|
||||
descriptors |= "nutritious"
|
||||
if(reagents.has_reagent("condensedcapsaicin") || reagents.has_reagent("capsaicin"))
|
||||
descriptors |= "spicy"
|
||||
if(reagents.has_reagent("cocoa"))
|
||||
descriptors |= "bitter"
|
||||
if(reagents.has_reagent("orangejuice") || reagents.has_reagent("lemonjuice") || reagents.has_reagent("limejuice"))
|
||||
descriptors |= "sweet-sour"
|
||||
if(reagents.has_reagent("radium") || reagents.has_reagent("uranium"))
|
||||
descriptors |= "radioactive"
|
||||
if(reagents.has_reagent("amanitin") || reagents.has_reagent("toxin") || reagents.has_reagent("carpotoxin"))
|
||||
descriptors |= "poisonous"
|
||||
if(reagents.has_reagent("lsd") || reagents.has_reagent("space_drugs") || reagents.has_reagent("psilocybin"))
|
||||
descriptors |= "hallucinogenic"
|
||||
if(reagents.has_reagent("styptic_powder"))
|
||||
descriptors |= "medicinal"
|
||||
if(reagents.has_reagent("gold") || reagents.has_reagent("silver"))
|
||||
descriptors |= "shiny"
|
||||
if(reagents.has_reagent("lube"))
|
||||
descriptors |= "slippery"
|
||||
if(reagents.has_reagent("facid") || reagents.has_reagent("sacid"))
|
||||
descriptors |= "acidic"
|
||||
if(reagents.has_reagent("fuel"))
|
||||
descriptors |= "flammable"
|
||||
if(reagents.has_reagent("moonshine"))
|
||||
descriptors |= "intoxicating"
|
||||
if(seed.get_trait(TRAIT_JUICY))
|
||||
descriptors |= "juicy"
|
||||
if(seed.get_trait(TRAIT_STINGS))
|
||||
descriptors |= "stinging"
|
||||
if(seed.get_trait(TRAIT_TELEPORTING))
|
||||
descriptors |= "glowing"
|
||||
if(seed.get_trait(TRAIT_EXPLOSIVE))
|
||||
descriptors |= "bulbous"
|
||||
|
||||
var/descriptor_num = rand(2,4)
|
||||
var/descriptor_count = descriptor_num
|
||||
desc = "A"
|
||||
while(descriptors.len && descriptor_num > 0)
|
||||
var/chosen = pick(descriptors)
|
||||
descriptors -= chosen
|
||||
desc += "[(descriptor_count>1 && descriptor_count!=descriptor_num) ? "," : "" ] [chosen]"
|
||||
descriptor_num--
|
||||
if(seed.seed_noun == "spores")
|
||||
desc += " mushroom"
|
||||
else
|
||||
desc += " fruit"
|
||||
plant_controller.product_descs["[seed.uid]"] = desc
|
||||
desc += ". Delicious! Probably."
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/update_icon()
|
||||
if(!seed || !plant_controller || !plant_controller.plant_icon_cache)
|
||||
return
|
||||
if(seed.modular_icon != 1)
|
||||
return
|
||||
overlays.Cut()
|
||||
var/image/plant_icon
|
||||
var/icon_key = "fruit-[seed.get_trait(TRAIT_PRODUCT_ICON)]-[seed.get_trait(TRAIT_PRODUCT_COLOUR)]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"
|
||||
if(plant_controller.plant_icon_cache[icon_key])
|
||||
plant_icon = plant_controller.plant_icon_cache[icon_key]
|
||||
else
|
||||
plant_icon = image('icons/obj/hydroponics_products.dmi',"blank")
|
||||
var/image/fruit_base = image('icons/obj/hydroponics_products.dmi',"[seed.get_trait(TRAIT_PRODUCT_ICON)]-product")
|
||||
fruit_base.color = "[seed.get_trait(TRAIT_PRODUCT_COLOUR)]"
|
||||
plant_icon.overlays |= fruit_base
|
||||
if("[seed.get_trait(TRAIT_PRODUCT_ICON)]-leaf" in icon_states('icons/obj/hydroponics_products.dmi'))
|
||||
var/image/fruit_leaves = image('icons/obj/hydroponics_products.dmi',"[seed.get_trait(TRAIT_PRODUCT_ICON)]-leaf")
|
||||
fruit_leaves.color = "[seed.get_trait(TRAIT_PLANT_COLOUR)]"
|
||||
plant_icon.overlays |= fruit_leaves
|
||||
plant_controller.plant_icon_cache[icon_key] = plant_icon
|
||||
overlays |= plant_icon
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/Crossed(var/mob/living/M)
|
||||
if(seed && seed.get_trait(TRAIT_JUICY) == 2)
|
||||
if(istype(M))
|
||||
|
||||
if(M.buckled)
|
||||
return
|
||||
|
||||
if(istype(M,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.shoes && H.shoes.flags & NOSLIP)
|
||||
return
|
||||
|
||||
M.stop_pulling()
|
||||
to_chat(M, "<span class='notice'>You slipped on the [name]!</span>")
|
||||
playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
|
||||
M.Stun(8)
|
||||
M.Weaken(5)
|
||||
seed.thrown_at(src,M)
|
||||
sleep(-1)
|
||||
if(src) qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/throw_impact(atom/hit_atom)
|
||||
..()
|
||||
if(seed) seed.thrown_at(src,hit_atom)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||
|
||||
if(seed)
|
||||
if(seed.get_trait(TRAIT_PRODUCES_POWER) && istype(W, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = W
|
||||
if(C.use(5))
|
||||
//TODO: generalize this.
|
||||
to_chat(user, "<span class='notice'>You add some cable to the [src.name] and slide it inside the battery casing.</span>")
|
||||
var/obj/item/weapon/stock_parts/cell/potato/pocell = new /obj/item/weapon/stock_parts/cell/potato(get_turf(user))
|
||||
if(src.loc == user && !(user.l_hand && user.r_hand) && istype(user,/mob/living/carbon/human))
|
||||
user.put_in_hands(pocell)
|
||||
pocell.maxcharge = src.potency * 10
|
||||
pocell.charge = pocell.maxcharge
|
||||
qdel(src)
|
||||
return
|
||||
else if(W.sharp)
|
||||
var/reagents_per_slice
|
||||
var/obj/slice
|
||||
if(seed.kitchen_tag == "pumpkin") // Ugggh these checks are awful.
|
||||
user.show_message("<span class='notice'>You carve a face into [src]!</span>", 1)
|
||||
new /obj/item/clothing/head/hardhat/pumpkinhead (user.loc)
|
||||
qdel(src)
|
||||
return
|
||||
else if(seed.kitchen_tag == "potato")
|
||||
to_chat(user, "You slice \the [src] into sticks.")
|
||||
reagents_per_slice = reagents.total_volume
|
||||
slice = new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(get_turf(src))
|
||||
reagents.trans_to(slice, reagents_per_slice)
|
||||
qdel(src)
|
||||
return
|
||||
else if(seed.kitchen_tag == "carrot")
|
||||
to_chat(user, "You slice \the [src] into sticks.")
|
||||
reagents_per_slice = reagents.total_volume
|
||||
slice = new /obj/item/weapon/reagent_containers/food/snacks/carrotfries(get_turf(src))
|
||||
reagents.trans_to(slice, reagents_per_slice)
|
||||
qdel(src)
|
||||
return
|
||||
else if(seed.kitchen_tag == "watermelon")
|
||||
to_chat(user, "You slice \the [src] into large slices.")
|
||||
reagents_per_slice = reagents.total_volume/5
|
||||
for(var/i=0,i<5,i++)
|
||||
slice = new /obj/item/weapon/reagent_containers/food/snacks/watermelonslice(get_turf(src))
|
||||
reagents.trans_to(slice, reagents_per_slice)
|
||||
qdel(src)
|
||||
return
|
||||
else if(seed.kitchen_tag == "soybeans")
|
||||
to_chat(user, "You roughly chop up \the [src].")
|
||||
reagents_per_slice = reagents.total_volume
|
||||
slice = new /obj/item/weapon/reagent_containers/food/snacks/soydope(get_turf(src))
|
||||
reagents.trans_to(slice, reagents_per_slice)
|
||||
qdel(src)
|
||||
return
|
||||
else if(seed.chems)
|
||||
if(istype(W,/obj/item/weapon/hatchet) && !isnull(seed.chems["woodpulp"]))
|
||||
user.show_message("<span class='notice'>You make planks out of \the [src]!</span>", 1)
|
||||
for(var/i=0,i<2,i++)
|
||||
var/obj/item/stack/sheet/wood/NG = new (user.loc)
|
||||
NG.color = seed.get_trait(TRAIT_PRODUCT_COLOUR)
|
||||
for(var/obj/item/stack/sheet/wood/G in user.loc)
|
||||
if(G==NG)
|
||||
continue
|
||||
if(G.amount>=G.max_amount)
|
||||
continue
|
||||
G.attackby(NG, user)
|
||||
to_chat(user, "You add the newly-formed wood to the stack. It now contains [NG.amount] planks.")
|
||||
qdel(src)
|
||||
return
|
||||
else if(istype(W, /obj/item/weapon/rollingpaper))
|
||||
if(seed.kitchen_tag == "ambrosia" || seed.kitchen_tag == "ambrosiadeus" || seed.kitchen_tag == "tobacco" || seed.kitchen_tag == "stobacco")
|
||||
user.unEquip(W)
|
||||
if(seed.kitchen_tag == "ambrosia")
|
||||
var/obj/item/clothing/mask/cigarette/joint/J = new /obj/item/clothing/mask/cigarette/joint(user.loc)
|
||||
J.chem_volume = src.reagents.total_volume
|
||||
src.reagents.trans_to(J, J.chem_volume)
|
||||
qdel(W)
|
||||
user.put_in_active_hand(J)
|
||||
else if(seed.kitchen_tag == "ambrosiadeus")
|
||||
var/obj/item/clothing/mask/cigarette/joint/deus/J = new /obj/item/clothing/mask/cigarette/joint/deus(user.loc)
|
||||
J.chem_volume = src.reagents.total_volume
|
||||
src.reagents.trans_to(J, J.chem_volume)
|
||||
qdel(W)
|
||||
user.put_in_active_hand(J)
|
||||
else if(seed.kitchen_tag == "tobacco" || seed.kitchen_tag == "stobacco")
|
||||
var/obj/item/clothing/mask/cigarette/handroll/J = new /obj/item/clothing/mask/cigarette/handroll(user.loc)
|
||||
J.chem_volume = src.reagents.total_volume
|
||||
src.reagents.trans_to(J, J.chem_volume)
|
||||
qdel(W)
|
||||
user.put_in_active_hand(J)
|
||||
to_chat(user, "\blue You roll the [src] into a rolling paper.")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "\red You can't roll a smokable from the [src].")
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_new(src, newloc)
|
||||
seed.prepare_result(src)
|
||||
transform *= TransformUsingVariable(seed.potency, 100, 0.5) //Makes the resulting produce's sprite larger or smaller based on potency!
|
||||
add_juice()
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/attack(var/mob/living/carbon/M, var/mob/user, var/def_zone)
|
||||
if(awakening)
|
||||
to_chat(user, "<span class='warning'>The [src] is twitching and shaking, preventing you from eating it.</span>")
|
||||
return
|
||||
if(user == M)
|
||||
return ..()
|
||||
|
||||
if(user.a_intent == I_HARM)
|
||||
|
||||
// This is being copypasted here because reagent_containers (WHY DOES FOOD DESCEND FROM THAT) overrides it completely.
|
||||
// TODO: refactor all food paths to be less horrible and difficult to work with in this respect. ~Z
|
||||
if(!istype(M)) return 0
|
||||
|
||||
if(!def_zone)
|
||||
def_zone = check_zone(user.zone_sel.selecting)
|
||||
|
||||
user.lastattacked = M
|
||||
M.lastattacker = user
|
||||
user.attack_log += "\[[time_stamp()]\]<font color='red'> Attacked [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])</font>"
|
||||
M.attack_log += "\[[time_stamp()]\]<font color='orange'> Attacked by [key_name(user)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])</font>"
|
||||
msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" )
|
||||
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/hit = H.attacked_by(src, user, def_zone)
|
||||
if(hit && hitsound)
|
||||
playsound(loc, hitsound, 50, 1, -1)
|
||||
//return hit
|
||||
else
|
||||
if(attack_verb.len)
|
||||
user.visible_message("<span class='danger'>[M] has been [pick(attack_verb)] with [src] by [user]!</span>")
|
||||
else
|
||||
user.visible_message("<span class='danger'>[M] has been attacked with [src] by [user]!</span>")
|
||||
|
||||
if(hitsound)
|
||||
playsound(loc, hitsound, 50, 1, -1)
|
||||
switch(damtype)
|
||||
if("brute")
|
||||
M.take_organ_damage(force)
|
||||
if(prob(33))
|
||||
var/turf/simulated/location = get_turf(M)
|
||||
if(istype(location)) location.add_blood_floor(M)
|
||||
if("fire")
|
||||
M.take_organ_damage(0, force)
|
||||
M.updatehealth()
|
||||
|
||||
if(seed && seed.get_trait(TRAIT_CARNIVOROUS))
|
||||
seed.do_thorns(M, src, def_zone)
|
||||
|
||||
if(ishuman(M) && seed && seed.get_trait(TRAIT_STINGS))
|
||||
if(!reagents || reagents.total_volume <= 0)
|
||||
return
|
||||
seed.do_sting(M, src, def_zone)
|
||||
reagents.remove_any(rand(1,3)) //use up some of the reagents at random
|
||||
sleep(-1)
|
||||
if(!src)
|
||||
return
|
||||
if(reagents && reagents.total_volume <= 0) //used-up fruit will be destroyed
|
||||
if(user)
|
||||
to_chat(user, "<span class='danger'>\The [src] has dried out and crumbles to dust.</span>")
|
||||
//user.drop_from_inventory(src)
|
||||
qdel(src)
|
||||
else if(prob(35)) //fruit that still has reagents has a chance of breaking each time it stings on hit
|
||||
if(user)
|
||||
to_chat(user, "<span class='danger'>\The [src] has fallen to bits.</span>")
|
||||
//user.drop_from_inventory(src)
|
||||
qdel(src)
|
||||
|
||||
add_fingerprint(user)
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/proc/add_juice()
|
||||
if(reagents)
|
||||
if(bitesize_mod)
|
||||
bitesize = 1 + round(reagents.total_volume / bitesize_mod)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/attack_self(mob/user as mob)
|
||||
|
||||
if(!seed)
|
||||
return
|
||||
|
||||
if(istype(user.loc,/turf/space))
|
||||
return
|
||||
|
||||
if(user.a_intent == I_HARM)
|
||||
user.visible_message("<span class='danger'>\The [user] squashes \the [src]!</span>")
|
||||
seed.thrown_at(src,user)
|
||||
sleep(-1)
|
||||
if(src) qdel(src)
|
||||
return
|
||||
|
||||
if(user.a_intent == I_DISARM && seed.get_trait(TRAIT_SPREAD) > 0) //Using disarm so we can tell if you want to plant or convert non-final plants
|
||||
to_chat(user, "<span class='notice'>You plant the [src.name].</span>")
|
||||
new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(get_turf(user),src.seed)
|
||||
new /obj/effect/plant(get_turf(user), src.seed)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
if(!seed.final_form) //This isn't even my final form! (sorry, it had to be done)
|
||||
switch(seed.kitchen_tag)
|
||||
if("comfrey")
|
||||
var/obj/item/stack/medical/bruise_pack/comfrey/poultice = new /obj/item/stack/medical/bruise_pack/comfrey(user.loc)
|
||||
poultice.heal_brute = potency
|
||||
to_chat(user, "<span class='notice'>You mash the leaves into a poultice.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
if("aloe")
|
||||
var/obj/item/stack/medical/ointment/aloe/poultice = new /obj/item/stack/medical/ointment/aloe(user.loc)
|
||||
poultice.heal_burn = potency
|
||||
to_chat(user, "<span class='notice'>You mash the petals into a poultice.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
if("grass")
|
||||
user.show_message("<span class='notice'>You make a grass tile out of \the [src]!</span>", 1)
|
||||
for(var/i=0,i<2,i++)
|
||||
var/obj/item/stack/tile/grass/G = new (user.loc)
|
||||
G.color = seed.get_trait(TRAIT_PRODUCT_COLOUR)
|
||||
for(var/obj/item/stack/tile/grass/NG in user.loc)
|
||||
if(G==NG)
|
||||
continue
|
||||
if(NG.amount>=NG.max_amount)
|
||||
continue
|
||||
NG.attackby(G, user)
|
||||
to_chat(user, "You add the newly-formed grass to the stack. It now contains [G.amount] tiles.")
|
||||
qdel(src)
|
||||
return
|
||||
if("sunflower")
|
||||
var/obj/item/weapon/grown/sunflower/SF = new /obj/item/weapon/grown/sunflower(user.loc)
|
||||
user.unEquip(src)
|
||||
user.put_in_hands(SF)
|
||||
qdel(src)
|
||||
return
|
||||
if("novaflower")
|
||||
var/obj/item/weapon/grown/novaflower/NF = new /obj/item/weapon/grown/novaflower(user.loc)
|
||||
if(prob(10))
|
||||
user.say("PRAISE THE SUN!")
|
||||
else
|
||||
to_chat(user, "PRAISE THE SUN!")
|
||||
user.unEquip(src)
|
||||
user.put_in_hands(NF)
|
||||
qdel(src)
|
||||
return
|
||||
if("nettle")
|
||||
var/obj/item/weapon/grown/nettle/nettle = new /obj/item/weapon/grown/nettle(user.loc)
|
||||
nettle.force = round((5 + potency / 5), 1)
|
||||
to_chat(user, "You straighten up the plant.")
|
||||
user.unEquip(src)
|
||||
user.put_in_hands(nettle)
|
||||
qdel(src)
|
||||
return
|
||||
if("deathnettle")
|
||||
var/obj/item/weapon/grown/nettle/death/DN = new /obj/item/weapon/grown/nettle/death(user.loc)
|
||||
DN.force = round((5 + potency / 2.5), 1)
|
||||
to_chat(user, "You straighten up the plant.")
|
||||
user.unEquip(src)
|
||||
user.put_in_hands(DN)
|
||||
qdel(src)
|
||||
return
|
||||
if("killertomato")
|
||||
if(awakening || istype(user.loc,/turf/space))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You begin to awaken the Killer Tomato...</span>")
|
||||
awakening = 1
|
||||
|
||||
spawn(30)
|
||||
if(!qdeleted(src))
|
||||
var/mob/living/simple_animal/hostile/killertomato/K = new /mob/living/simple_animal/hostile/killertomato(get_turf(src.loc))
|
||||
var/endurance_value = seed.get_trait(TRAIT_ENDURANCE)
|
||||
K.maxHealth += round(endurance_value / 3)
|
||||
K.melee_damage_lower += round(potency / 10)
|
||||
K.melee_damage_upper += round(potency / 10)
|
||||
var/production_value = seed.get_trait(TRAIT_PRODUCTION)
|
||||
K.move_to_delay -= round(production_value / 50)
|
||||
K.health = K.maxHealth
|
||||
K.visible_message("<span class='notice'>The Killer Tomato growls as it suddenly awakens.</span>")
|
||||
if(user)
|
||||
user.unEquip(src)
|
||||
qdel(src)
|
||||
if("cashpod")
|
||||
to_chat(user, "You crack open the cash pod...")
|
||||
var/value = round(seed.get_trait(TRAIT_POTENCY))
|
||||
user.unEquip(src)
|
||||
switch(value)
|
||||
if(0)
|
||||
to_chat(user, "It's empty! What a waste...")
|
||||
if(1 to 10)
|
||||
to_chat(user, "It has a space dollar inside. Woo.")
|
||||
new /obj/item/weapon/spacecash(get_turf(user))
|
||||
if(11 to 20)
|
||||
to_chat(user, "It has 10 space dollars inside!")
|
||||
new /obj/item/weapon/spacecash/c10(get_turf(user))
|
||||
if(21 to 30)
|
||||
to_chat(user, "It has 20 space dollars inside! Cool!")
|
||||
new /obj/item/weapon/spacecash/c20(get_turf(user))
|
||||
if(31 to 40)
|
||||
to_chat(user, "It has 50 space dollars inside! Nice!")
|
||||
new /obj/item/weapon/spacecash/c50(get_turf(user))
|
||||
if(41 to 50)
|
||||
to_chat(user, "It has 100 space dollars inside! Sweet!")
|
||||
new /obj/item/weapon/spacecash/c100(get_turf(user))
|
||||
if(51 to 60)
|
||||
to_chat(user, "It has 200 space dollars inside! Awesome!")
|
||||
new /obj/item/weapon/spacecash/c200(get_turf(user))
|
||||
if(61 to 80)
|
||||
to_chat(user, "It has 500 space dollars inside! CHA-CHING!")
|
||||
new /obj/item/weapon/spacecash/c500(get_turf(user))
|
||||
else
|
||||
to_chat(user, "It has 1000 space dollars inside! JACKPOT!")
|
||||
new /obj/item/weapon/spacecash/c1000(get_turf(user))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/pickup(mob/user)
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/examine(user)
|
||||
..()
|
||||
if(!seed)
|
||||
if(seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
if(T.examine_line)
|
||||
to_chat(user, T.examine_line)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/attackby(obj/item/O, mob/user, params)
|
||||
..()
|
||||
if (istype(O, /obj/item/device/plant_analyzer))
|
||||
var/msg = "<span class='info'>*---------*\n This is \a <span class='name'>[src]</span>.\n"
|
||||
if(seed)
|
||||
msg += seed.get_analyzer_text()
|
||||
var/reag_txt = ""
|
||||
if(seed)
|
||||
for(var/reagent_id in seed.reagents_add)
|
||||
var/datum/reagent/R = chemical_reagents_list[reagent_id]
|
||||
var/amt = reagents.get_reagent_amount(reagent_id)
|
||||
reag_txt += "\n<span class='info'>- [R.name]: [amt]</span>"
|
||||
|
||||
if(reag_txt)
|
||||
msg += reag_txt
|
||||
msg += "<br><span class='info'>*---------*</span>"
|
||||
to_chat(user, msg)
|
||||
else
|
||||
if(seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_attackby(src, O, user)
|
||||
|
||||
|
||||
// Various gene procs
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/attack_self(mob/user)
|
||||
if(seed && seed.get_gene(/datum/plant_gene/trait/squash))
|
||||
squash(user)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/throw_impact(atom/hit_atom)
|
||||
if(!..()) //was it caught by a mob?
|
||||
if(seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_throw_impact(src, hit_atom)
|
||||
if(seed.get_gene(/datum/plant_gene/trait/squash))
|
||||
squash(hit_atom)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/proc/squash(atom/target)
|
||||
var/turf/T = get_turf(target)
|
||||
if(ispath(splat_type, /obj/effect/decal/cleanable/plant_smudge))
|
||||
if(filling_color)
|
||||
var/obj/O = new splat_type(T)
|
||||
O.color = filling_color
|
||||
O.name = "[name] smudge"
|
||||
else if(splat_type)
|
||||
new splat_type(T)
|
||||
|
||||
if(trash)
|
||||
generate_trash(T)
|
||||
|
||||
visible_message("<span class='warning'>[src] has been squashed.</span>","<span class='italics'>You hear a smack.</span>")
|
||||
if(seed)
|
||||
for(var/datum/plant_gene/trait/trait in seed.genes)
|
||||
trait.on_squash(src, target)
|
||||
|
||||
for(var/A in T)
|
||||
if(reagents)
|
||||
reagents.reaction(A)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/On_Consume()
|
||||
if(iscarbon(usr))
|
||||
if(seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_consume(src, usr)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/Crossed(atom/movable/AM)
|
||||
if(seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_cross(src, AM)
|
||||
..()
|
||||
|
||||
|
||||
// Glow gene procs
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/generate_trash(atom/location)
|
||||
if(trash && ispath(trash, /obj/item/weapon/grown))
|
||||
. = new trash(location, seed)
|
||||
trash = null
|
||||
return
|
||||
if(seed.get_trait(TRAIT_STINGS))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(H) && H.gloves)
|
||||
return
|
||||
if(!reagents || reagents.total_volume <= 0)
|
||||
return
|
||||
reagents.remove_any(rand(1,3)) //Todo, make it actually remove the reagents the seed uses.
|
||||
seed.do_thorns(H,src)
|
||||
seed.do_sting(H,src,pick("r_hand","l_hand"))
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/On_Consume(mob/M, mob/user)
|
||||
if(seed && seed.get_trait(TRAIT_BATTERY_RECHARGE))
|
||||
if(!reagents.total_volume)
|
||||
var/batteries_recharged = 0
|
||||
for(var/obj/item/weapon/stock_parts/cell/C in user.GetAllContents())
|
||||
var/newcharge = (potency*0.01)*C.maxcharge
|
||||
if(C.charge < newcharge)
|
||||
C.charge = newcharge
|
||||
if(isobj(C.loc))
|
||||
var/obj/O = C.loc
|
||||
O.update_icon() //update power meters and such
|
||||
batteries_recharged = 1
|
||||
if(batteries_recharged)
|
||||
to_chat(user, "<span class='notice'>Battery has recovered.</span>")
|
||||
..()
|
||||
// For item-containing growns such as eggy or gatfruit
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/shell/attack_self(mob/user)
|
||||
user.unEquip(src)
|
||||
if(trash)
|
||||
var/obj/item/T = generate_trash()
|
||||
user.put_in_hands(T)
|
||||
to_chat(user, "<span class='notice'>You open [src]\'s shell, revealing \a [T].</span>")
|
||||
qdel(src)
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
// Ambrosia - base type
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia
|
||||
seed = /obj/item/seeds/ambrosia
|
||||
name = "ambrosia branch"
|
||||
desc = "This is a plant."
|
||||
icon_state = "ambrosiavulgaris"
|
||||
slot_flags = SLOT_HEAD
|
||||
filling_color = "#008000"
|
||||
bitesize_mod = 2
|
||||
|
||||
// Ambrosia Vulgaris
|
||||
/obj/item/seeds/ambrosia
|
||||
name = "pack of ambrosia vulgaris seeds"
|
||||
desc = "These seeds grow into common ambrosia, a plant grown by and from medicine."
|
||||
icon_state = "seed-ambrosiavulgaris"
|
||||
species = "ambrosiavulgaris"
|
||||
plantname = "Ambrosia Vulgaris"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris
|
||||
lifespan = 60
|
||||
endurance = 25
|
||||
yield = 6
|
||||
potency = 5
|
||||
icon_dead = "ambrosia-dead"
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
mutatelist = list(/obj/item/seeds/ambrosia/deus)
|
||||
reagents_add = list("space_drugs" = 0.15, "bicaridine" = 0.1, "kelotane" = 0.1, "vitamin" = 0.04, "nutriment" = 0.05, "toxin" = 0.1)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris
|
||||
seed = /obj/item/seeds/ambrosia
|
||||
name = "ambrosia vulgaris branch"
|
||||
desc = "This is a plant containing various healing chemicals."
|
||||
origin_tech = "biotech=2"
|
||||
|
||||
// Ambrosia Deus
|
||||
/obj/item/seeds/ambrosia/deus
|
||||
name = "pack of ambrosia deus seeds"
|
||||
desc = "These seeds grow into ambrosia deus. Could it be the food of the gods..?"
|
||||
icon_state = "seed-ambrosiadeus"
|
||||
species = "ambrosiadeus"
|
||||
plantname = "Ambrosia Deus"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus
|
||||
mutatelist = list(/obj/item/seeds/ambrosia/gaia)
|
||||
reagents_add = list("weak_omnizine" = 0.15, "synaptizine" = 0.15, "space_drugs" = 0.1, "vitamin" = 0.04, "nutriment" = 0.05)
|
||||
rarity = 40
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus
|
||||
seed = /obj/item/seeds/ambrosia/deus
|
||||
name = "ambrosia deus branch"
|
||||
desc = "Eating this makes you feel immortal!"
|
||||
icon_state = "ambrosiadeus"
|
||||
filling_color = "#008B8B"
|
||||
origin_tech = "biotech=4;materials=3"
|
||||
|
||||
//Ambrosia Gaia
|
||||
/obj/item/seeds/ambrosia/gaia
|
||||
name = "pack of ambrosia gaia seeds"
|
||||
desc = "These seeds grow into ambrosia gaia, filled with infinite potential."
|
||||
icon_state = "seed-ambrosia_gaia"
|
||||
species = "ambrosia_gaia"
|
||||
plantname = "Ambrosia Gaia"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia
|
||||
mutatelist = list()
|
||||
reagents_add = list("earthsblood" = 0.05, "nutriment" = 0.06, "vitamin" = 0.05)
|
||||
rarity = 30 //These are some pretty good plants right here
|
||||
genes = list()
|
||||
weed_rate = 4
|
||||
weed_chance = 100
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia
|
||||
name = "ambrosia gaia branch"
|
||||
desc = "Eating this <i>makes</i> you immortal."
|
||||
icon_state = "ambrosia_gaia"
|
||||
filling_color = rgb(255, 175, 0)
|
||||
origin_tech = "biotech=6;materials=5"
|
||||
light_range = 3
|
||||
seed = /obj/item/seeds/ambrosia/gaia
|
||||
|
||||
// Ambrosia Cruciatus
|
||||
/obj/item/seeds/ambrosia/cruciatus
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/cruciatus
|
||||
potency = 10
|
||||
mutatelist = list()
|
||||
reagents_add = list("thc" = 0.15, "kelotane" = 0.15, "bicaridine" = 0.1, "bath_salts" = 0.20, "nutriment" = 0.05)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/cruciatus
|
||||
seed = /obj/item/seeds/ambrosia/cruciatus
|
||||
@@ -0,0 +1,57 @@
|
||||
// Apple
|
||||
/obj/item/seeds/apple
|
||||
name = "pack of apple seeds"
|
||||
desc = "These seeds grow into apple trees."
|
||||
icon_state = "seed-apple"
|
||||
species = "apple"
|
||||
plantname = "Apple Tree"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/apple
|
||||
lifespan = 55
|
||||
endurance = 35
|
||||
yield = 5
|
||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||
icon_grow = "apple-grow"
|
||||
icon_dead = "apple-dead"
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
mutatelist = list(/obj/item/seeds/apple/gold)
|
||||
reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple
|
||||
seed = /obj/item/seeds/apple
|
||||
name = "apple"
|
||||
desc = "It's a little piece of Eden."
|
||||
icon_state = "apple"
|
||||
filling_color = "#FF4500"
|
||||
bitesize = 100 // Always eat the apple in one bite
|
||||
|
||||
// Posioned Apple
|
||||
/obj/item/seeds/apple/poisoned
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/apple/poisoned
|
||||
mutatelist = list()
|
||||
reagents_add = list("cyanide" = 0.5, "vitamin" = 0.04, "nutriment" = 0.1)
|
||||
rarity = 50 // Source of cyanide, and hard (almost impossible) to obtain normally.
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple/poisoned
|
||||
seed = /obj/item/seeds/apple/poisoned
|
||||
|
||||
// Gold Apple
|
||||
/obj/item/seeds/apple/gold
|
||||
name = "pack of golden apple seeds"
|
||||
desc = "These seeds grow into golden apple trees. Good thing there are no firebirds in space."
|
||||
icon_state = "seed-goldapple"
|
||||
species = "goldapple"
|
||||
plantname = "Golden Apple Tree"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold
|
||||
maturation = 10
|
||||
production = 10
|
||||
mutatelist = list()
|
||||
reagents_add = list("gold" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1)
|
||||
rarity = 40 // Alchemy!
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold
|
||||
seed = /obj/item/seeds/apple/gold
|
||||
name = "golden apple"
|
||||
desc = "Emblazoned upon the apple is the word 'Kallisti'."
|
||||
icon_state = "goldapple"
|
||||
filling_color = "#FFD700"
|
||||
origin_tech = "biotech=4;materials=5"
|
||||
@@ -0,0 +1,121 @@
|
||||
// Banana
|
||||
/obj/item/seeds/banana
|
||||
name = "pack of banana seeds"
|
||||
desc = "They're seeds that grow into banana trees. When grown, keep away from clown."
|
||||
icon_state = "seed-banana"
|
||||
species = "banana"
|
||||
plantname = "Banana Tree"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/banana
|
||||
lifespan = 50
|
||||
endurance = 30
|
||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||
icon_dead = "banana-dead"
|
||||
genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/repeated_harvest)
|
||||
mutatelist = list(/obj/item/seeds/banana/mime, /obj/item/seeds/banana/bluespace)
|
||||
reagents_add = list("banana" = 0.1, "potassium" = 0.1, "vitamin" = 0.04, "nutriment" = 0.02)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana
|
||||
seed = /obj/item/seeds/banana
|
||||
name = "banana"
|
||||
desc = "It's an excellent prop for a clown."
|
||||
icon_state = "banana"
|
||||
item_state = "banana"
|
||||
trash = /obj/item/weapon/grown/bananapeel
|
||||
filling_color = "#FFFF00"
|
||||
bitesize = 5
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is aiming the [src.name] at themself! It looks like \he's trying to commit suicide.</span>")
|
||||
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1)
|
||||
sleep(25)
|
||||
if(!user)
|
||||
return (OXYLOSS)
|
||||
user.say("BANG!")
|
||||
sleep(25)
|
||||
if(!user)
|
||||
return (OXYLOSS)
|
||||
user.visible_message("<B>[user]</B> laughs so hard they begin to suffocate!")
|
||||
return (OXYLOSS)
|
||||
|
||||
/obj/item/weapon/grown/bananapeel
|
||||
seed = /obj/item/seeds/banana
|
||||
name = "banana peel"
|
||||
desc = "A peel from a banana."
|
||||
icon_state = "banana_peel"
|
||||
item_state = "banana_peel"
|
||||
w_class = 1
|
||||
throwforce = 0
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
|
||||
/obj/item/weapon/grown/bananapeel/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is deliberately slipping on the [src.name]! It looks like \he's trying to commit suicide.</span>")
|
||||
playsound(loc, 'sound/misc/slip.ogg', 50, 1, -1)
|
||||
return (BRUTELOSS)
|
||||
|
||||
|
||||
// Mimana - invisible sprites are totally a feature!
|
||||
/obj/item/seeds/banana/mime
|
||||
name = "pack of mimana seeds"
|
||||
desc = "They're seeds that grow into mimana trees. When grown, keep away from mime."
|
||||
icon_state = "seed-mimana"
|
||||
species = "mimana"
|
||||
plantname = "Mimana Tree"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/banana/mime
|
||||
growthstages = 4
|
||||
mutatelist = list()
|
||||
reagents_add = list("nothing" = 0.1, "capulettium_plus" = 0.1, "nutriment" = 0.02)
|
||||
rarity = 15
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana/mime
|
||||
seed = /obj/item/seeds/banana/mime
|
||||
name = "mimana"
|
||||
desc = "It's an excellent prop for a mime."
|
||||
icon_state = "mimana"
|
||||
trash = /obj/item/weapon/grown/bananapeel/mimanapeel
|
||||
filling_color = "#FFFFEE"
|
||||
|
||||
/obj/item/weapon/grown/bananapeel/mimanapeel
|
||||
seed = /obj/item/seeds/banana/mime
|
||||
name = "mimana peel"
|
||||
desc = "A mimana peel."
|
||||
icon_state = "mimana_peel"
|
||||
|
||||
// Bluespace Banana
|
||||
/obj/item/seeds/banana/bluespace
|
||||
name = "pack of bluespace banana seeds"
|
||||
desc = "They're seeds that grow into bluespace banana trees. When grown, keep away from bluespace clown."
|
||||
icon_state = "seed-banana-blue"
|
||||
species = "bluespacebanana"
|
||||
icon_grow = "banana-grow"
|
||||
plantname = "Bluespace Banana Tree"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/banana/bluespace
|
||||
mutatelist = list()
|
||||
genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/teleport, /datum/plant_gene/trait/repeated_harvest)
|
||||
reagents_add = list("singulo" = 0.2, "banana" = 0.1, "vitamin" = 0.04, "nutriment" = 0.02)
|
||||
rarity = 30
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana/bluespace
|
||||
seed = /obj/item/seeds/banana/bluespace
|
||||
name = "bluespace banana"
|
||||
icon_state = "banana_blue"
|
||||
trash = /obj/item/weapon/grown/bananapeel/bluespace
|
||||
filling_color = "#0000FF"
|
||||
origin_tech = "biotech=3;bluespace=5"
|
||||
|
||||
/obj/item/weapon/grown/bananapeel/bluespace
|
||||
seed = /obj/item/seeds/banana/bluespace
|
||||
name = "bluespace banana peel"
|
||||
desc = "A peel from a bluespace banana."
|
||||
icon_state = "banana_peel_blue"
|
||||
|
||||
// Other
|
||||
/obj/item/weapon/grown/bananapeel/specialpeel //used by /obj/item/clothing/shoes/clown_shoes/banana_shoes
|
||||
name = "synthesized banana peel"
|
||||
desc = "A synthetic banana peel."
|
||||
|
||||
/obj/item/weapon/grown/bananapeel/specialpeel/Crossed(AM)
|
||||
if(iscarbon(AM))
|
||||
var/mob/living/carbon/carbon = AM
|
||||
if(carbon.slip("[src]", 2, 2))
|
||||
qdel(src)
|
||||
@@ -0,0 +1,48 @@
|
||||
// Soybeans
|
||||
/obj/item/seeds/soya
|
||||
name = "pack of soybean seeds"
|
||||
desc = "These seeds grow into soybean plants."
|
||||
icon_state = "seed-soybean"
|
||||
species = "soybean"
|
||||
plantname = "Soybean Plants"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans
|
||||
maturation = 4
|
||||
production = 4
|
||||
potency = 15
|
||||
growthstages = 4
|
||||
growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
|
||||
icon_grow = "soybean-grow"
|
||||
icon_dead = "soybean-dead"
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
mutatelist = list(/obj/item/seeds/soya/koi)
|
||||
reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans
|
||||
seed = /obj/item/seeds/soya
|
||||
name = "soybeans"
|
||||
desc = "It's pretty bland, but oh the possibilities..."
|
||||
gender = PLURAL
|
||||
icon_state = "soybeans"
|
||||
filling_color = "#F0E68C"
|
||||
bitesize_mod = 2
|
||||
|
||||
// Koibean
|
||||
/obj/item/seeds/soya/koi
|
||||
name = "pack of koibean seeds"
|
||||
desc = "These seeds grow into koibean plants."
|
||||
icon_state = "seed-koibean"
|
||||
species = "koibean"
|
||||
plantname = "Koibean Plants"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/koibeans
|
||||
potency = 10
|
||||
mutatelist = list()
|
||||
reagents_add = list("carpotoxin" = 0.1, "vitamin" = 0.04, "nutriment" = 0.05)
|
||||
rarity = 20
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/koibeans
|
||||
seed = /obj/item/seeds/soya/koi
|
||||
name = "koibean"
|
||||
desc = "Something about these seems fishy."
|
||||
icon_state = "koibeans"
|
||||
filling_color = "#F0E68C"
|
||||
bitesize_mod = 2
|
||||
@@ -0,0 +1,188 @@
|
||||
// Berries
|
||||
/obj/item/seeds/berry
|
||||
name = "pack of berry seeds"
|
||||
desc = "These seeds grow into berry bushes."
|
||||
icon_state = "seed-berry"
|
||||
species = "berry"
|
||||
plantname = "Berry Bush"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/berries
|
||||
lifespan = 20
|
||||
maturation = 5
|
||||
production = 5
|
||||
yield = 2
|
||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||
icon_grow = "berry-grow" // Uses one growth icons set for all the subtypes
|
||||
icon_dead = "berry-dead" // Same for the dead icon
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
mutatelist = list(/obj/item/seeds/berry/glow, /obj/item/seeds/berry/poison)
|
||||
reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries
|
||||
seed = /obj/item/seeds/berry
|
||||
name = "bunch of berries"
|
||||
desc = "Nutritious!"
|
||||
icon_state = "berrypile"
|
||||
gender = PLURAL
|
||||
filling_color = "#FF00FF"
|
||||
bitesize_mod = 2
|
||||
|
||||
// Poison Berries
|
||||
/obj/item/seeds/berry/poison
|
||||
name = "pack of poison-berry seeds"
|
||||
desc = "These seeds grow into poison-berry bushes."
|
||||
icon_state = "seed-poisonberry"
|
||||
species = "poisonberry"
|
||||
plantname = "Poison-Berry Bush"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison
|
||||
mutatelist = list(/obj/item/seeds/berry/death)
|
||||
reagents_add = list("cyanide" = 0.15, "tirizene" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1)
|
||||
rarity = 10 // Mildly poisonous berries are common in reality
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison
|
||||
seed = /obj/item/seeds/berry/poison
|
||||
name = "bunch of poison-berries"
|
||||
desc = "Taste so good, you could die!"
|
||||
icon_state = "poisonberrypile"
|
||||
filling_color = "#C71585"
|
||||
|
||||
// Death Berries
|
||||
/obj/item/seeds/berry/death
|
||||
name = "pack of death-berry seeds"
|
||||
desc = "These seeds grow into death berries."
|
||||
icon_state = "seed-deathberry"
|
||||
species = "deathberry"
|
||||
plantname = "Death Berry Bush"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/berries/death
|
||||
lifespan = 30
|
||||
potency = 50
|
||||
mutatelist = list()
|
||||
reagents_add = list("coniine" = 0.08, "tirizene" = 0.1, "vitamin" = 0.04, "nutriment" = 0.1)
|
||||
rarity = 30
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries/death
|
||||
seed = /obj/item/seeds/berry/death
|
||||
name = "bunch of death-berries"
|
||||
desc = "Taste so good, you could die!"
|
||||
icon_state = "deathberrypile"
|
||||
filling_color = "#708090"
|
||||
|
||||
// Glow Berries
|
||||
/obj/item/seeds/berry/glow
|
||||
name = "pack of glow-berry seeds"
|
||||
desc = "These seeds grow into glow-berry bushes."
|
||||
icon_state = "seed-glowberry"
|
||||
species = "glowberry"
|
||||
plantname = "Glow-Berry Bush"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/berries/glow
|
||||
lifespan = 30
|
||||
endurance = 25
|
||||
mutatelist = list()
|
||||
genes = list(/datum/plant_gene/trait/glow/berry , /datum/plant_gene/trait/noreact, /datum/plant_gene/trait/repeated_harvest)
|
||||
reagents_add = list("uranium" = 0.25, "iodine" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1)
|
||||
rarity = 20
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries/glow
|
||||
seed = /obj/item/seeds/berry/glow
|
||||
name = "bunch of glow-berries"
|
||||
desc = "Nutritious!"
|
||||
icon_state = "glowberrypile"
|
||||
filling_color = "#7CFC00"
|
||||
origin_tech = "plasmatech=6"
|
||||
light_color = "#006622"
|
||||
|
||||
// Cherries
|
||||
/obj/item/seeds/cherry
|
||||
name = "pack of cherry pits"
|
||||
desc = "Careful not to crack a tooth on one... That'd be the pits."
|
||||
icon_state = "seed-cherry"
|
||||
species = "cherry"
|
||||
plantname = "Cherry Tree"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/cherries
|
||||
lifespan = 35
|
||||
endurance = 35
|
||||
maturation = 5
|
||||
production = 5
|
||||
growthstages = 5
|
||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||
icon_grow = "cherry-grow"
|
||||
icon_dead = "cherry-dead"
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
mutatelist = list(/obj/item/seeds/cherry/blue)
|
||||
reagents_add = list("nutriment" = 0.07, "sugar" = 0.07)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries
|
||||
seed = /obj/item/seeds/cherry
|
||||
name = "cherries"
|
||||
desc = "Great for toppings!"
|
||||
icon_state = "cherry"
|
||||
gender = PLURAL
|
||||
filling_color = "#FF0000"
|
||||
bitesize_mod = 2
|
||||
|
||||
// Blue Cherries
|
||||
/obj/item/seeds/cherry/blue
|
||||
name = "pack of blue cherry pits"
|
||||
desc = "The blue kind of cherries"
|
||||
icon_state = "seed-bluecherry"
|
||||
species = "bluecherry"
|
||||
plantname = "Blue Cherry Tree"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries
|
||||
mutatelist = list()
|
||||
reagents_add = list("nutriment" = 0.07, "sugar" = 0.07)
|
||||
rarity = 10
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries
|
||||
seed = /obj/item/seeds/cherry/blue
|
||||
name = "blue cherries"
|
||||
desc = "They're cherries that are blue."
|
||||
icon_state = "bluecherry"
|
||||
filling_color = "#6495ED"
|
||||
bitesize_mod = 2
|
||||
|
||||
// Grapes
|
||||
/obj/item/seeds/grape
|
||||
name = "pack of grape seeds"
|
||||
desc = "These seeds grow into grape vines."
|
||||
icon_state = "seed-grapes"
|
||||
species = "grape"
|
||||
plantname = "Grape Vine"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/grapes
|
||||
lifespan = 50
|
||||
endurance = 25
|
||||
maturation = 3
|
||||
production = 5
|
||||
yield = 4
|
||||
growthstages = 2
|
||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||
icon_grow = "grape-grow"
|
||||
icon_dead = "grape-dead"
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
mutatelist = list(/obj/item/seeds/grape/green)
|
||||
reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1, "sugar" = 0.1)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/grapes
|
||||
seed = /obj/item/seeds/grape
|
||||
name = "bunch of grapes"
|
||||
desc = "Nutritious!"
|
||||
icon_state = "grapes"
|
||||
dried_type = /obj/item/weapon/reagent_containers/food/snacks/no_raisin
|
||||
filling_color = "#FF1493"
|
||||
bitesize_mod = 2
|
||||
|
||||
// Green Grapes
|
||||
/obj/item/seeds/grape/green
|
||||
name = "pack of green grape seeds"
|
||||
desc = "These seeds grow into green-grape vines."
|
||||
icon_state = "seed-greengrapes"
|
||||
species = "greengrape"
|
||||
plantname = "Green-Grape Vine"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/grapes/green
|
||||
reagents_add = list("kelotane" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1, "sugar" = 0.1)
|
||||
// No rarity: technically it's a beneficial mutant, but it's not exactly "new"...
|
||||
mutatelist = list()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/grapes/green
|
||||
seed = /obj/item/seeds/grape/green
|
||||
name = "bunch of green grapes"
|
||||
icon_state = "greengrapes"
|
||||
filling_color = "#7FFF00"
|
||||
@@ -0,0 +1,121 @@
|
||||
// Cannabis
|
||||
/obj/item/seeds/cannabis
|
||||
name = "pack of cannabis seeds"
|
||||
desc = "Taxable."
|
||||
icon_state = "seed-cannabis"
|
||||
species = "cannabis"
|
||||
plantname = "Cannabis Plant"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis
|
||||
maturation = 8
|
||||
potency = 20
|
||||
growthstages = 1
|
||||
growing_icon = 'icons/goonstation/objects/hydroponics.dmi'
|
||||
icon_grow = "cannabis-grow" // Uses one growth icons set for all the subtypes
|
||||
icon_dead = "cannabis-dead" // Same for the dead icon
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
mutatelist = list(/obj/item/seeds/cannabis/rainbow,
|
||||
/obj/item/seeds/cannabis/death,
|
||||
/obj/item/seeds/cannabis/white,
|
||||
/obj/item/seeds/cannabis/ultimate)
|
||||
reagents_add = list("thc" = 0.15)
|
||||
|
||||
|
||||
/obj/item/seeds/cannabis/rainbow
|
||||
name = "pack of rainbow weed seeds"
|
||||
desc = "These seeds grow into rainbow weed. Groovy."
|
||||
icon_state = "seed-megacannabis"
|
||||
species = "megacannabis"
|
||||
plantname = "Rainbow Weed"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/rainbow
|
||||
mutatelist = list()
|
||||
reagents_add = list("lsd" = 0.15, "thc" = 0.15)
|
||||
rarity = 40
|
||||
|
||||
/obj/item/seeds/cannabis/death
|
||||
name = "pack of deathweed seeds"
|
||||
desc = "These seeds grow into deathweed. Not groovy."
|
||||
icon_state = "seed-blackcannabis"
|
||||
species = "blackcannabis"
|
||||
plantname = "Deathweed"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/death
|
||||
mutatelist = list()
|
||||
reagents_add = list("cyanide" = 0.35, "thc" = 0.15)
|
||||
rarity = 40
|
||||
|
||||
/obj/item/seeds/cannabis/white
|
||||
name = "pack of lifeweed seeds"
|
||||
desc = "I will give unto him that is munchies of the fountain of the cravings of life, freely."
|
||||
icon_state = "seed-whitecannabis"
|
||||
species = "whitecannabis"
|
||||
plantname = "Lifeweed"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/white
|
||||
mutatelist = list()
|
||||
reagents_add = list("omnizine" = 0.35, "thc" = 0.15)
|
||||
rarity = 40
|
||||
|
||||
|
||||
/obj/item/seeds/cannabis/ultimate
|
||||
name = "pack of omega weed seeds"
|
||||
desc = "These seeds grow into omega weed."
|
||||
icon_state = "seed-ocannabis"
|
||||
species = "ocannabis"
|
||||
plantname = "Omega Weed"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/ultimate
|
||||
mutatelist = list()
|
||||
reagents_add = list("lsd" = 0.15,
|
||||
"suicider" = 0.15,
|
||||
"space_drugs" = 0.15,
|
||||
"mercury" = 0.15,
|
||||
"lithium" = 0.15,
|
||||
"atropine" = 0.15,
|
||||
"ephedrine" = 0.15,
|
||||
"haloperidol" = 0.15,
|
||||
"methamphetamine" = 0.15,
|
||||
"thc" = 0.15,
|
||||
"psilocybin" = 0.15,
|
||||
"hairgrownium" = 0.15,
|
||||
"ectoplasm" = 0.15,
|
||||
"bath_salts" = 0.15,
|
||||
"itching_powder" = 0.15,
|
||||
"crank" = 0.15,
|
||||
"krokodil" = 0.15,
|
||||
"histamine" = 0.15)
|
||||
rarity = 69
|
||||
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis
|
||||
seed = /obj/item/seeds/cannabis
|
||||
icon = 'icons/goonstation/objects/hydroponics.dmi'
|
||||
name = "cannabis leaf"
|
||||
desc = "Recently legalized in most galaxies."
|
||||
icon_state = "cannabis"
|
||||
filling_color = "#00FF00"
|
||||
bitesize_mod = 2
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/rainbow
|
||||
seed = /obj/item/seeds/cannabis/rainbow
|
||||
name = "rainbow cannabis leaf"
|
||||
desc = "Is it supposed to be glowing like that...?"
|
||||
icon_state = "megacannabis"
|
||||
|
||||
/obj/item/weapon/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"
|
||||
|
||||
/obj/item/weapon/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"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/ultimate
|
||||
seed = /obj/item/seeds/cannabis/ultimate
|
||||
name = "omega cannibas leaf"
|
||||
desc = "You feel dizzy looking at it. What the fuck?"
|
||||
icon_state = "ocannabis"
|
||||
volume = 420
|
||||
@@ -0,0 +1,90 @@
|
||||
// Wheat
|
||||
/obj/item/seeds/wheat
|
||||
name = "pack of wheat seeds"
|
||||
desc = "These may, or may not, grow into wheat."
|
||||
icon_state = "seed-wheat"
|
||||
species = "wheat"
|
||||
plantname = "Wheat Stalks"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/wheat
|
||||
production = 1
|
||||
yield = 4
|
||||
potency = 15
|
||||
icon_dead = "wheat-dead"
|
||||
mutatelist = list(/obj/item/seeds/wheat/oat, /obj/item/seeds/wheat/meat)
|
||||
reagents_add = list("nutriment" = 0.04)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/wheat
|
||||
seed = /obj/item/seeds/wheat
|
||||
name = "wheat"
|
||||
desc = "Sigh... wheat... a-grain?"
|
||||
gender = PLURAL
|
||||
icon_state = "wheat"
|
||||
filling_color = "#F0E68C"
|
||||
bitesize_mod = 2
|
||||
|
||||
// Oat
|
||||
/obj/item/seeds/wheat/oat
|
||||
name = "pack of oat seeds"
|
||||
desc = "These may, or may not, grow into oat."
|
||||
icon_state = "seed-oat"
|
||||
species = "oat"
|
||||
plantname = "Oat Stalks"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/oat
|
||||
mutatelist = list()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/oat
|
||||
seed = /obj/item/seeds/wheat/oat
|
||||
name = "oat"
|
||||
desc = "Eat oats, do squats."
|
||||
gender = PLURAL
|
||||
icon_state = "oat"
|
||||
filling_color = "#556B2F"
|
||||
bitesize_mod = 2
|
||||
|
||||
// Rice
|
||||
/obj/item/seeds/wheat/rice
|
||||
name = "pack of rice seeds"
|
||||
desc = "These may, or may not, grow into rice."
|
||||
icon_state = "seed-rice"
|
||||
species = "rice"
|
||||
plantname = "Rice Stalks"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/rice
|
||||
mutatelist = list()
|
||||
growthstages = 3
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/rice
|
||||
seed = /obj/item/seeds/wheat/rice
|
||||
name = "rice"
|
||||
desc = "Rice to meet you."
|
||||
gender = PLURAL
|
||||
icon_state = "rice"
|
||||
filling_color = "#FAFAD2"
|
||||
bitesize_mod = 2
|
||||
|
||||
//Meatwheat - grows into synthetic meat
|
||||
/obj/item/seeds/wheat/meat
|
||||
name = "pack of meatwheat seeds"
|
||||
desc = "If you ever wanted to drive a vegetarian to insanity, here's how."
|
||||
icon_state = "seed-meatwheat"
|
||||
species = "meatwheat"
|
||||
plantname = "Meatwheat"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/meatwheat
|
||||
mutatelist = list()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/meatwheat
|
||||
name = "meatwheat"
|
||||
desc = "Some blood-drenched wheat stalks. You can crush them into what passes for meat if you squint hard enough."
|
||||
icon_state = "meatwheat"
|
||||
gender = PLURAL
|
||||
filling_color = rgb(150, 0, 0)
|
||||
bitesize_mod = 2
|
||||
seed = /obj/item/seeds/wheat/meat
|
||||
|
||||
/obj/item/weapon/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>")
|
||||
playsound(user, 'sound/effects/blobattack.ogg', 50, 1)
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/meat/meatwheat/M = new(get_turf(user))
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
user.put_in_hands(M)
|
||||
return 1
|
||||
@@ -0,0 +1,76 @@
|
||||
// Chili
|
||||
/obj/item/seeds/chili
|
||||
name = "pack of chili seeds"
|
||||
desc = "These seeds grow into chili plants. HOT! HOT! HOT!"
|
||||
icon_state = "seed-chili"
|
||||
species = "chili"
|
||||
plantname = "Chili Plants"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/chili
|
||||
lifespan = 20
|
||||
maturation = 5
|
||||
production = 5
|
||||
yield = 4
|
||||
potency = 20
|
||||
growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
|
||||
icon_grow = "chili-grow" // Uses one growth icons set for all the subtypes
|
||||
icon_dead = "chili-dead" // Same for the dead icon
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
mutatelist = list(/obj/item/seeds/chili/ice, /obj/item/seeds/chili/ghost)
|
||||
reagents_add = list("capsaicin" = 0.25, "vitamin" = 0.04, "nutriment" = 0.04)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/chili
|
||||
seed = /obj/item/seeds/chili
|
||||
name = "chili"
|
||||
desc = "It's spicy! Wait... IT'S BURNING ME!!"
|
||||
icon_state = "chilipepper"
|
||||
filling_color = "#FF0000"
|
||||
bitesize_mod = 2
|
||||
|
||||
// Ice Chili
|
||||
/obj/item/seeds/chili/ice
|
||||
name = "pack of ice pepper seeds"
|
||||
desc = "These seeds grow into ice pepper plants."
|
||||
icon_state = "seed-icepepper"
|
||||
species = "chiliice"
|
||||
plantname = "Ice Pepper Plants"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper
|
||||
lifespan = 25
|
||||
maturation = 4
|
||||
production = 4
|
||||
rarity = 20
|
||||
mutatelist = list()
|
||||
reagents_add = list("frostoil" = 0.25, "vitamin" = 0.02, "nutriment" = 0.02)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper
|
||||
seed = /obj/item/seeds/chili/ice
|
||||
name = "ice pepper"
|
||||
desc = "It's a mutant strain of chili"
|
||||
icon_state = "icepepper"
|
||||
filling_color = "#0000CD"
|
||||
bitesize_mod = 2
|
||||
origin_tech = "biotech=4"
|
||||
|
||||
// Ghost Chili
|
||||
/obj/item/seeds/chili/ghost
|
||||
name = "pack of ghost chili seeds"
|
||||
desc = "These seeds grow into a chili said to be the hottest in the galaxy."
|
||||
icon_state = "seed-chilighost"
|
||||
species = "chilighost"
|
||||
plantname = "Ghost Chili Plants"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili
|
||||
endurance = 10
|
||||
maturation = 10
|
||||
production = 10
|
||||
yield = 3
|
||||
rarity = 20
|
||||
mutatelist = list()
|
||||
reagents_add = list("condensedcapsaicin" = 0.3, "capsaicin" = 0.55, "nutriment" = 0.04)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili
|
||||
seed = /obj/item/seeds/chili/ghost
|
||||
name = "ghost chili"
|
||||
desc = "It seems to be vibrating gently."
|
||||
icon_state = "ghostchilipepper"
|
||||
filling_color = "#F8F8FF"
|
||||
bitesize_mod = 4
|
||||
origin_tech = "biotech=4;magnets=5"
|
||||
@@ -0,0 +1,155 @@
|
||||
// Citrus - base type
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus
|
||||
seed = /obj/item/seeds/lime
|
||||
name = "citrus"
|
||||
desc = "It's so sour, your face will twist."
|
||||
icon_state = "lime"
|
||||
bitesize_mod = 2
|
||||
|
||||
// Lime
|
||||
/obj/item/seeds/lime
|
||||
name = "pack of lime seeds"
|
||||
desc = "These are very sour seeds."
|
||||
icon_state = "seed-lime"
|
||||
species = "lime"
|
||||
plantname = "Lime Tree"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime
|
||||
lifespan = 55
|
||||
endurance = 50
|
||||
yield = 4
|
||||
potency = 15
|
||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
mutatelist = list(/obj/item/seeds/orange)
|
||||
reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime
|
||||
seed = /obj/item/seeds/lime
|
||||
name = "lime"
|
||||
desc = "It's so sour, your face will twist."
|
||||
icon_state = "lime"
|
||||
filling_color = "#00FF00"
|
||||
|
||||
// Orange
|
||||
/obj/item/seeds/orange
|
||||
name = "pack of orange seeds"
|
||||
desc = "Sour seeds."
|
||||
icon_state = "seed-orange"
|
||||
species = "orange"
|
||||
plantname = "Orange Tree"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange
|
||||
lifespan = 60
|
||||
endurance = 50
|
||||
yield = 5
|
||||
potency = 20
|
||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||
icon_grow = "lime-grow"
|
||||
icon_dead = "lime-dead"
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
mutatelist = list(/obj/item/seeds/lime)
|
||||
reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange
|
||||
seed = /obj/item/seeds/orange
|
||||
name = "orange"
|
||||
desc = "It's an tangy fruit."
|
||||
icon_state = "orange"
|
||||
filling_color = "#FFA500"
|
||||
|
||||
// Lemon
|
||||
/obj/item/seeds/lemon
|
||||
name = "pack of lemon seeds"
|
||||
desc = "These are sour seeds."
|
||||
icon_state = "seed-lemon"
|
||||
species = "lemon"
|
||||
plantname = "Lemon Tree"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon
|
||||
lifespan = 55
|
||||
endurance = 45
|
||||
yield = 4
|
||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||
icon_grow = "lime-grow"
|
||||
icon_dead = "lime-dead"
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
mutatelist = list(/obj/item/seeds/firelemon)
|
||||
reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon
|
||||
seed = /obj/item/seeds/lemon
|
||||
name = "lemon"
|
||||
desc = "When life gives you lemons, make lemonade."
|
||||
icon_state = "lemon"
|
||||
filling_color = "#FFD700"
|
||||
|
||||
// Combustible lemon
|
||||
/obj/item/seeds/firelemon //combustible lemon is too long so firelemon
|
||||
name = "pack of combustible lemon seeds"
|
||||
desc = "When life gives you lemons, don't make lemonade. Make life take the lemons back! Get mad! I don't want your damn lemons!"
|
||||
icon_state = "seed-firelemon"
|
||||
species = "firelemon"
|
||||
plantname = "Combustible Lemon Tree"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/firelemon
|
||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||
icon_grow = "lime-grow"
|
||||
icon_dead = "lime-dead"
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
lifespan = 55
|
||||
endurance = 45
|
||||
yield = 4
|
||||
reagents_add = list("nutriment" = 0.05)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/firelemon
|
||||
seed = /obj/item/seeds/firelemon
|
||||
name = "Combustible Lemon"
|
||||
desc = "Made for burning houses down."
|
||||
icon_state = "firelemon"
|
||||
bitesize_mod = 2
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/firelemon/attack_self(mob/living/user)
|
||||
var/area/A = get_area(user)
|
||||
user.visible_message("<span class='warning'>[user] primes the [src]!</span>", "<span class='userdanger'>You prime the [src]!</span>")
|
||||
var/message = "[ADMIN_LOOKUPFLW(user)] primed a combustible lemon for detonation at [A] [ADMIN_COORDJMP(user)]"
|
||||
bombers += message
|
||||
message_admins(message)
|
||||
log_game("[key_name(user)] primed a combustible lemon for detonation at [A] [COORD(user)].")
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.throw_mode_on()
|
||||
icon_state = "firelemon_active"
|
||||
playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
|
||||
addtimer(src, "prime", rand(10, 60))
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/firelemon/burn()
|
||||
prime()
|
||||
..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/firelemon/proc/update_mob()
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.unEquip(src)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/firelemon/ex_act(severity)
|
||||
qdel(src) //Ensuring that it's deleted by its own explosion
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/firelemon/proc/prime()
|
||||
switch(seed.potency) //Combustible lemons are alot like IEDs, lots of flame, very little bang.
|
||||
if(0 to 30)
|
||||
update_mob()
|
||||
explosion(loc,-1,-1,2, flame_range = 1)
|
||||
qdel(src)
|
||||
if(31 to 50)
|
||||
update_mob()
|
||||
explosion(loc,-1,-1,2, flame_range = 2)
|
||||
qdel(src)
|
||||
if(51 to 70)
|
||||
update_mob()
|
||||
explosion(loc,-1,-1,2, flame_range = 3)
|
||||
qdel(src)
|
||||
if(71 to 90)
|
||||
update_mob()
|
||||
explosion(loc,-1,-1,2, flame_range = 4)
|
||||
qdel(src)
|
||||
else
|
||||
update_mob()
|
||||
explosion(loc,-1,-1,2, flame_range = 5)
|
||||
qdel(src)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user