Merge branch 'dev' into ofBeesAndHoney

Conflicts:
	code/modules/materials/material_recipes.dm
This commit is contained in:
Kelenius
2015-08-14 16:55:21 +03:00
132 changed files with 1981 additions and 1371 deletions

View File

@@ -4,8 +4,8 @@ sudo: false
env: env:
BYOND_MAJOR="508" BYOND_MAJOR="508"
BYOND_MINOR="1287" BYOND_MINOR="1293"
MACRO_COUNT=1234 MACRO_COUNT=1230
cache: cache:
directories: directories:

View File

@@ -607,6 +607,7 @@
#include "code\game\objects\items\devices\scanners.dm" #include "code\game\objects\items\devices\scanners.dm"
#include "code\game\objects\items\devices\spy_bug.dm" #include "code\game\objects\items\devices\spy_bug.dm"
#include "code\game\objects\items\devices\suit_cooling.dm" #include "code\game\objects\items\devices\suit_cooling.dm"
#include "code\game\objects\items\devices\t_scanner.dm"
#include "code\game\objects\items\devices\taperecorder.dm" #include "code\game\objects\items\devices\taperecorder.dm"
#include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\traitordevices.dm"
#include "code\game\objects\items\devices\transfer_valve.dm" #include "code\game\objects\items\devices\transfer_valve.dm"
@@ -1115,6 +1116,7 @@
#include "code\modules\mob\animations.dm" #include "code\modules\mob\animations.dm"
#include "code\modules\mob\death.dm" #include "code\modules\mob\death.dm"
#include "code\modules\mob\emote.dm" #include "code\modules\mob\emote.dm"
#include "code\modules\mob\gender.dm"
#include "code\modules\mob\hear_say.dm" #include "code\modules\mob\hear_say.dm"
#include "code\modules\mob\holder.dm" #include "code\modules\mob\holder.dm"
#include "code\modules\mob\inventory.dm" #include "code\modules\mob\inventory.dm"

View File

@@ -117,6 +117,7 @@
#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 #define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed #define DOOR_CLOSED_LAYER 3.1 //Above most items if closed
#define LIGHTING_LAYER 11 #define LIGHTING_LAYER 11
#define HUD_LAYER 20 //Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots)
#define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put #define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put
#define SCREEN_LAYER 22 //Mob HUD/effects layer #define SCREEN_LAYER 22 //Mob HUD/effects layer

View File

@@ -94,3 +94,13 @@
#define INV_ACCESSORIES_DEF_ICON 'icons/mob/ties.dmi' #define INV_ACCESSORIES_DEF_ICON 'icons/mob/ties.dmi'
#define INV_SUIT_DEF_ICON 'icons/mob/ties.dmi' #define INV_SUIT_DEF_ICON 'icons/mob/ties.dmi'
#define INV_SUIT_DEF_ICON 'icons/mob/suit.dmi' #define INV_SUIT_DEF_ICON 'icons/mob/suit.dmi'
#define MAX_SUPPLIED_LAW_NUMBER 50
// NT's alignment towards the character
#define COMPANY_LOYAL "Loyal"
#define COMPANY_SUPPORTATIVE "Supportive"
#define COMPANY_NEUTRAL "Neutral"
#define COMPANY_SKEPTICAL "Skeptical"
#define COMPANY_OPPOSED "Opposed"
#define COMPANY_ALIGNMENTS list(COMPANY_LOYAL,COMPANY_SUPPORTATIVE,COMPANY_NEUTRAL,COMPANY_SKEPTICAL,COMPANY_OPPOSED)

View File

@@ -210,23 +210,14 @@ proc/listclearnulls(list/list)
return (result + R.Copy(Ri, 0)) return (result + R.Copy(Ri, 0))
//Mergesort: divides up the list into halves to begin the sort //Mergesort: divides up the list into halves to begin the sort
/proc/sortAtom(var/list/atom/L, var/order = 1, first = 1) /proc/sortAtom(var/list/atom/L, var/order = 1)
if(isnull(L) || L.len < 2) if(isnull(L) || L.len < 2)
if(!L)
testing("sortAtom() called with null as first parameter!")
return L return L
if(first)
var/msg = "sortAtom() called with list([L.len]): "
for(var/x in L)
msg += "'[x]'; "
testing(msg)
var/middle = L.len / 2 + 1 var/middle = L.len / 2 + 1
return mergeAtoms(sortAtom(L.Copy(0,middle), order, 0), sortAtom(L.Copy(middle), order, 0), order) return mergeAtoms(sortAtom(L.Copy(0,middle)), sortAtom(L.Copy(middle)), order)
//Mergsort: does the actual sorting and returns the results back to sortAtom //Mergsort: does the actual sorting and returns the results back to sortAtom
/proc/mergeAtoms(var/list/atom/L, var/list/atom/R, var/order = 1) /proc/mergeAtoms(var/list/atom/L, var/list/atom/R, var/order = 1)
if(!L || !R)
testing("mergeAtoms([L] ([L ? L.len : "*null*"]), [R] ([R ? R.len : "*null*"]))")
var/Li=1 var/Li=1
var/Ri=1 var/Ri=1
var/list/result = new() var/list/result = new()
@@ -239,14 +230,8 @@ proc/listclearnulls(list/list)
result += R[Ri++] result += R[Ri++]
if(Li <= L.len) if(Li <= L.len)
. = (result + L.Copy(Li, 0)) return (result + L.Copy(Li, 0))
if(!.) return (result + R.Copy(Ri, 0))
testing("mergeAtoms returning [.]")
return
. = (result + R.Copy(Ri, 0))
if(!.)
testing("mergeAtoms returning [.]")
return

View File

@@ -126,12 +126,12 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager, /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager,
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco, /obj/item/weapon/storage/fancy/cigarettes/dromedaryco,
/obj/item/weapon/lipstick/random, /obj/item/weapon/lipstick/random,
/obj/item/weapon/reagent_containers/food/drinks/cans/ale, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale,
/obj/item/weapon/reagent_containers/food/drinks/cans/ale, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale,
/obj/item/weapon/reagent_containers/food/drinks/cans/beer, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
/obj/item/weapon/reagent_containers/food/drinks/cans/beer, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
/obj/item/weapon/reagent_containers/food/drinks/cans/beer, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
/obj/item/weapon/reagent_containers/food/drinks/cans/beer) /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer)
cost = 20 cost = 20
containertype = /obj/structure/closet/crate containertype = /obj/structure/closet/crate
containername = "Party equipment" containername = "Party equipment"

View File

@@ -8,7 +8,7 @@
/datum/antagonist/proc/create_objectives(var/datum/mind/player) /datum/antagonist/proc/create_objectives(var/datum/mind/player)
if(config.objectives_disabled) if(config.objectives_disabled)
return 0 return 0
if(create_global_objectives()) if(create_global_objectives() || global_objectives.len)
player.objectives |= global_objectives player.objectives |= global_objectives
return 1 return 1

View File

@@ -7,8 +7,8 @@
for(var/datum/mind/P in current_antagonists) for(var/datum/mind/P in current_antagonists)
text += print_player_full(P) text += print_player_full(P)
text += get_special_objective_text(P) text += get_special_objective_text(P)
var/failed
if(!global_objectives.len && P.objectives && P.objectives.len) if(!global_objectives.len && P.objectives && P.objectives.len)
var/failed
var/num = 1 var/num = 1
for(var/datum/objective/O in P.objectives) for(var/datum/objective/O in P.objectives)
text += print_objective(O, num) text += print_objective(O, num)
@@ -20,8 +20,6 @@
feedback_add_details(feedback_tag,"[O.type]|FAIL") feedback_add_details(feedback_tag,"[O.type]|FAIL")
failed = 1 failed = 1
num++ num++
if(!config.objectives_disabled)
if(failed) if(failed)
text += "<br><font color='red'><B>The [role_text] has failed.</B></font>" text += "<br><font color='red'><B>The [role_text] has failed.</B></font>"
else else

View File

@@ -21,9 +21,14 @@
if(auto_init && ticker && ticker.current_state == GAME_STATE_PLAYING) if(auto_init && ticker && ticker.current_state == GAME_STATE_PLAYING)
initialize() initialize()
/proc/generate_debug_runtime() // Guaranteed to runtime and print a stack trace to the runtime log
var/t = 0 // BYOND won't let us do var/t = 1/0 directly, but it's fine with this.
t = 1 / t
/atom/movable/Del() /atom/movable/Del()
if(isnull(gcDestroyed) && loc) if(isnull(gcDestroyed) && loc)
testing("GC: -- [type] was deleted via del() rather than qdel() --") testing("GC: -- [type] was deleted via del() rather than qdel() --")
generate_debug_runtime() // stick a stack trace in the runtime logs
// else if(isnull(gcDestroyed)) // else if(isnull(gcDestroyed))
// testing("GC: [type] was deleted via GC without qdel()") //Not really a huge issue but from now on, please qdel() // testing("GC: [type] was deleted via GC without qdel()") //Not really a huge issue but from now on, please qdel()
// else // else
@@ -34,6 +39,7 @@
. = ..() . = ..()
if(reagents) if(reagents)
qdel(reagents) qdel(reagents)
reagents = null
for(var/atom/movable/AM in contents) for(var/atom/movable/AM in contents)
qdel(AM) qdel(AM)
loc = null loc = null

View File

@@ -286,14 +286,13 @@ var/global/list/additional_antag_types = list()
/datum/game_mode/proc/declare_completion() /datum/game_mode/proc/declare_completion()
var/is_antag_mode = (antag_templates && antag_templates.len) var/is_antag_mode = (antag_templates && antag_templates.len)
if(!config.objectives_disabled) check_victory()
check_victory() if(is_antag_mode)
if(is_antag_mode) sleep(10)
for(var/datum/antagonist/antag in antag_templates)
sleep(10) sleep(10)
for(var/datum/antagonist/antag in antag_templates) antag.check_victory()
sleep(10) antag.print_player_summary()
antag.check_victory()
antag.print_player_summary()
var/clients = 0 var/clients = 0
var/surviving_humans = 0 var/surviving_humans = 0
@@ -395,8 +394,8 @@ var/global/list/additional_antag_types = list()
if (special_role in disregard_roles) if (special_role in disregard_roles)
continue continue
else if(man.client.prefs.nanotrasen_relation == "Opposed" && prob(50) || \ else if(man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED && prob(50) || \
man.client.prefs.nanotrasen_relation == "Skeptical" && prob(20)) man.client.prefs.nanotrasen_relation == COMPANY_SKEPTICAL && prob(20))
suspects += man suspects += man
// Antags // Antags
else if(special_role_data && prob(special_role_data.suspicion_chance)) else if(special_role_data && prob(special_role_data.suspicion_chance))
@@ -562,9 +561,9 @@ proc/get_nt_opposed()
var/list/dudes = list() var/list/dudes = list()
for(var/mob/living/carbon/human/man in player_list) for(var/mob/living/carbon/human/man in player_list)
if(man.client) if(man.client)
if(man.client.prefs.nanotrasen_relation == "Opposed") if(man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED)
dudes += man dudes += man
else if(man.client.prefs.nanotrasen_relation == "Skeptical" && prob(50)) else if(man.client.prefs.nanotrasen_relation == COMPANY_SKEPTICAL && prob(50))
dudes += man dudes += man
if(dudes.len == 0) return null if(dudes.len == 0) return null
return pick(dudes) return pick(dudes)

View File

@@ -90,7 +90,7 @@
/datum/intercept_text/proc/get_suspect() /datum/intercept_text/proc/get_suspect()
var/list/dudes = list() var/list/dudes = list()
for(var/mob/living/carbon/human/man in player_list) if(man.client && man.client.prefs.nanotrasen_relation == "Opposed") for(var/mob/living/carbon/human/man in player_list) if(man.client && man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED)
dudes += man dudes += man
for(var/i = 0, i < max(player_list.len/10,2), i++) for(var/i = 0, i < max(player_list.len/10,2), i++)
dudes += pick(player_list) dudes += pick(player_list)

View File

@@ -8,6 +8,7 @@
spawn_positions = -1 spawn_positions = -1
supervisors = "absolutely everyone" supervisors = "absolutely everyone"
selection_color = "#dddddd" selection_color = "#dddddd"
economic_modifier = 1
access = list() //See /datum/job/assistant/get_access() access = list() //See /datum/job/assistant/get_access()
minimal_access = list() //See /datum/job/assistant/get_access() minimal_access = list() //See /datum/job/assistant/get_access()
alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Visitor") alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Visitor")

View File

@@ -16,6 +16,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
access = list() //See get_access() access = list() //See get_access()
minimal_access = list() //See get_access() minimal_access = list() //See get_access()
minimal_player_age = 14 minimal_player_age = 14
economic_modifier = 20
equip(var/mob/living/carbon/human/H) equip(var/mob/living/carbon/human/H)
if(!H) return 0 if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear)
@@ -60,6 +61,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
idtype = /obj/item/weapon/card/id/silver idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1 req_admin_notify = 1
minimal_player_age = 10 minimal_player_age = 10
economic_modifier = 10
access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers, access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,

View File

@@ -97,6 +97,7 @@
spawn_positions = 1 spawn_positions = 1
supervisors = "the head of personnel" supervisors = "the head of personnel"
selection_color = "#dddddd" selection_color = "#dddddd"
economic_modifier = 5
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
@@ -149,6 +150,7 @@
spawn_positions = 3 spawn_positions = 3
supervisors = "the quartermaster and the head of personnel" supervisors = "the quartermaster and the head of personnel"
selection_color = "#dddddd" selection_color = "#dddddd"
economic_modifier = 5
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
minimal_access = list(access_mining, access_mining_station, access_mailsorting) minimal_access = list(access_mining, access_mining_station, access_mailsorting)
alt_titles = list("Drill Technician","Prospector") alt_titles = list("Drill Technician","Prospector")
@@ -311,6 +313,7 @@
spawn_positions = 2 spawn_positions = 2
supervisors = "Nanotrasen officials and Corporate Regulations" supervisors = "Nanotrasen officials and Corporate Regulations"
selection_color = "#dddddd" selection_color = "#dddddd"
economic_modifier = 7
access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels, access_heads) access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels, access_heads)
minimal_access = list(access_lawyer, access_court, access_sec_doors, access_heads) minimal_access = list(access_lawyer, access_court, access_sec_doors, access_heads)

View File

@@ -11,6 +11,7 @@
selection_color = "#ffeeaa" selection_color = "#ffeeaa"
idtype = /obj/item/weapon/card/id/silver idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1 req_admin_notify = 1
economic_modifier = 10
access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
access_heads, access_construction, access_sec_doors, access_heads, access_construction, access_sec_doors,
@@ -53,6 +54,7 @@
spawn_positions = 5 spawn_positions = 5
supervisors = "the chief engineer" supervisors = "the chief engineer"
selection_color = "#fff5cc" selection_color = "#fff5cc"
economic_modifier = 5
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics) access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction) minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
alt_titles = list("Maintenance Technician","Engine Technician","Electrician") alt_titles = list("Maintenance Technician","Engine Technician","Electrician")
@@ -89,6 +91,7 @@
spawn_positions = 2 spawn_positions = 2
supervisors = "the chief engineer" supervisors = "the chief engineer"
selection_color = "#fff5cc" selection_color = "#fff5cc"
economic_modifier = 5
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks) access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks)
minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks) minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)

View File

@@ -20,6 +20,9 @@
var/department = null // Does this position have a department tag? var/department = null // Does this position have a department tag?
var/head_position = 0 // Is this position Command? var/head_position = 0 // Is this position Command?
var/account_allowed = 1 // Does this job type come with a station account?
var/economic_modifier = 2 // With how much does this job modify the initial account amount?
/datum/job/proc/equip(var/mob/living/carbon/human/H) /datum/job/proc/equip(var/mob/living/carbon/human/H)
return 1 return 1
@@ -34,6 +37,37 @@
H.species.equip_survival_gear(H,0) H.species.equip_survival_gear(H,0)
return 1 return 1
/datum/job/proc/setup_account(var/mob/living/carbon/human/H)
if(!account_allowed || (H.mind && H.mind.initial_account))
return
var/loyalty = 1
if(H.client)
switch(H.client.prefs.nanotrasen_relation)
if(COMPANY_LOYAL) loyalty = 1.30
if(COMPANY_SUPPORTATIVE)loyalty = 1.15
if(COMPANY_NEUTRAL) loyalty = 1
if(COMPANY_SKEPTICAL) loyalty = 0.85
if(COMPANY_OPPOSED) loyalty = 0.70
//give them an account in the station database
var/money_amount = (rand(5,50) + rand(5, 50)) * loyalty * economic_modifier * (H.species ? economic_species_modifier[H.species.type] : 2)
var/datum/money_account/M = create_account(H.real_name, money_amount, null)
if(H.mind)
var/remembered_info = ""
remembered_info += "<b>Your account number is:</b> #[M.account_number]<br>"
remembered_info += "<b>Your account pin is:</b> [M.remote_access_pin]<br>"
remembered_info += "<b>Your account funds are:</b> $[M.money]<br>"
if(M.transaction_log.len)
var/datum/transaction/T = M.transaction_log[1]
remembered_info += "<b>Your account was created:</b> [T.time], [T.date] at [T.source_terminal]<br>"
H.mind.store_memory(remembered_info)
H.mind.initial_account = M
H << "<span class='notice'><b>Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]</b></span>"
// overrideable separately so AIs/borgs can have cardborg hats without unneccessary new()/del() // overrideable separately so AIs/borgs can have cardborg hats without unneccessary new()/del()
/datum/job/proc/equip_preview(mob/living/carbon/human/H) /datum/job/proc/equip_preview(mob/living/carbon/human/H)
return equip(H) return equip(H)

View File

@@ -11,6 +11,7 @@
selection_color = "#ffddf0" selection_color = "#ffddf0"
idtype = /obj/item/weapon/card/id/silver idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1 req_admin_notify = 1
economic_modifier = 10
access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks) access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks)
@@ -44,6 +45,7 @@
spawn_positions = 3 spawn_positions = 3
supervisors = "the chief medical officer" supervisors = "the chief medical officer"
selection_color = "#ffeef0" selection_color = "#ffeef0"
economic_modifier = 7
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics) access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology) minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology)
alt_titles = list("Surgeon","Emergency Physician","Nurse","Virologist") alt_titles = list("Surgeon","Emergency Physician","Nurse","Virologist")
@@ -106,6 +108,7 @@
spawn_positions = 2 spawn_positions = 2
supervisors = "the chief medical officer" supervisors = "the chief medical officer"
selection_color = "#ffeef0" selection_color = "#ffeef0"
economic_modifier = 5
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics) access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
minimal_access = list(access_medical, access_chemistry) minimal_access = list(access_medical, access_chemistry)
alt_titles = list("Pharmacist") alt_titles = list("Pharmacist")
@@ -136,6 +139,7 @@
spawn_positions = 0 spawn_positions = 0
supervisors = "the chief medical officer and research director" supervisors = "the chief medical officer and research director"
selection_color = "#ffeef0" selection_color = "#ffeef0"
economic_modifier = 7
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research) access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research)
minimal_access = list(access_medical, access_morgue, access_genetics, access_research) minimal_access = list(access_medical, access_morgue, access_genetics, access_research)
@@ -162,6 +166,7 @@
faction = "Station" faction = "Station"
total_positions = 1 total_positions = 1
spawn_positions = 1 spawn_positions = 1
economic_modifier = 5
supervisors = "the chief medical officer" supervisors = "the chief medical officer"
selection_color = "#ffeef0" selection_color = "#ffeef0"
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_psychiatrist) access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_psychiatrist)
@@ -198,6 +203,7 @@
spawn_positions = 2 spawn_positions = 2
supervisors = "the chief medical officer" supervisors = "the chief medical officer"
selection_color = "#ffeef0" selection_color = "#ffeef0"
economic_modifier = 4
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist) access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist)
minimal_access = list(access_medical, access_medical_equip, access_eva, access_maint_tunnels, access_external_airlocks) minimal_access = list(access_medical, access_medical_equip, access_eva, access_maint_tunnels, access_external_airlocks)
alt_titles = list("Emergency Medical Technician") alt_titles = list("Emergency Medical Technician")

View File

@@ -11,6 +11,7 @@
selection_color = "#ffddff" selection_color = "#ffddff"
idtype = /obj/item/weapon/card/id/silver idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1 req_admin_notify = 1
economic_modifier = 15
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
access_tox_storage, access_teleporter, access_sec_doors, access_tox_storage, access_teleporter, access_sec_doors,
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
@@ -47,6 +48,7 @@
spawn_positions = 3 spawn_positions = 3
supervisors = "the research director" supervisors = "the research director"
selection_color = "#ffeeff" selection_color = "#ffeeff"
economic_modifier = 7
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch) access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch) minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher") alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher")
@@ -76,6 +78,7 @@
spawn_positions = 2 spawn_positions = 2
supervisors = "the research director" supervisors = "the research director"
selection_color = "#ffeeff" selection_color = "#ffeeff"
economic_modifier = 7
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics) access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics)
minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage) minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage)
alt_titles = list("Xenobotanist") alt_titles = list("Xenobotanist")
@@ -105,6 +108,7 @@
spawn_positions = 2 spawn_positions = 2
supervisors = "research director" supervisors = "research director"
selection_color = "#ffeeff" selection_color = "#ffeeff"
economic_modifier = 5
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access. access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access. minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
alt_titles = list("Biomechanical Engineer","Mechatronic Engineer") alt_titles = list("Biomechanical Engineer","Mechatronic Engineer")

View File

@@ -11,6 +11,7 @@
selection_color = "#ffdddd" selection_color = "#ffdddd"
idtype = /obj/item/weapon/card/id/silver idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1 req_admin_notify = 1
economic_modifier = 10
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
@@ -54,6 +55,7 @@
spawn_positions = 1 spawn_positions = 1
supervisors = "the head of security" supervisors = "the head of security"
selection_color = "#ffeeee" selection_color = "#ffeeee"
economic_modifier = 5
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_external_airlocks) access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_external_airlocks) minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_external_airlocks)
minimal_player_age = 5 minimal_player_age = 5
@@ -91,7 +93,7 @@
supervisors = "the head of security" supervisors = "the head of security"
selection_color = "#ffeeee" selection_color = "#ffeeee"
alt_titles = list("Forensic Technician") alt_titles = list("Forensic Technician")
economic_modifier = 5
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
alt_titles = list("Forensic Technician") alt_titles = list("Forensic Technician")
@@ -133,6 +135,7 @@
spawn_positions = 3 spawn_positions = 3
supervisors = "the head of security" supervisors = "the head of security"
selection_color = "#ffeeee" selection_color = "#ffeeee"
economic_modifier = 4
access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_external_airlocks) access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_external_airlocks) minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_external_airlocks)
minimal_player_age = 3 minimal_player_age = 3

View File

@@ -9,7 +9,8 @@
supervisors = "your laws" supervisors = "your laws"
req_admin_notify = 1 req_admin_notify = 1
minimal_player_age = 7 minimal_player_age = 7
account_allowed = 0
economic_modifier = 0
equip(var/mob/living/carbon/human/H) equip(var/mob/living/carbon/human/H)
if(!H) return 0 if(!H) return 0
return 1 return 1
@@ -40,6 +41,8 @@
selection_color = "#ddffdd" selection_color = "#ddffdd"
minimal_player_age = 1 minimal_player_age = 1
alt_titles = list("Android", "Robot") alt_titles = list("Android", "Robot")
account_allowed = 0
economic_modifier = 0
equip(var/mob/living/carbon/human/H) equip(var/mob/living/carbon/human/H)
if(!H) return 0 if(!H) return 0

View File

@@ -392,6 +392,7 @@ var/global/datum/controller/occupations/job_master
spawn_in_storage += thing spawn_in_storage += thing
//Equip job items. //Equip job items.
job.equip(H) job.equip(H)
job.setup_account(H)
job.equip_backpack(H) job.equip_backpack(H)
job.equip_survival(H) job.equip_survival(H)
job.apply_fingerprints(H) job.apply_fingerprints(H)
@@ -428,21 +429,6 @@ var/global/datum/controller/occupations/job_master
H.buckled.loc = H.loc H.buckled.loc = H.loc
H.buckled.set_dir(H.dir) H.buckled.set_dir(H.dir)
//give them an account in the station database
var/datum/money_account/M = create_account(H.real_name, rand(50,500)*10, null)
if(H.mind)
var/remembered_info = ""
remembered_info += "<b>Your account number is:</b> #[M.account_number]<br>"
remembered_info += "<b>Your account pin is:</b> [M.remote_access_pin]<br>"
remembered_info += "<b>Your account funds are:</b> $[M.money]<br>"
if(M.transaction_log.len)
var/datum/transaction/T = M.transaction_log[1]
remembered_info += "<b>Your account was created:</b> [T.time], [T.date] at [T.source_terminal]<br>"
H.mind.store_memory(remembered_info)
H.mind.initial_account = M
// If they're head, give them the account info for their department // If they're head, give them the account info for their department
if(H.mind && job.head_position) if(H.mind && job.head_position)
var/remembered_info = "" var/remembered_info = ""
@@ -455,9 +441,6 @@ var/global/datum/controller/occupations/job_master
H.mind.store_memory(remembered_info) H.mind.store_memory(remembered_info)
spawn(0)
H << "<span class='notice'><b>Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]</b></span>"
var/alt_title = null var/alt_title = null
if(H.mind) if(H.mind)
H.mind.assigned_role = rank H.mind.assigned_role = rank

View File

@@ -333,7 +333,7 @@
/datum/autolathe/recipe/magazine_c20r /datum/autolathe/recipe/magazine_c20r
name = "ammunition (12mm)" name = "ammunition (12mm)"
path = /obj/item/ammo_magazine/a12mm path = /obj/item/ammo_magazine/a10mm
hidden = 1 hidden = 1
category = "Arms and Ammunition" category = "Arms and Ammunition"

View File

@@ -47,11 +47,13 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
signal.data["slow"] += rand(0, round((100-integrity))) // apply some lag based on integrity signal.data["slow"] += rand(0, round((100-integrity))) // apply some lag based on integrity
/*
// Edit by Atlantis: Commented out as emergency fix due to causing extreme delays in communications.
// Apply some lag based on traffic rates // Apply some lag based on traffic rates
var/netlag = round(traffic / 50) var/netlag = round(traffic / 50)
if(netlag > signal.data["slow"]) if(netlag > signal.data["slow"])
signal.data["slow"] = netlag signal.data["slow"] = netlag
*/
// Loop through all linked machines and send the signal or copy. // Loop through all linked machines and send the signal or copy.
for(var/obj/machinery/telecomms/machine in links) for(var/obj/machinery/telecomms/machine in links)
if(filter && !istype( machine, text2path(filter) )) if(filter && !istype( machine, text2path(filter) ))

View File

@@ -688,8 +688,8 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,/obj/item/weapon/reagent_containers/food/drinks/cans/beer = 6, /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 6,
/obj/item/weapon/reagent_containers/food/drinks/cans/ale = 6,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 6,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 4,
/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 4,/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 4,/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 4,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 4,/obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 8, /obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 4,/obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 8,
/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 8, /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 15, /obj/item/weapon/reagent_containers/food/drinks/cans/cola = 8, /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 15,

View File

@@ -7,60 +7,6 @@ GAS ANALYZER
MASS SPECTROMETER MASS SPECTROMETER
REAGENT SCANNER REAGENT SCANNER
*/ */
/obj/item/device/t_scanner
name = "\improper T-ray scanner"
desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
icon_state = "t-ray0"
var/on = 0
slot_flags = SLOT_BELT
w_class = 2
item_state = "electronic"
matter = list(DEFAULT_WALL_MATERIAL = 150)
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINERING = 1)
/obj/item/device/t_scanner/attack_self(mob/user)
on = !on
icon_state = "t-ray[on]"
if(on)
processing_objects.Add(src)
/obj/item/device/t_scanner/process()
if(!on)
processing_objects.Remove(src)
return null
for(var/turf/T in range(1, src.loc) )
if(!T.intact)
continue
for(var/obj/O in T.contents)
if(O.level != 1)
continue
if(O.invisibility == 101)
O.invisibility = 0
O.alpha = 128
spawn(10)
if(O)
var/turf/U = O.loc
if(U.intact)
O.invisibility = 101
O.alpha = 255
var/mob/living/M = locate() in T
if(M && M.invisibility == 2)
M.invisibility = 0
spawn(2)
if(M)
M.invisibility = INVISIBILITY_LEVEL_TWO
/obj/item/device/healthanalyzer /obj/item/device/healthanalyzer
name = "health analyzer" name = "health analyzer"

View File

@@ -0,0 +1,135 @@
#define OVERLAY_CACHE_LEN 50
/obj/item/device/t_scanner
name = "\improper T-ray scanner"
desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
icon_state = "t-ray0"
slot_flags = SLOT_BELT
w_class = 2
item_state = "electronic"
matter = list(DEFAULT_WALL_MATERIAL = 150)
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINERING = 1)
var/scan_range = 1
var/on = 0
var/list/active_scanned = list() //assoc list of objects being scanned, mapped to their overlay
var/client/user_client //since making sure overlays are properly added and removed is pretty important, so we track the current user explicitly
var/flicker = 0
var/global/list/overlay_cache = list() //cache recent overlays
/obj/item/device/t_scanner/update_icon()
icon_state = "t-ray[on]"
/obj/item/device/t_scanner/attack_self(mob/user)
set_active(!on)
/obj/item/device/t_scanner/proc/set_active(var/active)
on = active
if(on)
processing_objects.Add(src)
flicker = 0
else
processing_objects.Remove(src)
set_user_client(null)
update_icon()
//If reset is set, then assume the client has none of our overlays, otherwise we only send new overlays.
/obj/item/device/t_scanner/process()
if(!on) return
//handle clients changing
var/client/loc_client = null
if(ismob(src.loc))
var/mob/M = src.loc
loc_client = M.client
set_user_client(loc_client)
//no sense processing if no-one is going to see it.
if(!user_client) return
//get all objects in scan range
var/list/scanned = get_scanned_objects(scan_range)
var/list/update_add = scanned - active_scanned
var/list/update_remove = active_scanned - scanned
//Add new overlays
for(var/obj/O in update_add)
var/image/overlay = get_overlay(O)
active_scanned[O] = overlay
user_client.images += overlay
//Remove stale overlays
for(var/obj/O in update_remove)
user_client.images -= active_scanned[O]
active_scanned -= O
//Flicker effect
for(var/obj/O in active_scanned)
var/image/overlay = active_scanned[O]
if(flicker)
overlay.alpha = 0
else
overlay.alpha = 128
flicker = !flicker
//creates a new overlay for a scanned object
/obj/item/device/t_scanner/proc/get_overlay(obj/scanned)
//Use a cache so we don't create a whole bunch of new images just because someone's walking back and forth in a room.
//Also means that images are reused if multiple people are using t-rays to look at the same objects.
if(scanned in overlay_cache)
. = overlay_cache[scanned]
else
var/image/I = image(loc = scanned, icon = scanned.icon, icon_state = scanned.icon_state, layer = HUD_LAYER)
//Pipes are special
if(istype(scanned, /obj/machinery/atmospherics/pipe))
var/obj/machinery/atmospherics/pipe/P = scanned
I.color = P.pipe_color
I.overlays += P.overlays
I.alpha = 128
I.mouse_opacity = 0
. = I
// Add it to cache, cutting old entries if the list is too long
overlay_cache[scanned] = .
if(overlay_cache.len > OVERLAY_CACHE_LEN)
overlay_cache.Cut(1, overlay_cache.len-OVERLAY_CACHE_LEN-1)
/obj/item/device/t_scanner/proc/get_scanned_objects(var/scan_dist)
. = list()
var/turf/center = get_turf(src.loc)
if(!center) return
for(var/turf/T in range(scan_range, center))
if(!T.intact)
continue
for(var/obj/O in T.contents)
if(O.level != 1)
continue
if(!O.invisibility)
continue //if it's already visible don't need an overlay for it
. += O
/obj/item/device/t_scanner/proc/set_user_client(var/client/new_client)
if(new_client == user_client)
return
if(user_client)
for(var/scanned in active_scanned)
user_client.images -= active_scanned[scanned]
if(new_client)
for(var/scanned in active_scanned)
new_client.images += active_scanned[scanned]
else
active_scanned.Cut()
user_client = new_client
/obj/item/device/t_scanner/dropped(mob/user)
set_user_client(null)
#undef OVERLAY_CACHE_LEN

View File

@@ -131,7 +131,7 @@ datum/uplink_item/dd_SortValue()
path = /obj/item/ammo_magazine/a357 path = /obj/item/ammo_magazine/a357
/datum/uplink_item/item/ammo/mc9mm /datum/uplink_item/item/ammo/mc9mm
name = ".9mm" name = "9mm"
path = /obj/item/ammo_magazine/mc9mm path = /obj/item/ammo_magazine/mc9mm
/datum/uplink_item/item/ammo/darts /datum/uplink_item/item/ammo/darts
@@ -142,6 +142,14 @@ datum/uplink_item/dd_SortValue()
name = "14.5mm" name = "14.5mm"
path = /obj/item/weapon/storage/box/sniperammo path = /obj/item/weapon/storage/box/sniperammo
/datum/uplink_item/item/ammo/a10mm
name = "10mm"
path = /obj/item/ammo_magazine/a10mm
/datum/uplink_item/item/ammo/a762
name = "7.62mm"
path = /obj/item/ammo_magazine/a762
/*************************************** /***************************************
* Highly Visible and Dangerous Weapons * * Highly Visible and Dangerous Weapons *
***************************************/ ***************************************/
@@ -188,6 +196,17 @@ datum/uplink_item/dd_SortValue()
item_cost = DEFAULT_TELECRYSTAL_AMOUNT item_cost = DEFAULT_TELECRYSTAL_AMOUNT
path = /obj/item/weapon/gun/projectile/heavysniper path = /obj/item/weapon/gun/projectile/heavysniper
//These are for traitors (or other antags, perhaps) to have the option of purchasing some merc gear.
/datum/uplink_item/item/visible_weapons/submachinegun
name = "Submachine Gun"
item_cost = 6
path = /obj/item/weapon/gun/projectile/automatic/c20r
/datum/uplink_item/item/visible_weapons/assaultrifle
name = "Assault Rifle"
item_cost = 7
path = /obj/item/weapon/gun/projectile/automatic/sts35
/************************************* /*************************************
* Stealthy and Inconspicuous Weapons * * Stealthy and Inconspicuous Weapons *
*************************************/ *************************************/

View File

@@ -68,10 +68,7 @@
if (istype(E, /datum/stack_recipe_list)) if (istype(E, /datum/stack_recipe_list))
var/datum/stack_recipe_list/srl = E var/datum/stack_recipe_list/srl = E
if (src.get_amount() >= srl.req_amount) t1 += "<a href='?src=\ref[src];sublist=[i]'>[srl.title]</a>"
t1 += "<a href='?src=\ref[src];sublist=[i]'>[srl.title] ([srl.req_amount] [src.singular_name]\s)</a>"
else
t1 += "[srl.title] ([srl.req_amount] [src.singular_name]\s)<br>"
if (istype(E, /datum/stack_recipe)) if (istype(E, /datum/stack_recipe))
var/datum/stack_recipe/R = E var/datum/stack_recipe/R = E
@@ -360,8 +357,6 @@
/datum/stack_recipe_list /datum/stack_recipe_list
var/title = "ERROR" var/title = "ERROR"
var/list/recipes = null var/list/recipes = null
var/req_amount = 1 New(title, recipes)
New(title, recipes, req_amount = 1)
src.title = title src.title = title
src.recipes = recipes src.recipes = recipes
src.req_amount = req_amount

View File

@@ -100,10 +100,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
flags |= NOREACT // so it doesn't react until you light it flags |= NOREACT // so it doesn't react until you light it
create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15 create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15
/obj/item/clothing/mask/smokable/Destroy()
..()
qdel(reagents)
/obj/item/clothing/mask/smokable/process() /obj/item/clothing/mask/smokable/process()
var/turf/location = get_turf(src) var/turf/location = get_turf(src)
smoketime-- smoketime--

View File

@@ -15,8 +15,8 @@
/obj/item/weapon/storage/bible/booze/New() /obj/item/weapon/storage/bible/booze/New()
..() ..()
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src)
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src)
new /obj/item/weapon/spacecash(src) new /obj/item/weapon/spacecash(src)
new /obj/item/weapon/spacecash(src) new /obj/item/weapon/spacecash(src)
new /obj/item/weapon/spacecash(src) new /obj/item/weapon/spacecash(src)

View File

@@ -146,11 +146,6 @@
new /obj/item/clothing/mask/smokable/cigarette(src) new /obj/item/clothing/mask/smokable/cigarette(src)
create_reagents(15 * storage_slots)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one create_reagents(15 * storage_slots)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one
/obj/item/weapon/storage/fancy/cigarettes/Destroy()
qdel(reagents)
..()
/obj/item/weapon/storage/fancy/cigarettes/update_icon() /obj/item/weapon/storage/fancy/cigarettes/update_icon()
icon_state = "[initial(icon_state)][contents.len]" icon_state = "[initial(icon_state)][contents.len]"
return return
@@ -202,10 +197,6 @@
new /obj/item/clothing/mask/smokable/cigarette/cigar(src) new /obj/item/clothing/mask/smokable/cigarette/cigar(src)
create_reagents(15 * storage_slots) create_reagents(15 * storage_slots)
/obj/item/weapon/storage/fancy/cigar/Destroy()
qdel(reagents)
..()
/obj/item/weapon/storage/fancy/cigar/update_icon() /obj/item/weapon/storage/fancy/cigar/update_icon()
icon_state = "[initial(icon_state)][contents.len]" icon_state = "[initial(icon_state)][contents.len]"
return return

View File

@@ -25,6 +25,16 @@ LINEN BINS
add_fingerprint(user) add_fingerprint(user)
return return
/obj/item/weapon/bedsheet/attackby(obj/item/I, mob/user)
if(is_sharp(I))
user.visible_message("<span class='notice'>\The [user] begins cutting up [src] with [I].</span>", "<span class='notice'>You begin cutting up [src] with [I].</span>")
if(do_after(user, 50))
user << "<span class='notice'>You cut [src] into pieces!</span>"
for(var/i in 1 to rand(2,5))
new /obj/item/weapon/reagent_containers/glass/rag(src.loc)
qdel(src)
return
..()
/obj/item/weapon/bedsheet/blue /obj/item/weapon/bedsheet/blue
icon_state = "sheetblue" icon_state = "sheetblue"

View File

@@ -11,16 +11,16 @@
New() New()
..() ..()
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
return return
/obj/structure/closet/secure_closet/bar/update_icon() /obj/structure/closet/secure_closet/bar/update_icon()

View File

@@ -42,11 +42,11 @@
/obj/structure/closet/syndicate/nuclear/New() /obj/structure/closet/syndicate/nuclear/New()
..() ..()
new /obj/item/ammo_magazine/a12mm(src) new /obj/item/ammo_magazine/a10mm(src)
new /obj/item/ammo_magazine/a12mm(src) new /obj/item/ammo_magazine/a10mm(src)
new /obj/item/ammo_magazine/a12mm(src) new /obj/item/ammo_magazine/a10mm(src)
new /obj/item/ammo_magazine/a12mm(src) new /obj/item/ammo_magazine/a10mm(src)
new /obj/item/ammo_magazine/a12mm(src) new /obj/item/ammo_magazine/a10mm(src)
new /obj/item/weapon/storage/box/handcuffs(src) new /obj/item/weapon/storage/box/handcuffs(src)
new /obj/item/weapon/storage/box/flashbangs(src) new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/gun/energy/gun(src) new /obj/item/weapon/gun/energy/gun(src)

View File

@@ -395,7 +395,7 @@
if (istype(RG) && RG.is_open_container()) if (istype(RG) && RG.is_open_container())
RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this))
user.visible_message("<span class='notice'>[user] fills \the [RG] using \the [src].</span>","<span class='notice'>You fill \the [RG] using \the [src].</span>") user.visible_message("<span class='notice'>[user] fills \the [RG] using \the [src].</span>","<span class='notice'>You fill \the [RG] using \the [src].</span>")
return return 1
else if (istype(O, /obj/item/weapon/melee/baton)) else if (istype(O, /obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = O var/obj/item/weapon/melee/baton/B = O
@@ -413,7 +413,7 @@
user.visible_message( \ user.visible_message( \
"<span class='danger'>[user] was stunned by \his wet [O]!</span>", \ "<span class='danger'>[user] was stunned by \his wet [O]!</span>", \
"<span class='userdanger'>[user] was stunned by \his wet [O]!</span>") "<span class='userdanger'>[user] was stunned by \his wet [O]!</span>")
return return 1
// Short of a rewrite, this is necessary to stop monkeycubes being washed. // Short of a rewrite, this is necessary to stop monkeycubes being washed.
else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube)) else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
return return

View File

@@ -239,6 +239,7 @@
if(istype(W, /obj/item/weapon/screwdriver)) if(istype(W, /obj/item/weapon/screwdriver))
if(reinf && state >= 1) if(reinf && state >= 1)
state = 3 - state state = 3 - state
update_nearby_icons()
playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
user << (state == 1 ? "<span class='notice'>You have unfastened the window from the frame.</span>" : "<span class='notice'>You have fastened the window to the frame.</span>") user << (state == 1 ? "<span class='notice'>You have unfastened the window from the frame.</span>" : "<span class='notice'>You have fastened the window to the frame.</span>")
else if(reinf && state == 0) else if(reinf && state == 0)
@@ -337,7 +338,11 @@
/obj/structure/window/Destroy() /obj/structure/window/Destroy()
density = 0 density = 0
update_nearby_tiles() update_nearby_tiles()
update_nearby_icons() var/turf/location = loc
loc = null
for(var/obj/structure/window/W in orange(location, 1))
W.update_icon()
loc = location
..() ..()
@@ -357,35 +362,31 @@
//This proc is used to update the icons of nearby windows. It should not be confused with update_nearby_tiles(), which is an atmos proc! //This proc is used to update the icons of nearby windows. It should not be confused with update_nearby_tiles(), which is an atmos proc!
/obj/structure/window/proc/update_nearby_icons() /obj/structure/window/proc/update_nearby_icons()
update_icon() update_icon()
for(var/direction in cardinal) for(var/obj/structure/window/W in orange(src, 1))
for(var/obj/structure/window/W in get_step(src,direction) ) W.update_icon()
W.update_icon()
//merges adjacent full-tile windows into one (blatant ripoff from game/smoothwall.dm) //merges adjacent full-tile windows into one (blatant ripoff from game/smoothwall.dm)
/obj/structure/window/update_icon() /obj/structure/window/update_icon()
//A little cludge here, since I don't know how it will work with slim windows. Most likely VERY wrong. //A little cludge here, since I don't know how it will work with slim windows. Most likely VERY wrong.
//this way it will only update full-tile ones //this way it will only update full-tile ones
//This spawn is here so windows get properly updated when one gets deleted. overlays.Cut()
spawn(2) if(!is_fulltile())
if(!src) return icon_state = "[basestate]"
if(!is_fulltile())
icon_state = "[basestate]"
return
var/junction = 0 //will be used to determine from which side the window is connected to other windows
if(anchored)
for(var/obj/structure/window/W in orange(src,1))
if(W.anchored && W.density && W.is_fulltile()) //Only counts anchored, not-destroyed fill-tile windows.
if(abs(x-W.x)-abs(y-W.y) ) //doesn't count windows, placed diagonally to src
junction |= get_dir(src,W)
if(opacity)
icon_state = "[basestate][junction]"
else
if(reinf)
icon_state = "[basestate][junction]"
else
icon_state = "[basestate][junction]"
return return
var/list/dirs = list()
if(anchored)
for(var/obj/structure/window/W in orange(src,1))
if(W.anchored && W.density && W.type == src.type && W.is_fulltile()) //Only counts anchored, not-destroyed fill-tile windows.
dirs += get_dir(src, W)
var/list/connections = dirs_to_corner_states(dirs)
icon_state = ""
for(var/i = 1 to 4)
var/image/I = image(icon, "[basestate][connections[i]]", dir = 1<<(i-1))
overlays += I
return
/obj/structure/window/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) /obj/structure/window/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > T0C + 800) if(exposed_temperature > T0C + 800)
@@ -466,11 +467,9 @@
basestate = "window" basestate = "window"
maxhealth = 40 maxhealth = 40
reinf = 1 reinf = 1
basestate = "w"
dir = 5 dir = 5
update_icon() //icon_state has to be set manually
return
/obj/structure/window/reinforced/polarized /obj/structure/window/reinforced/polarized
name = "electrochromic window" name = "electrochromic window"
desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it." desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it."

View File

@@ -197,7 +197,7 @@ var/list/mechtoys = list(
// Sell phoron and platinum // Sell phoron and platinum
if(istype(A, /obj/item/stack)) if(istype(A, /obj/item/stack))
var/obj/item/stack/P var/obj/item/stack/P = A
switch(P.get_material_name()) switch(P.get_material_name())
if("phoron") phoron_count += P.get_amount() if("phoron") phoron_count += P.get_amount()
if("platinum") plat_count += P.get_amount() if("platinum") plat_count += P.get_amount()

View File

@@ -6,16 +6,16 @@
if(density) if(density)
can_open = WALL_OPENING can_open = WALL_OPENING
set_wall_state("[material.icon_base]fwall_open")
//flick("[material.icon_base]fwall_opening", src) //flick("[material.icon_base]fwall_opening", src)
sleep(15) sleep(15)
density = 0 density = 0
update_icon()
set_light(0) set_light(0)
else else
can_open = WALL_OPENING can_open = WALL_OPENING
//flick("[material.icon_base]fwall_closing", src) //flick("[material.icon_base]fwall_closing", src)
set_wall_state("[material.icon_base]0")
density = 1 density = 1
update_icon()
sleep(15) sleep(15)
set_light(1) set_light(1)
@@ -208,7 +208,7 @@
construction_stage = 5 construction_stage = 5
new /obj/item/stack/rods( src ) new /obj/item/stack/rods( src )
user << "<span class='notice'>You cut the outer grille.</span>" user << "<span class='notice'>You cut the outer grille.</span>"
set_wall_state() update_icon()
return return
if(5) if(5)
if (istype(W, /obj/item/weapon/screwdriver)) if (istype(W, /obj/item/weapon/screwdriver))
@@ -217,7 +217,7 @@
if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 5) if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 5)
return return
construction_stage = 4 construction_stage = 4
set_wall_state() update_icon()
user << "<span class='notice'>You remove the support lines.</span>" user << "<span class='notice'>You remove the support lines.</span>"
return return
else if( istype(W, /obj/item/stack/rods) ) else if( istype(W, /obj/item/stack/rods) )
@@ -225,7 +225,7 @@
if(O.get_amount()>0) if(O.get_amount()>0)
O.use(1) O.use(1)
construction_stage = 6 construction_stage = 6
set_wall_state() update_icon()
user << "<span class='notice'>You replace the outer grille.</span>" user << "<span class='notice'>You replace the outer grille.</span>"
return return
if(4) if(4)
@@ -247,7 +247,7 @@
if(!do_after(user, 60) || !istype(src, /turf/simulated/wall) || construction_stage != 4) if(!do_after(user, 60) || !istype(src, /turf/simulated/wall) || construction_stage != 4)
return return
construction_stage = 3 construction_stage = 3
set_wall_state() update_icon()
user << "<span class='notice'>You press firmly on the cover, dislodging it.</span>" user << "<span class='notice'>You press firmly on the cover, dislodging it.</span>"
return return
if(3) if(3)
@@ -257,7 +257,7 @@
if(!do_after(user,100) || !istype(src, /turf/simulated/wall) || construction_stage != 3) if(!do_after(user,100) || !istype(src, /turf/simulated/wall) || construction_stage != 3)
return return
construction_stage = 2 construction_stage = 2
set_wall_state() update_icon()
user << "<span class='notice'>You pry off the cover.</span>" user << "<span class='notice'>You pry off the cover.</span>"
return return
if(2) if(2)
@@ -267,7 +267,7 @@
if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 2) if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 2)
return return
construction_stage = 1 construction_stage = 1
set_wall_state() update_icon()
user << "<span class='notice'>You remove the bolts anchoring the support rods.</span>" user << "<span class='notice'>You remove the bolts anchoring the support rods.</span>"
return return
if(1) if(1)
@@ -287,7 +287,7 @@
if(!do_after(user,70) || !istype(src, /turf/simulated/wall) || construction_stage != 1) if(!do_after(user,70) || !istype(src, /turf/simulated/wall) || construction_stage != 1)
return return
construction_stage = 0 construction_stage = 0
set_wall_state() update_icon()
new /obj/item/stack/rods(src) new /obj/item/stack/rods(src)
user << "<span class='notice'>The support rods drop out as you cut them loose from the frame.</span>" user << "<span class='notice'>The support rods drop out as you cut them loose from the frame.</span>"
return return

View File

@@ -21,58 +21,19 @@
name = "[material.display_name] wall" name = "[material.display_name] wall"
desc = "It seems to be a section of hull plated with [material.display_name]." desc = "It seems to be a section of hull plated with [material.display_name]."
set_wall_state("[material.icon_base]0")
if(material.opacity > 0.5 && !opacity) if(material.opacity > 0.5 && !opacity)
set_light(1) set_light(1)
else if(material.opacity < 0.5 && opacity) else if(material.opacity < 0.5 && opacity)
set_light(0) set_light(0)
update_connections(1)
update_icon() update_icon()
check_relatives()
/turf/simulated/wall/proc/set_wall_state(var/new_state)
if(!material)
return
if(new_state)
last_state = new_state
else if(last_state)
new_state = last_state
else
return
overlays.Cut()
damage_overlay = 0
if(!wall_cache["[new_state]-[material.icon_colour]"])
var/image/I = image(icon='icons/turf/wall_masks.dmi',icon_state="[new_state]")
I.color = material.icon_colour
wall_cache["[new_state]-[material.icon_colour]"] = I
overlays |= wall_cache["[new_state]-[material.icon_colour]"]
if(reinf_material)
var/cache_key = "[material.icon_reinf]-[reinf_material.icon_colour]"
if(!isnull(construction_stage) && construction_stage<6)
cache_key = "reinf_construct-[reinf_material.icon_colour]-[construction_stage]"
if(!wall_cache[cache_key])
var/image/I
if(!isnull(construction_stage) && construction_stage<6)
I = image(icon='icons/turf/wall_masks.dmi',icon_state="reinf_construct-[construction_stage]")
else
I = image(icon='icons/turf/wall_masks.dmi',icon_state="[material.icon_reinf]")
I.color = reinf_material.icon_colour
wall_cache[cache_key] = I
overlays |= wall_cache[cache_key]
/turf/simulated/wall/proc/set_material(var/material/newmaterial, var/material/newrmaterial) /turf/simulated/wall/proc/set_material(var/material/newmaterial, var/material/newrmaterial)
material = newmaterial material = newmaterial
reinf_material = newrmaterial reinf_material = newrmaterial
update_material() update_material()
check_relatives()
check_relatives(1)
/turf/simulated/wall/proc/update_icon() /turf/simulated/wall/proc/update_icon()
if(!material) if(!material)
@@ -81,16 +42,38 @@
if(!damage_overlays[1]) //list hasn't been populated if(!damage_overlays[1]) //list hasn't been populated
generate_overlays() generate_overlays()
if(density) overlays.Cut()
check_relatives(1) var/image/I
else
set_wall_state("[material.icon_base]fwall_open")
if(damage == 0) if(!density)
if(damage_overlay != 0) I = image('icons/turf/wall_masks.dmi', "[material.icon_base]fwall_open")
overlays -= damage_overlays[damage_overlay] I.color = material.icon_colour
damage_overlay = 0 overlays += I
else if(density) return
for(var/i = 1 to 4)
I = image('icons/turf/wall_masks.dmi', "[material.icon_base][wall_connections[i]]", dir = 1<<(i-1))
I.color = material.icon_colour
overlays += I
if(reinf_material)
if(construction_stage != null && construction_stage < 6)
I = image('icons/turf/wall_masks.dmi', "reinf_construct-[construction_stage]")
I.color = reinf_material.icon_colour
overlays += I
else
if("[reinf_material.icon_reinf]0" in icon_states('icons/turf/wall_masks.dmi'))
// Directional icon
for(var/i = 1 to 4)
I = image('icons/turf/wall_masks.dmi', "[reinf_material.icon_reinf][wall_connections[i]]", dir = 1<<(i-1))
I.color = reinf_material.icon_colour
overlays += I
else
I = image('icons/turf/wall_masks.dmi', reinf_material.icon_reinf)
I.color = reinf_material.icon_colour
overlays += I
if(damage != 0)
var/integrity = material.integrity var/integrity = material.integrity
if(reinf_material) if(reinf_material)
integrity += reinf_material.integrity integrity += reinf_material.integrity
@@ -99,12 +82,7 @@
if(overlay > damage_overlays.len) if(overlay > damage_overlays.len)
overlay = damage_overlays.len overlay = damage_overlays.len
if(damage_overlay && overlay == damage_overlay) //No need to update.
return
if(damage_overlay) overlays -= damage_overlays[damage_overlay]
overlays += damage_overlays[overlay] overlays += damage_overlays[overlay]
damage_overlay = overlay
return return
/turf/simulated/wall/proc/generate_overlays() /turf/simulated/wall/proc/generate_overlays()
@@ -116,25 +94,21 @@
img.alpha = (i * alpha_inc) - 1 img.alpha = (i * alpha_inc) - 1
damage_overlays[i] = img damage_overlays[i] = img
//Smoothwall code. update_self for relativewall(), not for relativewall_neighbors()
/turf/simulated/wall/proc/check_relatives(var/update_self) /turf/simulated/wall/proc/update_connections(propagate = 0)
if(!material) if(!material)
return return
var/junction var/list/dirs = list()
if(update_self) for(var/turf/simulated/wall/W in orange(src, 1))
junction = 0 if(!W.material)
for(var/checkdir in cardinal)
var/turf/simulated/wall/T = get_step(src, checkdir)
if(!istype(T) || !T.material)
continue continue
if(update_self) if(propagate)
if(can_join_with(T)) W.update_connections()
junction |= get_dir(src,T) //Not too sure why, but using checkdir just breaks walls. W.update_icon()
else if(can_join_with(W))
T.check_relatives(1) dirs += get_dir(src, W)
if(!isnull(junction))
set_wall_state("[material.icon_base][junction]") wall_connections = dirs_to_corner_states(dirs)
return
/turf/simulated/wall/proc/can_join_with(var/turf/simulated/wall/W) /turf/simulated/wall/proc/can_join_with(var/turf/simulated/wall/W)
if(material && W.material && material.icon_base == W.material.icon_base) if(material && W.material && material.icon_base == W.material.icon_base)

View File

@@ -1,5 +1,3 @@
var/list/global/wall_cache = list()
/turf/simulated/wall /turf/simulated/wall
name = "wall" name = "wall"
desc = "A huge chunk of metal used to seperate rooms." desc = "A huge chunk of metal used to seperate rooms."
@@ -21,6 +19,8 @@ var/list/global/wall_cache = list()
var/last_state var/last_state
var/construction_stage var/construction_stage
var/list/wall_connections = list("0", "0", "0", "0")
/turf/simulated/wall/New(var/newloc, var/materialtype, var/rmaterialtype) /turf/simulated/wall/New(var/newloc, var/materialtype, var/rmaterialtype)
..(newloc) ..(newloc)
icon_state = "blank" icon_state = "blank"
@@ -171,7 +171,7 @@ var/list/global/wall_cache = list()
clear_plants() clear_plants()
material = get_material_by_name("placeholder") material = get_material_by_name("placeholder")
reinf_material = null reinf_material = null
check_relatives() update_connections(1)
ChangeTurf(/turf/simulated/floor/plating) ChangeTurf(/turf/simulated/floor/plating)

View File

@@ -1401,7 +1401,7 @@ datum/preferences
backbag = backbaglist.Find(new_backbag) backbag = backbaglist.Find(new_backbag)
if("nt_relation") if("nt_relation")
var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed") var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in COMPANY_ALIGNMENTS
if(new_relation) if(new_relation)
nanotrasen_relation = new_relation nanotrasen_relation = new_relation

View File

@@ -275,6 +275,41 @@ BLIND // can't see anything
update_icon(user) update_icon(user)
user.update_action_buttons() user.update_action_buttons()
/obj/item/clothing/head/attack_ai(var/mob/user)
if(!mob_wear_hat(user))
return ..()
/obj/item/clothing/head/attack_generic(var/mob/user)
if(!mob_wear_hat(user))
return ..()
/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user)
if(!Adjacent(user))
return 0
var/success
if(istype(user, /mob/living/silicon/robot/drone))
var/mob/living/silicon/robot/drone/D = user
if(D.hat)
success = 2
else
D.wear_hat(src)
success = 1
else if(istype(user, /mob/living/carbon/alien/diona))
var/mob/living/carbon/alien/diona/D = user
if(D.hat)
success = 2
else
D.wear_hat(src)
success = 1
if(!success)
return 0
else if(success == 2)
user << "<span class='warning'>You are already wearing a hat.</span>"
else if(success == 1)
user << "<span class='notice'>You crawl under \the [src].</span>"
return 1
/obj/item/clothing/head/update_icon(var/mob/user) /obj/item/clothing/head/update_icon(var/mob/user)
overlays.Cut() overlays.Cut()

View File

@@ -21,7 +21,7 @@
name = "mounted grenade launcher" name = "mounted grenade launcher"
desc = "A shoulder-mounted micro-explosive dispenser." desc = "A shoulder-mounted micro-explosive dispenser."
selectable = 1 selectable = 1
icon_state = "grenadelauncher" icon_state = "grenade"
interface_name = "integrated grenade launcher" interface_name = "integrated grenade launcher"
interface_desc = "Discharges loaded grenades against the wearer's location." interface_desc = "Discharges loaded grenades against the wearer's location."

View File

@@ -14,33 +14,207 @@
var/track_blood = 0 var/track_blood = 0
/obj/item/weapon/reagent_containers/glass/rag /obj/item/weapon/reagent_containers/glass/rag
name = "damp rag" name = "rag"
desc = "For cleaning up messes, you suppose." desc = "For cleaning up messes, you suppose."
w_class = 1 w_class = 1
icon = 'icons/obj/toy.dmi' icon = 'icons/obj/toy.dmi'
icon_state = "rag" icon_state = "rag"
amount_per_transfer_from_this = 5 amount_per_transfer_from_this = 5
possible_transfer_amounts = list(5) possible_transfer_amounts = list(5)
volume = 5 volume = 10
can_be_placed_into = null can_be_placed_into = null
flags = OPENCONTAINER | NOBLUDGEON flags = OPENCONTAINER | NOBLUDGEON
var/on_fire = 0
var/burn_time = 20 //if the rag burns for too long it turns to ashes
/obj/item/weapon/reagent_containers/glass/rag/New()
..()
update_name()
/obj/item/weapon/reagent_containers/glass/rag/Destroy()
processing_objects -= src //so we don't continue turning to ash while gc'd
..()
/obj/item/weapon/reagent_containers/glass/rag/attack_self(mob/user as mob) /obj/item/weapon/reagent_containers/glass/rag/attack_self(mob/user as mob)
return if(on_fire)
user.visible_message("<span class='warning'>\The [user] stamps out [src].</span>", "<span class='warning'>You stamp out [src].</span>")
user.unEquip(src)
extinguish()
else
remove_contents(user)
/obj/item/weapon/reagent_containers/glass/rag/attackby(obj/item/W, mob/user)
if(!on_fire && istype(W, /obj/item/weapon/flame))
var/obj/item/weapon/flame/F = W
if(F.lit)
ignite()
if(on_fire)
visible_message("<span class='warning'>\The [user] lights [src] with [W].</span>")
else
user << "<span class='warning'>You manage to singe [src], but fail to light it.</span>"
. = ..()
update_name()
/obj/item/weapon/reagent_containers/glass/rag/proc/update_name()
if(on_fire)
name = "burning [initial(name)]"
else if(reagents.total_volume)
name = "damp [initial(name)]"
else
name = "dry [initial(name)]"
/obj/item/weapon/reagent_containers/glass/rag/update_icon()
if(on_fire)
icon_state = "raglit"
else
icon_state = "rag"
var/obj/item/weapon/reagent_containers/food/drinks/bottle/B = loc
if(istype(B))
B.update_icon()
/obj/item/weapon/reagent_containers/glass/rag/proc/remove_contents(mob/user, atom/trans_dest = null)
if(!trans_dest && !user.loc)
return
if(reagents.total_volume)
var/target_text = trans_dest? "\the [trans_dest]" : "\the [user.loc]"
user.visible_message("<span class='danger'>\The [user] begins to wring out [src] over [target_text].</span>", "<span class='notice'>You begin to wring out [src] over [target_text].</span>")
if(do_after(user, reagents.total_volume*5)) //50 for a fully soaked rag
if(trans_dest)
reagents.trans_to(trans_dest, reagents.total_volume)
else
reagents.splash(user.loc, reagents.total_volume)
user.visible_message("<span class='danger'>\The [user] wrings out [src] over [target_text].</span>", "<span class='notice'>You finish to wringing out [src].</span>")
update_name()
/obj/item/weapon/reagent_containers/glass/rag/proc/wipe_down(atom/A, mob/user)
if(!reagents.total_volume)
user << "<span class='warning'>The [initial(name)] is dry!</span>"
else
user.visible_message("\The [user] starts to wipe down [A] with [src]!")
reagents.splash(A, 1) //get a small amount of liquid on the thing we're wiping.
update_name()
if(do_after(user,30))
user.visible_message("\The [user] finishes wiping off the [A]!")
A.clean_blood()
/obj/item/weapon/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag) /obj/item/weapon/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag)
if(ismob(target) && target.reagents && reagents.total_volume) if(isliving(target))
user.visible_message("\red \The [target] has been smothered with \the [src] by \the [user]!", "\red You smother \the [target] with \the [src]!", "You hear some struggling and muffled cries of surprise") var/mob/living/M = target
reagents.trans_to_mob(target, reagents.total_volume, CHEM_INGEST) if(on_fire)
user.visible_message("<span class='danger'>\The [user] hits [target] with [src]!</span>",)
user.do_attack_animation(src)
M.IgniteMob()
else if(reagents.total_volume)
if(user.zone_sel.selecting == "mouth")
user.do_attack_animation(src)
user.visible_message(
"<span class='danger'>\The [user] smothers [target] with [src]!</span>",
"<span class='warning'>You smother [target] with [src]!</span>",
"You hear some struggling and muffled cries of surprise"
)
//it's inhaled, so... maybe CHEM_BLOOD doesn't make a whole lot of sense but it's the best we can do for now
reagents.trans_to_mob(target, amount_per_transfer_from_this, CHEM_BLOOD)
update_name()
else
wipe_down(target, user)
return return
else
..() return ..()
/obj/item/weapon/reagent_containers/glass/rag/afterattack(atom/A as obj|turf|area, mob/user as mob, proximity) /obj/item/weapon/reagent_containers/glass/rag/afterattack(atom/A as obj|turf|area, mob/user as mob, proximity)
if(!proximity) return if(!proximity)
if(istype(A) && src in user) return
user.visible_message("[user] starts to wipe down [A] with [src]!")
if(do_after(user,30)) if(istype(A, /obj/structure/reagent_dispensers))
user.visible_message("[user] finishes wiping off the [A]!") if(!reagents.get_free_space())
A.clean_blood() user << "<span class='warning'>\The [src] is already soaked.</span>"
return return
if(A.reagents && A.reagents.trans_to_obj(src, reagents.maximum_volume))
user.visible_message("<span class='notice'>\The [user] soaks [src] using [A].</span>", "<span class='notice'>You soak [src] using [A].</span>")
update_name()
return
if(!on_fire && istype(A) && (src in user))
if(A.is_open_container())
remove_contents(user, A)
else if(!ismob(A)) //mobs are handled in attack() - this prevents us from wiping down people while smothering them.
wipe_down(A, user)
return
/obj/item/weapon/reagent_containers/glass/rag/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature >= 50 + T0C)
ignite()
if(exposed_temperature >= 900 + T0C)
new /obj/effect/decal/cleanable/ash(get_turf(src))
qdel(src)
//rag must have a minimum of 2 units welder fuel and at least 80% of the reagents must be welder fuel.
//maybe generalize flammable reagents someday
/obj/item/weapon/reagent_containers/glass/rag/proc/can_ignite()
var/fuel = reagents.get_reagent_amount("fuel")
return (fuel >= 2 && fuel >= reagents.total_volume*0.8)
/obj/item/weapon/reagent_containers/glass/rag/proc/ignite()
if(on_fire)
return
if(!can_ignite())
return
//also copied from matches
if(reagents.get_reagent_amount("phoron")) // the phoron explodes when exposed to fire
visible_message("<span class='danger'>\The [src] conflagrates violently!</span>")
var/datum/effect/effect/system/reagents_explosion/e = new()
e.set_up(round(reagents.get_reagent_amount("phoron") / 2.5, 1), get_turf(src), 0, 0)
e.start()
qdel(src)
return
processing_objects += src
set_light(2, null, "#E38F46")
on_fire = 1
update_name()
update_icon()
/obj/item/weapon/reagent_containers/glass/rag/proc/extinguish()
processing_objects -= src
set_light(0)
on_fire = 0
//rags sitting around with 1 second of burn time left is dumb.
//ensures players always have a few seconds of burn time left when they light their rag
if(burn_time <= 5)
visible_message("<span class='warning'>\The [src] falls apart!</span>")
new /obj/effect/decal/cleanable/ash(get_turf(src))
qdel(src)
update_name()
update_icon()
/obj/item/weapon/reagent_containers/glass/rag/process()
if(!can_ignite())
visible_message("<span class='warning'>\The [src] burns out.</span>")
extinguish()
//copied from matches
if(isliving(loc))
var/mob/living/M = loc
M.IgniteMob()
var/turf/location = get_turf(src)
if(location)
location.hotspot_expose(700, 5)
if(burn_time <= 0)
processing_objects -= src
new /obj/effect/decal/cleanable/ash(location)
qdel(src)
return
reagents.remove_reagent("fuel", reagents.maximum_volume/25)
update_name()
burn_time--

View File

@@ -46,6 +46,15 @@
#define GEAR_EVA 15 #define GEAR_EVA 15
/var/list/economic_species_modifier = list(
/datum/species/human = 10,
/datum/species/skrell = 12,
/datum/species/tajaran = 7,
/datum/species/unathi = 7,
/datum/species/vox = 1
)
//---- The following corporations are friendly with NanoTrasen and loosely enable trade and travel: //---- The following corporations are friendly with NanoTrasen and loosely enable trade and travel:
//Corporation NanoTrasen - Generalised / high tech research and phoron exploitation. //Corporation NanoTrasen - Generalised / high tech research and phoron exploitation.
//Corporation Vessel Contracting - Ship and station construction, materials research. //Corporation Vessel Contracting - Ship and station construction, materials research.

View File

@@ -36,6 +36,20 @@
return return
else else
name = ("bookcase ([newname])") name = ("bookcase ([newname])")
else if(istype(O,/obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
user << (anchored ? "<span class='notice'>You unfasten \the [src] from the floor.</span>" : "<span class='notice'>You secure \the [src] to the floor.</span>")
anchored = !anchored
else if(istype(O,/obj/item/weapon/screwdriver))
playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
user << "<span class='notice'>You begin dismantling \the [src].</span>"
if(do_after(user,25))
user << "<span class='notice'>You dismantle \the [src].</span>"
new /obj/item/stack/material/wood(get_turf(src), amount = 3)
for(var/obj/item/weapon/book/b in contents)
b.loc = (get_turf(src))
qdel(src)
else else
..() ..()
@@ -81,6 +95,7 @@
icon_state = "book-5" icon_state = "book-5"
/obj/structure/bookcase/manuals/medical /obj/structure/bookcase/manuals/medical
name = "Medical Manuals bookcase" name = "Medical Manuals bookcase"

View File

@@ -122,6 +122,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
density = 1 density = 1
var/arcanecheckout = 0 var/arcanecheckout = 0
var/screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book var/screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book
var/sortby = "author"
var/buffer_book var/buffer_book
var/buffer_mob var/buffer_mob
var/upload_category = "Fiction" var/upload_category = "Fiction"
@@ -195,9 +196,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
else else
dat += {"<A href='?src=\ref[src];orderbyid=1'>(Order book by SS<sup>13</sup>BN)</A><BR><BR> dat += {"<A href='?src=\ref[src];orderbyid=1'>(Order book by SS<sup>13</sup>BN)</A><BR><BR>
<table> <table>
<tr><td>AUTHOR</td><td>TITLE</td><td>CATEGORY</td><td></td></tr>"} <tr><td><A href='?src=\ref[src];sort=author>AUTHOR</A></td><td><A href='?src=\ref[src];sort=title>TITLE</A></td><td><A href='?src=\ref[src];sort=category>CATEGORY</A></td><td></td></tr>"}
var/DBQuery/query = dbcon_old.NewQuery("SELECT id, author, title, category FROM library ORDER BY [sortby]")
var/DBQuery/query = dbcon_old.NewQuery("SELECT id, author, title, category FROM library")
query.Execute() query.Execute()
while(query.NextRow()) while(query.NextRow())
@@ -236,7 +236,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
//dat += "<A HREF='?src=\ref[user];mach_close=library'>Close</A><br><br>" //dat += "<A HREF='?src=\ref[user];mach_close=library'>Close</A><br><br>"
user << browse(dat, "window=library") user << browse(dat, "window=library")
onclose(user, "library") onclose(user, "library")
/obj/machinery/librarycomp/emag_act(var/remaining_charges, var/mob/user) /obj/machinery/librarycomp/emag_act(var/remaining_charges, var/mob/user)
if (src.density && !src.emagged) if (src.density && !src.emagged)
src.emagged = 1 src.emagged = 1
@@ -389,6 +389,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
if(isnum(orderid)) if(isnum(orderid))
var/nhref = "src=\ref[src];targetid=[orderid]" var/nhref = "src=\ref[src];targetid=[orderid]"
spawn() src.Topic(nhref, params2list(nhref), src) spawn() src.Topic(nhref, params2list(nhref), src)
if(href_list["sort"] in list("author", "title", "category"))
sortby = href_list["sort"]
src.add_fingerprint(usr) src.add_fingerprint(usr)
src.updateUsrDialog() src.updateUsrDialog()
return return

View File

@@ -21,6 +21,9 @@
if(.) update_light() if(.) update_light()
/atom/proc/copy_light(atom/A)
set_light(A.light_range, A.light_power, A.light_color)
/atom/proc/update_light() /atom/proc/update_light()
if(!light_power || !light_range) if(!light_power || !light_range)
if(light) if(light)

View File

@@ -28,7 +28,7 @@
recipes += new/datum/stack_recipe_list("office chairs",list( \ recipes += new/datum/stack_recipe_list("office chairs",list( \
new/datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1) \ new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1) \
), 5) ))
recipes += new/datum/stack_recipe_list("comfy chairs", list( \ recipes += new/datum/stack_recipe_list("comfy chairs", list( \
new/datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1), \
@@ -39,7 +39,7 @@
new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1), \
), 2) ))
recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1)
@@ -69,7 +69,7 @@
new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1), \
), 4) ))
recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade) recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade)
recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2) recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2)
@@ -86,7 +86,7 @@
/material/sandstone/generate_recipes() /material/sandstone/generate_recipes()
..() ..()
recipes += new/datum/stack_recipe("pile of dirt", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("planting bed", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1)
/material/plastic/generate_recipes() /material/plastic/generate_recipes()
..() ..()
@@ -103,9 +103,10 @@
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20) recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0) recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0)
recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4) recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4)
recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1) recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1)
recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1)
/material/cardboard/generate_recipes() /material/cardboard/generate_recipes()
..() ..()
@@ -124,4 +125,4 @@
new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red), \ new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red), \
new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white), \ new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white), \
new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow), \ new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow), \
), 3) ))

View File

@@ -359,7 +359,7 @@ var/list/name_to_material
weight = 15 weight = 15
door_icon_base = "stone" door_icon_base = "stone"
destruction_desc = "shatters" destruction_desc = "shatters"
window_options = list("One Direction", "Full Window") window_options = list("One Direction" = 1, "Full Window" = 4)
created_window = /obj/structure/window/basic created_window = /obj/structure/window/basic
wire_product = /obj/item/stack/light_w wire_product = /obj/item/stack/light_w
rod_product = /obj/item/stack/material/glass/reinforced rod_product = /obj/item/stack/material/glass/reinforced
@@ -417,9 +417,8 @@ var/list/name_to_material
return 1 return 1
var/build_path = /obj/structure/windoor_assembly var/build_path = /obj/structure/windoor_assembly
var/sheets_needed = 4 var/sheets_needed = window_options[choice]
if(choice == "Windoor") if(choice == "Windoor")
sheets_needed = 5
build_dir = user.dir build_dir = user.dir
else else
build_path = created_window build_path = created_window
@@ -450,7 +449,7 @@ var/list/name_to_material
weight = 30 weight = 30
stack_origin_tech = "materials=2" stack_origin_tech = "materials=2"
composite_material = list(DEFAULT_WALL_MATERIAL = 1875,"glass" = 3750) composite_material = list(DEFAULT_WALL_MATERIAL = 1875,"glass" = 3750)
window_options = list("One Direction", "Full Window", "Windoor") window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 5)
created_window = /obj/structure/window/reinforced created_window = /obj/structure/window/reinforced
wire_product = null wire_product = null
rod_product = null rod_product = null

View File

@@ -318,16 +318,56 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(following && following == target) if(following && following == target)
return return
following = target following = target
src << "\blue Now following [target]" src << "<span class='notice'>Now following [target]</span>"
spawn(0) if(ismob(target))
while(target && following == target && client) loc = get_turf(target)
var/turf/T = get_turf(target) var/mob/M = target
if(!T) M.following_mobs += src
break else
// To stop the ghost flickering. spawn(0)
if(loc != T) while(target && following == target && client)
loc = T var/turf/T = get_turf(target)
sleep(15) if(!T)
break
// To stop the ghost flickering.
if(loc != T)
loc = T
sleep(15)
/mob/proc/update_following()
. = get_turf(src)
for(var/mob/dead/observer/M in following_mobs)
if(M.following != src)
following_mobs -= M
else
if(M.loc != .)
M.loc = .
/mob
var/list/following_mobs = list()
/mob/Destroy()
for(var/mob/dead/observer/M in following_mobs)
M.following = null
following_mobs = null
return ..()
/mob/dead/observer/Destroy()
if(ismob(following))
var/mob/M = following
M.following_mobs -= src
following = null
return ..()
/mob/Move()
. = ..()
if(.)
update_following()
/mob/Life()
// to catch teleports etc which directly set loc
update_following()
return ..()
/mob/proc/check_holy(var/turf/T) /mob/proc/check_holy(var/turf/T)
return 0 return 0

View File

@@ -0,0 +1,56 @@
/var/list/gender_datums = list()
/hook/startup/proc/populate_gender_datum_list()
for(var/type in typesof(/datum/gender))
var/datum/gender/G = new type
gender_datums[G.key] = G
return 1
/datum/gender
var/key = "plural"
var/He = "They"
var/he = "they"
var/His = "Their"
var/his = "their"
var/him = "them"
var/has = "have"
var/is = "are"
var/does = "do"
/datum/gender/male
key = "male"
He = "He"
he = "he"
His = "His"
his = "his"
him = "him"
has = "has"
is = "is"
does = "does"
/datum/gender/female
key = "female"
He = "She"
he = "she"
His = "Her"
his = "her"
him = "her"
has = "has"
is = "is"
does = "does"
/datum/gender/neuter
key = "neuter"
He = "It"
he = "it"
His = "Its"
his = "its"
him = "it"
has = "has"
is = "is"
does = "does"

View File

@@ -5,10 +5,12 @@
icon = 'icons/obj/objects.dmi' icon = 'icons/obj/objects.dmi'
slot_flags = SLOT_HEAD slot_flags = SLOT_HEAD
sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi') sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi')
origin_tech = null
item_icons = list( item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_holder.dmi', slot_l_hand_str = 'icons/mob/items/lefthand_holder.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_holder.dmi', slot_r_hand_str = 'icons/mob/items/righthand_holder.dmi',
) )
pixel_y = 8
/obj/item/weapon/holder/New() /obj/item/weapon/holder/New()
..() ..()
@@ -31,6 +33,38 @@
qdel(src) qdel(src)
/obj/item/weapon/holder/proc/sync(var/mob/living/M)
dir = 2
overlays.Cut()
icon = M.icon
icon_state = M.icon_state
color = M.color
name = M.name
desc = M.desc
overlays |= M.overlays
var/mob/living/carbon/human/H = loc
if(istype(H))
if(H.l_hand == src)
H.update_inv_l_hand()
else if(H.r_hand == src)
H.update_inv_r_hand()
else
H.regenerate_icons()
//Mob specific holders.
/obj/item/weapon/holder/diona
origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 5)
slot_flags = SLOT_HEAD | SLOT_OCLOTHING
/obj/item/weapon/holder/drone
origin_tech = list(TECH_MAGNET = 3, TECH_ENGINERING = 5)
/obj/item/weapon/holder/mouse
w_class = 1
/obj/item/weapon/holder/borer
origin_tech = list(TECH_BIO = 6)
/obj/item/weapon/holder/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/item/weapon/holder/attackby(obj/item/weapon/W as obj, mob/user as mob)
for(var/mob/M in src.contents) for(var/mob/M in src.contents)
M.attackby(W,user) M.attackby(W,user)
@@ -50,72 +84,5 @@
grabber << "You scoop up [src]." grabber << "You scoop up [src]."
src << "[grabber] scoops you up." src << "[grabber] scoops you up."
grabber.status_flags |= PASSEMOTES grabber.status_flags |= PASSEMOTES
H.sync(src)
return H return H
//Mob specific holders.
/obj/item/weapon/holder/diona
name = "diona nymph"
desc = "It's a tiny plant critter."
icon_state = "nymph"
origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 5)
slot_flags = SLOT_HEAD | SLOT_OCLOTHING
/obj/item/weapon/holder/drone
name = "maintenance drone"
desc = "It's a small maintenance robot."
icon_state = "drone"
origin_tech = list(TECH_MAGNET = 3, TECH_ENGINERING = 5)
/obj/item/weapon/holder/cat
name = "cat"
desc = "It's a cat. Meow."
icon_state = "cat"
origin_tech = null
/obj/item/weapon/holder/mouse
name = "mouse"
desc = "It's a small rodent."
icon_state = "mouse_gray"
origin_tech = null
w_class = 1
/obj/item/weapon/holder/mouse/gray
icon_state = "mouse_gray"
/obj/item/weapon/holder/mouse/white
icon_state = "mouse_white"
/obj/item/weapon/holder/mouse/brown
icon_state = "mouse_brown"
/obj/item/weapon/holder/borer
name = "cortical borer"
desc = "It's a slimy brain slug. Gross."
icon_state = "borer"
origin_tech = list(TECH_BIO = 6)
/obj/item/weapon/holder/monkey
name = "monkey"
desc = "It's a monkey. Ook."
icon_state = "monkey"
/obj/item/weapon/holder/monkey/farwa
name = "farwa"
desc = "It's a farwa."
icon_state = "farwa"
/obj/item/weapon/holder/monkey/stok
name = "stok"
desc = "It's a stok. stok."
icon_state = "stok"
/obj/item/weapon/holder/monkey/neaera
name = "neaera"
desc = "It's a neaera."
icon_state = "neara"
/obj/item/weapon/holder/pai
name = "pAI"
desc = "It's a little robot."
icon_state = "pai"

View File

@@ -9,6 +9,7 @@
universal_understand = 1 universal_understand = 1
universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea. universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea.
holder_type = /obj/item/weapon/holder/diona holder_type = /obj/item/weapon/holder/diona
var/obj/item/hat
/mob/living/carbon/alien/diona/New() /mob/living/carbon/alien/diona/New()
@@ -32,3 +33,10 @@
/mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands. /mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands.
W.loc = get_turf(src) W.loc = get_turf(src)
return 1 return 1
/mob/living/carbon/alien/diona/proc/wear_hat(var/obj/item/new_hat)
if(hat)
return
hat = new_hat
new_hat.loc = src
update_icons()

View File

@@ -6,5 +6,22 @@
return return
get_scooped(H) get_scooped(H)
return return
else if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand))
hat.loc = get_turf(src)
H.put_in_hands(hat)
H.visible_message("<span class='danger'>\The [H] removes \the [src]'s [hat].</span>")
hat = null
update_icons()
else else
return ..() return ..()
/mob/living/carbon/alien/diona/attackby(var/obj/item/weapon/W, var/mob/user)
if(user.a_intent == "help" && istype(W, /obj/item/clothing/head))
if(hat)
user << "<span class='warning'>\The [src] is already wearing \the [hat].</span>"
return
user.unEquip(W)
wear_hat(W)
user.visible_message("<span class='notice'>\The [user] puts \the [W] on \the [src].</span>")
return
return ..()

View File

@@ -6,3 +6,7 @@
icon_state = "[initial(icon_state)]_sleep" icon_state = "[initial(icon_state)]_sleep"
else else
icon_state = "[initial(icon_state)]" icon_state = "[initial(icon_state)]"
overlays.Cut()
if(hat)
overlays |= get_hat_icon(hat, 0, -8)

View File

@@ -17,6 +17,9 @@
germ_level++ germ_level++
/mob/living/carbon/Destroy() /mob/living/carbon/Destroy()
qdel(ingested)
qdel(touching)
// We don't qdel(bloodstr) because it's the same as qdel(reagents)
for(var/guts in internal_organs) for(var/guts in internal_organs)
qdel(guts) qdel(guts)
for(var/food in stomach_contents) for(var/food in stomach_contents)

View File

@@ -24,46 +24,18 @@
if(wear_mask) if(wear_mask)
skipface |= wear_mask.flags_inv & HIDEFACE skipface |= wear_mask.flags_inv & HIDEFACE
// crappy hacks because you can't do \his[src] etc. I'm sorry this proc is so unreadable, blame the text macros :<
var/t_He = "They" //capitalised for use at the start of each line.
var/t_he = "they"
var/t_his = "their"
var/t_him = "them"
var/t_has = "have"
var/t_is = "are"
var/t_does = "do"
var/msg = "<span class='info'>*---------*\nThis is " var/msg = "<span class='info'>*---------*\nThis is "
//big suits/masks/helmets make it hard to tell their gender var/datum/gender/T = gender_datums[gender]
if(!skipjumpsuit || !skipface) if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender
T = gender_datums[PLURAL]
else
if(icon) if(icon)
msg += "\icon[icon] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated msg += "\icon[icon] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated
switch(gender)
if(MALE) if(!T)
t_He = "He" // Just in case someone VVs the gender to something strange. It'll runtime anyway when it hits usages, better to CRASH() now with a helpful message.
t_he = "he" CRASH("Gender datum was null; key was '[(skipjumpsuit && skipface) ? PLURAL : gender]'")
t_his = "his"
t_him = "him"
t_has = "has"
t_is = "is"
t_does = "does"
if(FEMALE)
t_He = "She"
t_he = "she"
t_his = "her"
t_him = "her"
t_has = "has"
t_is = "is"
t_does = "does"
if(NEUTER)
t_He = "It"
t_he = "it"
t_his = "its"
t_him = "it"
t_has = "has"
t_is = "is"
t_does = "does"
msg += "<EM>[src.name]</EM>" msg += "<EM>[src.name]</EM>"
if(species.name != "Human") if(species.name != "Human")
@@ -80,111 +52,111 @@
tie_msg += ". Attached to it is [lowertext(english_list(U.accessories))]" tie_msg += ". Attached to it is [lowertext(english_list(U.accessories))]"
if(w_uniform.blood_DNA) if(w_uniform.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != "#030303") ? "blood" : "oil"]-stained [w_uniform.name][tie_msg]!</span>\n" msg += "<span class='warning'>[T.He] [T.is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != "#030303") ? "blood" : "oil"]-stained [w_uniform.name][tie_msg]!</span>\n"
else else
msg += "[t_He] [t_is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].\n" msg += "[T.He] [T.is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].\n"
//head //head
if(head) if(head)
if(head.blood_DNA) if(head.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] [(head.blood_color != "#030303") ? "blood" : "oil"]-stained [head.name] on [t_his] head!</span>\n" msg += "<span class='warning'>[T.He] [T.is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] [(head.blood_color != "#030303") ? "blood" : "oil"]-stained [head.name] on [T.his] head!</span>\n"
else else
msg += "[t_He] [t_is] wearing \icon[head] \a [head] on [t_his] head.\n" msg += "[T.He] [T.is] wearing \icon[head] \a [head] on [T.his] head.\n"
//suit/armour //suit/armour
if(wear_suit) if(wear_suit)
if(wear_suit.blood_DNA) if(wear_suit.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_suit.name]!</span>\n" msg += "<span class='warning'>[T.He] [T.is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_suit.name]!</span>\n"
else else
msg += "[t_He] [t_is] wearing \icon[wear_suit] \a [wear_suit].\n" msg += "[T.He] [T.is] wearing \icon[wear_suit] \a [wear_suit].\n"
//suit/armour storage //suit/armour storage
if(s_store && !skipsuitstorage) if(s_store && !skipsuitstorage)
if(s_store.blood_DNA) if(s_store.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != "#030303") ? "blood" : "oil"]-stained [s_store.name] on [t_his] [wear_suit.name]!</span>\n" msg += "<span class='warning'>[T.He] [T.is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != "#030303") ? "blood" : "oil"]-stained [s_store.name] on [T.his] [wear_suit.name]!</span>\n"
else else
msg += "[t_He] [t_is] carrying \icon[s_store] \a [s_store] on [t_his] [wear_suit.name].\n" msg += "[T.He] [T.is] carrying \icon[s_store] \a [s_store] on [T.his] [wear_suit.name].\n"
//back //back
if(back) if(back)
if(back.blood_DNA) if(back.blood_DNA)
msg += "<span class='warning'>[t_He] [t_has] \icon[back] [back.gender==PLURAL?"some":"a"] [(back.blood_color != "#030303") ? "blood" : "oil"]-stained [back] on [t_his] back.</span>\n" msg += "<span class='warning'>[T.He] [T.has] \icon[back] [back.gender==PLURAL?"some":"a"] [(back.blood_color != "#030303") ? "blood" : "oil"]-stained [back] on [T.his] back.</span>\n"
else else
msg += "[t_He] [t_has] \icon[back] \a [back] on [t_his] back.\n" msg += "[T.He] [T.has] \icon[back] \a [back] on [T.his] back.\n"
//left hand //left hand
if(l_hand) if(l_hand)
if(l_hand.blood_DNA) if(l_hand.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [l_hand.name] in [t_his] left hand!</span>\n" msg += "<span class='warning'>[T.He] [T.is] holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [l_hand.name] in [T.his] left hand!</span>\n"
else else
msg += "[t_He] [t_is] holding \icon[l_hand] \a [l_hand] in [t_his] left hand.\n" msg += "[T.He] [T.is] holding \icon[l_hand] \a [l_hand] in [T.his] left hand.\n"
//right hand //right hand
if(r_hand) if(r_hand)
if(r_hand.blood_DNA) if(r_hand.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [r_hand.name] in [t_his] right hand!</span>\n" msg += "<span class='warning'>[T.He] [T.is] holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [r_hand.name] in [T.his] right hand!</span>\n"
else else
msg += "[t_He] [t_is] holding \icon[r_hand] \a [r_hand] in [t_his] right hand.\n" msg += "[T.He] [T.is] holding \icon[r_hand] \a [r_hand] in [T.his] right hand.\n"
//gloves //gloves
if(gloves && !skipgloves) if(gloves && !skipgloves)
if(gloves.blood_DNA) if(gloves.blood_DNA)
msg += "<span class='warning'>[t_He] [t_has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained [gloves.name] on [t_his] hands!</span>\n" msg += "<span class='warning'>[T.He] [T.has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands!</span>\n"
else else
msg += "[t_He] [t_has] \icon[gloves] \a [gloves] on [t_his] hands.\n" msg += "[T.He] [T.has] \icon[gloves] \a [gloves] on [T.his] hands.\n"
else if(blood_DNA) else if(blood_DNA)
msg += "<span class='warning'>[t_He] [t_has] [(hand_blood_color != "#030303") ? "blood" : "oil"]-stained hands!</span>\n" msg += "<span class='warning'>[T.He] [T.has] [(hand_blood_color != "#030303") ? "blood" : "oil"]-stained hands!</span>\n"
//handcuffed? //handcuffed?
//handcuffed? //handcuffed?
if(handcuffed) if(handcuffed)
if(istype(handcuffed, /obj/item/weapon/handcuffs/cable)) if(istype(handcuffed, /obj/item/weapon/handcuffs/cable))
msg += "<span class='warning'>[t_He] [t_is] \icon[handcuffed] restrained with cable!</span>\n" msg += "<span class='warning'>[T.He] [T.is] \icon[handcuffed] restrained with cable!</span>\n"
else else
msg += "<span class='warning'>[t_He] [t_is] \icon[handcuffed] handcuffed!</span>\n" msg += "<span class='warning'>[T.He] [T.is] \icon[handcuffed] handcuffed!</span>\n"
//buckled //buckled
if(buckled) if(buckled)
msg += "<span class='warning'>[t_He] [t_is] \icon[buckled] buckled to [buckled]!</span>\n" msg += "<span class='warning'>[T.He] [T.is] \icon[buckled] buckled to [buckled]!</span>\n"
//belt //belt
if(belt) if(belt)
if(belt.blood_DNA) if(belt.blood_DNA)
msg += "<span class='warning'>[t_He] [t_has] \icon[belt] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != "#030303") ? "blood" : "oil"]-stained [belt.name] about [t_his] waist!</span>\n" msg += "<span class='warning'>[T.He] [T.has] \icon[belt] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != "#030303") ? "blood" : "oil"]-stained [belt.name] about [T.his] waist!</span>\n"
else else
msg += "[t_He] [t_has] \icon[belt] \a [belt] about [t_his] waist.\n" msg += "[T.He] [T.has] \icon[belt] \a [belt] about [T.his] waist.\n"
//shoes //shoes
if(shoes && !skipshoes) if(shoes && !skipshoes)
if(shoes.blood_DNA) if(shoes.blood_DNA)
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != "#030303") ? "blood" : "oil"]-stained [shoes.name] on [t_his] feet!</span>\n" msg += "<span class='warning'>[T.He] [T.is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != "#030303") ? "blood" : "oil"]-stained [shoes.name] on [T.his] feet!</span>\n"
else else
msg += "[t_He] [t_is] wearing \icon[shoes] \a [shoes] on [t_his] feet.\n" msg += "[T.He] [T.is] wearing \icon[shoes] \a [shoes] on [T.his] feet.\n"
else if(feet_blood_DNA) else if(feet_blood_DNA)
msg += "<span class='warning'>[t_He] [t_has] [(feet_blood_color != "#030303") ? "blood" : "oil"]-stained feet!</span>\n" msg += "<span class='warning'>[T.He] [T.has] [(feet_blood_color != "#030303") ? "blood" : "oil"]-stained feet!</span>\n"
//mask //mask
if(wear_mask && !skipmask) if(wear_mask && !skipmask)
if(wear_mask.blood_DNA) if(wear_mask.blood_DNA)
msg += "<span class='warning'>[t_He] [t_has] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_mask.name] on [t_his] face!</span>\n" msg += "<span class='warning'>[T.He] [T.has] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_mask.name] on [T.his] face!</span>\n"
else else
msg += "[t_He] [t_has] \icon[wear_mask] \a [wear_mask] on [t_his] face.\n" msg += "[T.He] [T.has] \icon[wear_mask] \a [wear_mask] on [T.his] face.\n"
//eyes //eyes
if(glasses && !skipeyes) if(glasses && !skipeyes)
if(glasses.blood_DNA) if(glasses.blood_DNA)
msg += "<span class='warning'>[t_He] [t_has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != "#030303") ? "blood" : "oil"]-stained [glasses] covering [t_his] eyes!</span>\n" msg += "<span class='warning'>[T.He] [T.has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != "#030303") ? "blood" : "oil"]-stained [glasses] covering [T.his] eyes!</span>\n"
else else
msg += "[t_He] [t_has] \icon[glasses] \a [glasses] covering [t_his] eyes.\n" msg += "[T.He] [T.has] \icon[glasses] \a [glasses] covering [T.his] eyes.\n"
//left ear //left ear
if(l_ear && !skipears) if(l_ear && !skipears)
msg += "[t_He] [t_has] \icon[l_ear] \a [l_ear] on [t_his] left ear.\n" msg += "[T.He] [T.has] \icon[l_ear] \a [l_ear] on [T.his] left ear.\n"
//right ear //right ear
if(r_ear && !skipears) if(r_ear && !skipears)
msg += "[t_He] [t_has] \icon[r_ear] \a [r_ear] on [t_his] right ear.\n" msg += "[T.He] [T.has] \icon[r_ear] \a [r_ear] on [T.his] right ear.\n"
//ID //ID
if(wear_id) if(wear_id)
@@ -196,70 +168,71 @@
var/obj/item/weapon/card/id/idcard = wear_id var/obj/item/weapon/card/id/idcard = wear_id
id = idcard.registered_name id = idcard.registered_name
if(id && (id != real_name) && (get_dist(src, usr) <= 1) && prob(10)) if(id && (id != real_name) && (get_dist(src, usr) <= 1) && prob(10))
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[wear_id] \a [wear_id] yet something doesn't seem right...</span>\n" msg += "<span class='warning'>[T.He] [T.is] wearing \icon[wear_id] \a [wear_id] yet something doesn't seem right...</span>\n"
else*/ else*/
msg += "[t_He] [t_is] wearing \icon[wear_id] \a [wear_id].\n" msg += "[T.He] [T.is] wearing \icon[wear_id] \a [wear_id].\n"
//Jitters //Jitters
if(is_jittery) if(is_jittery)
if(jitteriness >= 300) if(jitteriness >= 300)
msg += "<span class='warning'><B>[t_He] [t_is] convulsing violently!</B></span>\n" msg += "<span class='warning'><B>[T.He] [T.is] convulsing violently!</B></span>\n"
else if(jitteriness >= 200) else if(jitteriness >= 200)
msg += "<span class='warning'>[t_He] [t_is] extremely jittery.</span>\n" msg += "<span class='warning'>[T.He] [T.is] extremely jittery.</span>\n"
else if(jitteriness >= 100) else if(jitteriness >= 100)
msg += "<span class='warning'>[t_He] [t_is] twitching ever so slightly.</span>\n" msg += "<span class='warning'>[T.He] [T.is] twitching ever so slightly.</span>\n"
//splints //splints
for(var/organ in list("l_leg","r_leg","l_arm","r_arm")) for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
var/obj/item/organ/external/o = get_organ(organ) var/obj/item/organ/external/o = get_organ(organ)
if(o && o.status & ORGAN_SPLINTED) if(o && o.status & ORGAN_SPLINTED)
msg += "<span class='warning'>[t_He] [t_has] a splint on [t_his] [o.name]!</span>\n" msg += "<span class='warning'>[T.He] [T.has] a splint on [T.his] [o.name]!</span>\n"
if(suiciding) if(suiciding)
msg += "<span class='warning'>[t_He] appears to have commited suicide... there is no hope of recovery.</span>\n" msg += "<span class='warning'>[T.He] appears to have commited suicide... there is no hope of recovery.</span>\n"
if(mSmallsize in mutations) if(mSmallsize in mutations)
msg += "[t_He] [t_is] small halfling!\n" msg += "[T.He] [T.is] small halfling!\n"
var/distance = get_dist(usr,src) var/distance = get_dist(usr,src)
if(istype(usr, /mob/dead/observer) || usr.stat == 2) // ghosts can see anything if(istype(usr, /mob/dead/observer) || usr.stat == 2) // ghosts can see anything
distance = 1 distance = 1
if (src.stat) if (src.stat)
msg += "<span class='warning'>[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.</span>\n" msg += "<span class='warning'>[T.He] [T.is]n't responding to anything around [T.him] and seems to be asleep.</span>\n"
if((stat == 2 || src.losebreath) && distance <= 3) if((stat == 2 || src.losebreath) && distance <= 3)
msg += "<span class='warning'>[t_He] [t_does] not appear to be breathing.</span>\n" msg += "<span class='warning'>[T.He] [T.does] not appear to be breathing.</span>\n"
if(istype(usr, /mob/living/carbon/human) && !usr.stat && Adjacent(usr)) if(istype(usr, /mob/living/carbon/human) && !usr.stat && Adjacent(usr))
usr.visible_message("<b>[usr]</b> checks [src]'s pulse.", "You check [src]'s pulse.") usr.visible_message("<b>[usr]</b> checks [src]'s pulse.", "You check [src]'s pulse.")
spawn(15) spawn(15)
if(distance <= 1 && usr.stat != 1) if(distance <= 1 && usr.stat != 1)
if(pulse == PULSE_NONE) if(pulse == PULSE_NONE)
usr << "<span class='deadsay'>[t_He] [t_has] no pulse[src.client ? "" : " and [t_his] soul has departed"]...</span>" usr << "<span class='deadsay'>[T.He] [T.has] no pulse[src.client ? "" : " and [T.his] soul has departed"]...</span>"
else else
usr << "<span class='deadsay'>[t_He] [t_has] a pulse!</span>" usr << "<span class='deadsay'>[T.He] [T.has] a pulse!</span>"
if(fire_stacks) if(fire_stacks)
msg += "[t_He] [t_is] covered in some liquid.\n" msg += "[T.He] [T.is] covered in some liquid.\n"
if(on_fire) if(on_fire)
msg += "<span class='warning'>[t_He] [t_is] on fire!.</span>\n" msg += "<span class='warning'>[T.He] [T.is] on fire!.</span>\n"
msg += "<span class='warning'>" msg += "<span class='warning'>"
if(nutrition < 100) if(nutrition < 100)
msg += "[t_He] [t_is] severely malnourished.\n" msg += "[T.He] [T.is] severely malnourished.\n"
else if(nutrition >= 500) else if(nutrition >= 500)
/*if(usr.nutrition < 100) /*if(usr.nutrition < 100)
msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n" msg += "[T.He] [T.is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
else*/ else*/
msg += "[t_He] [t_is] quite chubby.\n" msg += "[T.He] [T.is] quite chubby.\n"
msg += "</span>" msg += "</span>"
if(getBrainLoss() >= 60) if(getBrainLoss() >= 60)
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n" msg += "[T.He] [T.has] a stupid expression on [T.his] face.\n"
if(species.show_ssd && (!species.has_organ["brain"] || has_brain()) && stat != DEAD) if(species.show_ssd && (!species.has_organ["brain"] || has_brain()) && stat != DEAD)
if(!key) if(!key)
msg += "<span class='deadsay'>[t_He] [t_is] fast asleep. It doesn't look like [t_he] [t_is] waking up anytime soon.</span>\n" msg += "<span class='deadsay'>[T.He] [T.is] [species.show_ssd]. It doesn't look like [T.he] [T.is] waking up anytime soon.</span>\n"
else if(!client) else if(!client)
msg += "<span class='deadsay'>[t_He] [t_is] [species.show_ssd].</span>\n" msg += "<span class='deadsay'>[T.He] [T.is] [species.show_ssd].</span>\n"
var/list/wound_flavor_text = list() var/list/wound_flavor_text = list()
var/list/is_destroyed = list() var/list/is_destroyed = list()
@@ -273,9 +246,9 @@
var/obj/item/organ/external/E = organs_by_name[organ_tag] var/obj/item/organ/external/E = organs_by_name[organ_tag]
if(!E) if(!E)
wound_flavor_text["[organ_descriptor]"] = "<span class='warning'><b>[t_He] is missing [t_his] [organ_descriptor].</b></span>\n" wound_flavor_text["[organ_descriptor]"] = "<span class='warning'><b>[T.He] [T.is] missing [T.his] [organ_descriptor].</b></span>\n"
else if(E.is_stump()) else if(E.is_stump())
wound_flavor_text["[organ_descriptor]"] = "<span class='warning'><b>[t_He] has a stump where [t_his] [organ_descriptor] should be.</b></span>\n" wound_flavor_text["[organ_descriptor]"] = "<span class='warning'><b>[T.He] [T.has] a stump where [T.his] [organ_descriptor] should be.</b></span>\n"
else else
is_destroyed["organ_descriptor"] = 0 is_destroyed["organ_descriptor"] = 0
continue continue
@@ -284,24 +257,24 @@
if(temp) if(temp)
if(temp.status & ORGAN_DESTROYED) if(temp.status & ORGAN_DESTROYED)
is_destroyed["[temp.name]"] = 1 is_destroyed["[temp.name]"] = 1
wound_flavor_text["[temp.name]"] = "<span class='warning'><b>[t_He] [t_is] missing [t_his] [temp.name].</b></span>\n" wound_flavor_text["[temp.name]"] = "<span class='warning'><b>[T.He] [T.is] missing [T.his] [temp.name].</b></span>\n"
continue continue
if(temp.status & ORGAN_ROBOT) if(temp.status & ORGAN_ROBOT)
if(!(temp.brute_dam + temp.burn_dam)) if(!(temp.brute_dam + temp.burn_dam))
wound_flavor_text["[temp.name]"] = "<span class='warning'>[t_He] has a robot [temp.name]!</span>\n" wound_flavor_text["[temp.name]"] = "<span class='warning'>[T.He] [T.has] a robot [temp.name]!</span>\n"
continue continue
else else
wound_flavor_text["[temp.name]"] = "<span class='warning'>[t_He] has a robot [temp.name]. It has[temp.get_wounds_desc()]!</span>\n" wound_flavor_text["[temp.name]"] = "<span class='warning'>[T.He] [T.has] a robot [temp.name]. It has[temp.get_wounds_desc()]!</span>\n"
else if(temp.wounds.len > 0 || temp.open) else if(temp.wounds.len > 0 || temp.open)
wound_flavor_text["[temp.name]"] = "<span class='warning'>[t_He] has [temp.get_wounds_desc()] on [t_his] [temp.name].</span><br>" wound_flavor_text["[temp.name]"] = "<span class='warning'>[T.He] [T.has] [temp.get_wounds_desc()] on [T.his] [temp.name].</span><br>"
if(temp.status & ORGAN_BLEEDING) if(temp.status & ORGAN_BLEEDING)
is_bleeding["[temp.name]"] = "<span class='danger'>[capitalize(t_his)] [temp.name] is bleeding!</span><br>" is_bleeding["[temp.name]"] = "<span class='danger'>[T.His] [temp.name] is bleeding!</span><br>"
else else
wound_flavor_text["[temp.name]"] = "" wound_flavor_text["[temp.name]"] = ""
if(temp.dislocated == 2) if(temp.dislocated == 2)
wound_flavor_text["[temp.name]"] += "<span class='warning'>[capitalize(t_his)] [temp.joint] is dislocated!</span><br>" wound_flavor_text["[temp.name]"] += "<span class='warning'>[T.His] [temp.joint] is dislocated!</span><br>"
if(((temp.status & ORGAN_BROKEN) && temp.brute_dam > temp.min_broken_damage) || (temp.status & ORGAN_MUTATED)) if(((temp.status & ORGAN_BROKEN) && temp.brute_dam > temp.min_broken_damage) || (temp.status & ORGAN_MUTATED))
wound_flavor_text["[temp.name]"] += "<span class='warning'>[capitalize(t_his)] [temp.name] is dented and swollen!</span><br>" wound_flavor_text["[temp.name]"] += "<span class='warning'>[T.His] [temp.name] is dented and swollen!</span><br>"
//Handles the text strings being added to the actual description. //Handles the text strings being added to the actual description.
//If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext. //If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.
@@ -318,7 +291,7 @@
if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas))))) if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas)))))
msg += wound_flavor_text["head"] msg += wound_flavor_text["head"]
else if(is_bleeding["head"]) else if(is_bleeding["head"])
msg += "<span class='warning'>[src] [t_has] blood running down [t_his] face!</span>\n" msg += "<span class='warning'>[src] [T.has] blood running down [T.his] face!</span>\n"
if(wound_flavor_text["upper body"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you. if(wound_flavor_text["upper body"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you.
msg += wound_flavor_text["upper body"] msg += wound_flavor_text["upper body"]
@@ -369,11 +342,11 @@
display_shoes = 1 display_shoes = 1
if(display_chest) if(display_chest)
msg += "<span class='danger'>[src] [t_has] blood soaking through from under [t_his] clothing!</span>\n" msg += "<span class='danger'>[src] [T.has] blood soaking through from under [T.his] clothing!</span>\n"
if(display_shoes) if(display_shoes)
msg += "<span class='danger'>[src] [t_has] blood running from [t_his] shoes!</span>\n" msg += "<span class='danger'>[src] [T.has] blood running from [T.his] shoes!</span>\n"
if(display_gloves) if(display_gloves)
msg += "<span class='danger'>[src] [t_has] blood running from under [t_his] gloves!</span>\n" msg += "<span class='danger'>[src] [T.has] blood running from under [T.his] gloves!</span>\n"
*/ */
for(var/limb in wound_flavor_text) for(var/limb in wound_flavor_text)
@@ -382,9 +355,9 @@
for(var/limb in is_bleeding) for(var/limb in is_bleeding)
msg += is_bleeding[limb] msg += is_bleeding[limb]
for(var/implant in get_visible_implants(0)) for(var/implant in get_visible_implants(0))
msg += "<span class='danger'>[src] [t_has] \a [implant] sticking out of [t_his] flesh!</span>\n" msg += "<span class='danger'>[src] [T.has] \a [implant] sticking out of [T.his] flesh!</span>\n"
if(digitalcamo) if(digitalcamo)
msg += "[t_He] [t_is] repulsively uncanny!\n" msg += "[T.He] [T.is] repulsively uncanny!\n"
if(hasHUD(usr,"security")) if(hasHUD(usr,"security"))
var/perpname = "wot" var/perpname = "wot"
@@ -438,7 +411,7 @@
if (pose) if (pose)
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 ) if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
pose = addtext(pose,".") //Makes sure all emotes end with a period. pose = addtext(pose,".") //Makes sure all emotes end with a period.
msg += "\n[t_He] [t_is] [pose]" msg += "\n[T.He] [T.is] [pose]"
user << msg user << msg

View File

@@ -207,8 +207,7 @@
/mob/living/carbon/human/show_inv(mob/user as mob) /mob/living/carbon/human/show_inv(mob/user as mob)
// TODO : Change to incapacitated() on merge. if(user.incapacitated())
if(user.stat || user.lying || user.resting || user.buckled)
return return
var/obj/item/clothing/under/suit = null var/obj/item/clothing/under/suit = null
@@ -1023,23 +1022,29 @@
return(visible_implants) return(visible_implants)
/mob/living/carbon/human/embedded_needs_process()
for(var/obj/item/organ/external/organ in src.organs)
for(var/obj/item/O in organ.implants)
if(!istype(O, /obj/item/weapon/implant)) //implant type items do not cause embedding effects, see handle_embedded_objects()
return 1
return 0
/mob/living/carbon/human/proc/handle_embedded_objects() /mob/living/carbon/human/proc/handle_embedded_objects()
for(var/obj/item/organ/external/organ in src.organs) for(var/obj/item/organ/external/organ in src.organs)
if(organ.status & ORGAN_SPLINTED) //Splints prevent movement. if(organ.status & ORGAN_SPLINTED) //Splints prevent movement.
continue continue
for(var/obj/item/weapon/O in organ.implants) for(var/obj/item/O in organ.implants)
if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad. if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad.
// All kinds of embedded objects cause bleeding. // All kinds of embedded objects cause bleeding.
var/msg = null if(species.flags & NO_PAIN)
switch(rand(1,3)) src << "<span class='warning'>You feel [O] moving inside your [organ.name].</span>"
if(1) else
msg ="<span class='warning'>A spike of pain jolts your [organ.name] as you bump [O] inside.</span>" var/msg = pick( \
if(2) "<span class='warning'>A spike of pain jolts your [organ.name] as you bump [O] inside.</span>", \
msg ="<span class='warning'>Your movement jostles [O] in your [organ.name] painfully.</span>" "<span class='warning'>Your movement jostles [O] in your [organ.name] painfully.</span>", \
if(3) "<span class='warning'>Your movement jostles [O] in your [organ.name] painfully.</span>")
msg ="<span class='warning'>[O] in your [organ.name] twists painfully as you move.</span>" src << msg
src << msg
organ.take_damage(rand(1,3), 0, 0) organ.take_damage(rand(1,3), 0, 0)
if(!(organ.status & ORGAN_ROBOT) && !(species.flags & NO_BLOOD)) //There is no blood in protheses. if(!(organ.status & ORGAN_ROBOT) && !(species.flags & NO_BLOOD)) //There is no blood in protheses.

View File

@@ -134,28 +134,29 @@
continue continue
if(E.is_broken() || E.is_dislocated()) if(E.is_broken() || E.is_dislocated())
if(E.body_part == HAND_LEFT) switch(E.body_part)
if(!l_hand) if(HAND_LEFT, ARM_LEFT)
continue if(!l_hand)
drop_from_inventory(l_hand) continue
else drop_from_inventory(l_hand)
if(!r_hand) if(HAND_RIGHT, ARM_RIGHT)
continue if(!r_hand)
drop_from_inventory(r_hand) continue
drop_from_inventory(r_hand)
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ") var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
emote("me", 1, "[(species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [E.name]!") emote("me", 1, "[(species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
else if(E.is_malfunctioning()) else if(E.is_malfunctioning())
switch(E.body_part)
if(E.body_part == HAND_LEFT) if(HAND_LEFT, ARM_LEFT)
if(!l_hand) if(!l_hand)
continue continue
drop_from_inventory(l_hand) drop_from_inventory(l_hand)
else if(HAND_RIGHT, ARM_RIGHT)
if(!r_hand) if(!r_hand)
continue continue
drop_from_inventory(r_hand) drop_from_inventory(r_hand)
emote("me", 1, "drops what they were holding, their [E.name] malfunctioning!") emote("me", 1, "drops what they were holding, their [E.name] malfunctioning!")
@@ -176,4 +177,4 @@
/mob/living/carbon/human/proc/sync_organ_dna() /mob/living/carbon/human/proc/sync_organ_dna()
var/list/all_bits = internal_organs|organs var/list/all_bits = internal_organs|organs
for(var/obj/item/organ/O in all_bits) for(var/obj/item/organ/O in all_bits)
O.set_dna(dna) O.set_dna(dna)

View File

@@ -1015,6 +1015,10 @@
// Check everything else. // Check everything else.
//Periodically double-check embedded_flag
if(embedded_flag && !(life_tick % 10))
if(!embedded_needs_process())
embedded_flag = 0
//Vision //Vision
var/obj/item/organ/vision var/obj/item/organ/vision
if(species.vision_organ) if(species.vision_organ)

View File

@@ -37,7 +37,6 @@
bump_flag = MONKEY bump_flag = MONKEY
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL|ALIEN push_flags = MONKEY|SLIME|SIMPLE_ANIMAL|ALIEN
var/holder_type = /obj/item/weapon/holder/monkey
/datum/species/monkey/handle_npc(var/mob/living/carbon/human/H) /datum/species/monkey/handle_npc(var/mob/living/carbon/human/H)
if(H.stat != CONSCIOUS) if(H.stat != CONSCIOUS)
@@ -47,10 +46,6 @@
if(prob(1)) if(prob(1))
H.emote(pick("scratch","jump","roll","tail")) H.emote(pick("scratch","jump","roll","tail"))
/datum/species/monkey/handle_post_spawn(var/mob/living/carbon/human/H)
..()
H.holder_type = holder_type
/datum/species/monkey/get_random_name() /datum/species/monkey/get_random_name()
return "[lowertext(name)] ([rand(100,999)])" return "[lowertext(name)] ([rand(100,999)])"
@@ -66,7 +61,6 @@
flesh_color = "#AFA59E" flesh_color = "#AFA59E"
base_color = "#333333" base_color = "#333333"
tail = "farwatail" tail = "farwatail"
holder_type = /obj/item/weapon/holder/monkey/farwa
/datum/species/monkey/skrell /datum/species/monkey/skrell
name = "Neara" name = "Neara"
@@ -81,7 +75,6 @@
blood_color = "#1D2CBF" blood_color = "#1D2CBF"
reagent_tag = IS_SKRELL reagent_tag = IS_SKRELL
tail = null tail = null
holder_type = /obj/item/weapon/holder/monkey/neaera
/datum/species/monkey/unathi /datum/species/monkey/unathi
name = "Stok" name = "Stok"
@@ -96,4 +89,3 @@
flesh_color = "#34AF10" flesh_color = "#34AF10"
base_color = "#066000" base_color = "#066000"
reagent_tag = IS_UNATHI reagent_tag = IS_UNATHI
holder_type = /obj/item/weapon/holder/monkey/stok

View File

@@ -3,8 +3,7 @@
if(!slot_to_strip || !istype(user)) if(!slot_to_strip || !istype(user))
return return
// TODO : Change to incapacitated() on merge. if(user.incapacitated())
if(user.stat || user.lying || user.resting || user.buckled)
user << browse(null, text("window=mob[src.name]")) user << browse(null, text("window=mob[src.name]"))
return return

View File

@@ -2,6 +2,8 @@
set invisibility = 0 set invisibility = 0
set background = BACKGROUND_ENABLED set background = BACKGROUND_ENABLED
..()
if (transforming) if (transforming)
return return
if(!loc) if(!loc)
@@ -125,7 +127,8 @@
//this handles hud updates. Calls update_vision() and handle_hud_icons() //this handles hud updates. Calls update_vision() and handle_hud_icons()
/mob/living/handle_regular_hud_updates() /mob/living/handle_regular_hud_updates()
if(!client) return 0 if(!client)
return 0
..() ..()
handle_vision() handle_vision()

View File

@@ -378,7 +378,3 @@
src.attack_log += "\[[time_stamp()]\]<font color='orange'> Got knifed by [user.name] ([user.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])</font>" src.attack_log += "\[[time_stamp()]\]<font color='orange'> Got knifed by [user.name] ([user.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])</font>"
msg_admin_attack("[key_name(user)] knifed [key_name(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" ) msg_admin_attack("[key_name(user)] knifed [key_name(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" )
return return
/mob/living/incapacitated()
if(stat || paralysis || stunned || weakened || restrained())
return 1

View File

@@ -6,7 +6,6 @@
emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person) emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person)
small = 1 small = 1
pass_flags = 1 pass_flags = 1
holder_type = /obj/item/weapon/holder/pai
var/network = "SS13" var/network = "SS13"
var/obj/machinery/camera/current = null var/obj/machinery/camera/current = null
@@ -430,4 +429,4 @@
get_scooped(H) get_scooped(H)
return return
else else
return ..() return ..()

View File

@@ -1,3 +1,23 @@
var/list/mob_hat_cache = list()
/proc/get_hat_icon(var/obj/item/hat, var/offset_x = 0, var/offset_y = 0)
var/t_state = hat.icon_state
if(hat.item_state_slots && hat.item_state_slots[slot_head_str])
t_state = hat.item_state_slots[slot_head_str]
else if(hat.item_state)
t_state = hat.item_state
var/key = "[t_state]_[offset_x]_[offset_y]"
if(!mob_hat_cache[key]) // Not ideal as there's no guarantee all hat icon_states
var/t_icon = INV_HEAD_DEF_ICON // are unique across multiple dmis, but whatever.
if(hat.icon_override)
t_icon = hat.icon_override
else if(hat.item_icons && (slot_head_str in hat.item_icons))
t_icon = hat.item_icons[slot_head_str]
var/image/I = image(icon = t_icon, icon_state = t_state)
I.pixel_x = offset_x
I.pixel_y = offset_y
mob_hat_cache[key] = I
return mob_hat_cache[key]
/mob/living/silicon/robot/drone /mob/living/silicon/robot/drone
name = "drone" name = "drone"
real_name = "drone" real_name = "drone"
@@ -29,9 +49,26 @@
var/module_type = /obj/item/weapon/robot_module/drone var/module_type = /obj/item/weapon/robot_module/drone
var/can_pull_size = 2 var/can_pull_size = 2
var/can_pull_mobs var/can_pull_mobs
var/obj/item/hat
var/hat_x_offset = 0
var/hat_y_offset = -13
holder_type = /obj/item/weapon/holder/drone holder_type = /obj/item/weapon/holder/drone
/mob/living/silicon/robot/drone/Destroy()
if(hat)
hat.loc = get_turf(src)
..()
/mob/living/silicon/robot/drone/construction
icon_state = "constructiondrone"
law_type = /datum/ai_laws/construction_drone
module_type = /obj/item/weapon/robot_module/drone/construction
can_pull_size = 5
can_pull_mobs = 1
hat_x_offset = 1
hat_y_offset = -12
/mob/living/silicon/robot/drone/New() /mob/living/silicon/robot/drone/New()
..() ..()
@@ -82,6 +119,8 @@
overlays += "eyes-[icon_state]" overlays += "eyes-[icon_state]"
else else
overlays -= "eyes" overlays -= "eyes"
if(hat) // Let the drones wear hats.
overlays |= get_hat_icon(hat, hat_x_offset, hat_y_offset)
/mob/living/silicon/robot/drone/choose_icon() /mob/living/silicon/robot/drone/choose_icon()
return return
@@ -89,10 +128,25 @@
/mob/living/silicon/robot/drone/pick_module() /mob/living/silicon/robot/drone/pick_module()
return return
//Drones cannot be upgraded with borg modules so we need to catch some items before they get used in ..(). /mob/living/silicon/robot/drone/proc/wear_hat(var/obj/item/new_hat)
/mob/living/silicon/robot/drone/attackby(obj/item/weapon/W as obj, mob/user as mob) if(hat)
return
hat = new_hat
new_hat.loc = src
updateicon()
if(istype(W, /obj/item/borg/upgrade/)) //Drones cannot be upgraded with borg modules so we need to catch some items before they get used in ..().
/mob/living/silicon/robot/drone/attackby(var/obj/item/weapon/W, var/mob/user)
if(user.a_intent == "help" && istype(W, /obj/item/clothing/head))
if(hat)
user << "<span class='warning'>\The [src] is already wearing \the [hat].</span>"
return
user.unEquip(W)
wear_hat(W)
user.visible_message("<span class='notice'>\The [user] puts \the [W] on \the [src].</span>")
return
else if(istype(W, /obj/item/borg/upgrade/))
user << "<span class='danger'>\The [src] is not compatible with \the [W].</span>" user << "<span class='danger'>\The [src] is not compatible with \the [W].</span>"
return return
@@ -135,7 +189,7 @@
return return
..() ..()
/mob/living/silicon/robot/drone/emag_act(var/remaining_charges, var/mob/user) /mob/living/silicon/robot/drone/emag_act(var/remaining_charges, var/mob/user)
if(!client || stat == 2) if(!client || stat == 2)
user << "<span class='danger'>There's not much point subverting this heap of junk.</span>" user << "<span class='danger'>There's not much point subverting this heap of junk.</span>"
@@ -279,13 +333,6 @@
/mob/living/silicon/robot/drone/remove_robot_verbs() /mob/living/silicon/robot/drone/remove_robot_verbs()
src.verbs -= silicon_subsystems src.verbs -= silicon_subsystems
/mob/living/silicon/robot/drone/construction
icon_state = "constructiondrone"
law_type = /datum/ai_laws/construction_drone
module_type = /obj/item/weapon/robot_module/drone/construction
can_pull_size = 5
can_pull_mobs = 1
/mob/living/silicon/robot/drone/construction/welcome_drone() /mob/living/silicon/robot/drone/construction/welcome_drone()
src << "<b>You are a construction drone, an autonomous engineering and fabrication system.</b>." src << "<b>You are a construction drone, an autonomous engineering and fabrication system.</b>."
src << "You are assigned to a Sol Central construction project. The name is irrelevant. Your task is to complete construction and subsystem integration as soon as possible." src << "You are assigned to a Sol Central construction project. The name is irrelevant. Your task is to complete construction and subsystem integration as soon as possible."

View File

@@ -10,13 +10,13 @@
mail_destination = "" mail_destination = ""
return return
src << "\blue You configure your internal beacon, tagging yourself for delivery to '[new_tag]'." src << "<span class='notice'>You configure your internal beacon, tagging yourself for delivery to '[new_tag]'.</span>"
mail_destination = new_tag mail_destination = new_tag
//Auto flush if we use this verb inside a disposal chute. //Auto flush if we use this verb inside a disposal chute.
var/obj/machinery/disposal/D = src.loc var/obj/machinery/disposal/D = src.loc
if(istype(D)) if(istype(D))
src << "\blue \The [D] acknowledges your signal." src << "<span class='notice'>\The [D] acknowledges your signal.</span>"
D.flush_count = D.flush_every_ticks D.flush_count = D.flush_every_ticks
return return
@@ -27,5 +27,11 @@
if(H.a_intent == "help") if(H.a_intent == "help")
get_scooped(H) get_scooped(H)
return return
else if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand))
hat.loc = get_turf(src)
H.put_in_hands(hat)
H.visible_message("<span class='danger'>\The [H] removes \the [src]'s [hat].</span>")
hat = null
updateicon()
else else
return ..() return ..()

View File

@@ -14,6 +14,7 @@
/obj/item/weapon/firealarm_electronics, /obj/item/weapon/firealarm_electronics,
/obj/item/weapon/airalarm_electronics, /obj/item/weapon/airalarm_electronics,
/obj/item/weapon/airlock_electronics, /obj/item/weapon/airlock_electronics,
/obj/item/weapon/tracker_electronics,
/obj/item/weapon/module/power_control, /obj/item/weapon/module/power_control,
/obj/item/weapon/stock_parts, /obj/item/weapon/stock_parts,
/obj/item/frame, /obj/item/frame,

View File

@@ -78,7 +78,8 @@
flick("h_lathe_leave",src) flick("h_lathe_leave",src)
time_last_drone = world.time time_last_drone = world.time
var/mob/living/silicon/robot/drone/new_drone = new drone_type(get_turf(src)) if(player.mob && player.mob.mind) player.mob.mind.reset()
var/mob/living/silicon/robot/drone/new_drone = PoolOrNew(drone_type, get_turf(src))
new_drone.transfer_personality(player) new_drone.transfer_personality(player)
new_drone.master_fabricator = src new_drone.master_fabricator = src
@@ -90,7 +91,6 @@
set name = "Join As Drone" set name = "Join As Drone"
set desc = "If there is a powered, enabled fabricator in the game world with a prepared chassis, join as a maintenance drone." set desc = "If there is a powered, enabled fabricator in the game world with a prepared chassis, join as a maintenance drone."
if(ticker.current_state < GAME_STATE_PLAYING) if(ticker.current_state < GAME_STATE_PLAYING)
src << "<span class='danger'>The game hasn't started yet!</span>" src << "<span class='danger'>The game hasn't started yet!</span>"
return return
@@ -108,17 +108,11 @@
if(jobban_isbanned(src,"Cyborg")) if(jobban_isbanned(src,"Cyborg"))
usr << "<span class='danger'>You are banned from playing synthetics and cannot spawn as a drone.</span>" usr << "<span class='danger'>You are banned from playing synthetics and cannot spawn as a drone.</span>"
return return
if(!MayRespawn(1)) if(!MayRespawn(1))
return return
var/deathtime = world.time - src.timeofdeath var/deathtime = world.time - src.timeofdeath
if(istype(src,/mob/dead/observer))
var/mob/dead/observer/G = src
if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
usr << "<span class='notice'>Upon using the antagHUD you forfeighted the ability to join the round.</span>"
return
var/deathtimeminutes = round(deathtime / 600) var/deathtimeminutes = round(deathtime / 600)
var/pluralcheck = "minute" var/pluralcheck = "minute"
if(deathtimeminutes == 0) if(deathtimeminutes == 0)

View File

@@ -996,7 +996,7 @@
if(ROBOT_NOTIFICATION_NEW_MODULE) //New Module if(ROBOT_NOTIFICATION_NEW_MODULE) //New Module
connected_ai << "<br><br><span class='notice'>NOTICE - [braintype] module change detected: [name] has loaded the [first_arg].</span><br>" connected_ai << "<br><br><span class='notice'>NOTICE - [braintype] module change detected: [name] has loaded the [first_arg].</span><br>"
if(ROBOT_NOTIFICATION_MODULE_RESET) if(ROBOT_NOTIFICATION_MODULE_RESET)
connected_ai << "<br><br><span class='notice'>NOTICE - [braintype] module reset detected: [name] has unladed the [first_arg].</span><br>" connected_ai << "<br><br><span class='notice'>NOTICE - [braintype] module reset detected: [name] has unloaded the [first_arg].</span><br>"
if(ROBOT_NOTIFICATION_NEW_NAME) //New Name if(ROBOT_NOTIFICATION_NEW_NAME) //New Name
if(first_arg != second_arg) if(first_arg != second_arg)
connected_ai << "<br><br><span class='notice'>NOTICE - [braintype] reclassification detected: [first_arg] is now designated as [second_arg].</span><br>" connected_ai << "<br><br><span class='notice'>NOTICE - [braintype] reclassification detected: [first_arg] is now designated as [second_arg].</span><br>"

View File

@@ -507,7 +507,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/tray/robotray(src) src.modules += new /obj/item/weapon/tray/robotray(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src) src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src)
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src)
var/datum/reagents/R = new/datum/reagents(50) var/datum/reagents/R = new/datum/reagents(50)
src.emag.reagents = R src.emag.reagents = R
@@ -540,7 +540,7 @@ var/global/list/robot_modules = list(
var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules
E.reagents.add_reagent("enzyme", 2 * amount) E.reagents.add_reagent("enzyme", 2 * amount)
if(src.emag) if(src.emag)
var/obj/item/weapon/reagent_containers/food/drinks/cans/beer/B = src.emag var/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer/B = src.emag
B.reagents.add_reagent("beer2", 2 * amount) B.reagents.add_reagent("beer2", 2 * amount)
/obj/item/weapon/robot_module/miner /obj/item/weapon/robot_module/miner

View File

@@ -59,8 +59,13 @@
var/mob/dead/observer/spook = locate() in range(src,5) var/mob/dead/observer/spook = locate() in range(src,5)
if(spook) if(spook)
var/turf/T = spook.loc var/turf/T = spook.loc
var/obj/O = pick(T.contents) var/list/visible = list()
visible_emote("suddenly stops and stares at something unseen[istype(O) ? " near [O]":""].") for(var/obj/O in T.contents)
if(!O.invisibility && O.name)
visible += O
if(visible.len)
var/atom/A = pick(visible)
visible_emote("suddenly stops and stares at something unseen[istype(A) ? " near [A]":""].")
/mob/living/simple_animal/cat/proc/handle_movement_target() /mob/living/simple_animal/cat/proc/handle_movement_target()
//if our target is neither inside a turf or inside a human(???), stop //if our target is neither inside a turf or inside a human(???), stop

View File

@@ -63,13 +63,6 @@
if(!body_color) if(!body_color)
body_color = pick( list("brown","gray","white") ) body_color = pick( list("brown","gray","white") )
switch(body_color)
if("brown")
holder_type = /obj/item/weapon/holder/mouse/brown
if("gray")
holder_type = /obj/item/weapon/holder/mouse/gray
if("white")
holder_type = /obj/item/weapon/holder/mouse/white
icon_state = "mouse_[body_color]" icon_state = "mouse_[body_color]"
icon_living = "mouse_[body_color]" icon_living = "mouse_[body_color]"
icon_dead = "mouse_[body_color]_dead" icon_dead = "mouse_[body_color]_dead"
@@ -125,17 +118,14 @@
/mob/living/simple_animal/mouse/white /mob/living/simple_animal/mouse/white
body_color = "white" body_color = "white"
icon_state = "mouse_white" icon_state = "mouse_white"
holder_type = /obj/item/weapon/holder/mouse/white
/mob/living/simple_animal/mouse/gray /mob/living/simple_animal/mouse/gray
body_color = "gray" body_color = "gray"
icon_state = "mouse_gray" icon_state = "mouse_gray"
holder_type = /obj/item/weapon/holder/mouse/gray
/mob/living/simple_animal/mouse/brown /mob/living/simple_animal/mouse/brown
body_color = "brown" body_color = "brown"
icon_state = "mouse_brown" icon_state = "mouse_brown"
holder_type = /obj/item/weapon/holder/mouse/brown
//TOM IS ALIVE! SQUEEEEEEEE~K :) //TOM IS ALIVE! SQUEEEEEEEE~K :)
/mob/living/simple_animal/mouse/brown/Tom /mob/living/simple_animal/mouse/brown/Tom

View File

@@ -107,7 +107,7 @@
rapid = 1 rapid = 1
icon_state = "syndicateranged" icon_state = "syndicateranged"
icon_living = "syndicateranged" icon_living = "syndicateranged"
casingtype = /obj/item/ammo_casing/a12mm casingtype = /obj/item/ammo_casing/a10mm
projectilesound = 'sound/weapons/Gunshot_light.ogg' projectilesound = 'sound/weapons/Gunshot_light.ogg'
projectiletype = /obj/item/projectile/bullet/pistol/medium projectiletype = /obj/item/projectile/bullet/pistol/medium

View File

@@ -153,7 +153,7 @@
return return
/mob/proc/incapacitated() /mob/proc/incapacitated()
return return (stat || paralysis || stunned || weakened || restrained())
/mob/proc/restrained() /mob/proc/restrained()
return return
@@ -872,6 +872,9 @@
visible_implants += O visible_implants += O
return visible_implants return visible_implants
/mob/proc/embedded_needs_process()
return (embedded.len > 0)
mob/proc/yank_out_object() mob/proc/yank_out_object()
set category = "Object" set category = "Object"
set name = "Yank out object" set name = "Yank out object"

View File

@@ -53,7 +53,7 @@
var/joint = "joint" // Descriptive string used in dislocation. var/joint = "joint" // Descriptive string used in dislocation.
var/amputation_point // Descriptive string used in amputation. var/amputation_point // Descriptive string used in amputation.
var/dislocated = 0 // If you target a joint, you can dislocate the limb, causing temporary damage to the organ. var/dislocated = 0 // If you target a joint, you can dislocate the limb, causing temporary damage to the organ.
var/can_grasp var/can_grasp //It would be more appropriate if these two were named "affects_grasp" and "affects_stand" at this point
var/can_stand var/can_stand
/obj/item/organ/external/Destroy() /obj/item/organ/external/Destroy()

View File

@@ -107,6 +107,15 @@
return return
/obj/item/weapon/paper/attack_self(mob/living/user as mob) /obj/item/weapon/paper/attack_self(mob/living/user as mob)
if(user.a_intent == I_HURT)
if(icon_state == "scrap")
user.show_message("<span class='warning'>\The [src] is already crumpled.</span>")
return
//crumple dat paper
info = stars(info,85)
user.visible_message("\The [user] crumples \the [src] into a ball!")
icon_state = "scrap"
return
user.examinate(src) user.examinate(src)
if(rigged && (Holiday == "April Fool's Day")) if(rigged && (Holiday == "April Fool's Day"))
if(spam_flag == 0) if(spam_flag == 0)
@@ -442,6 +451,10 @@
B.update_icon() B.update_icon()
else if(istype(P, /obj/item/weapon/pen)) else if(istype(P, /obj/item/weapon/pen))
if(icon_state == "scrap")
usr << "<span class='warning'>\The [src] is too crumpled to write on.</span>"
return
var/obj/item/weapon/pen/robopen/RP = P var/obj/item/weapon/pen/robopen/RP = P
if ( istype(RP) && RP.mode == 2 ) if ( istype(RP) && RP.mode == 2 )
RP.RenamePaper(user,src) RP.RenamePaper(user,src)

View File

@@ -17,7 +17,17 @@
if((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr)))))) if((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr))))))
if(!istype(usr, /mob/living/carbon/slime) && !istype(usr, /mob/living/simple_animal)) if(!istype(usr, /mob/living/carbon/slime) && !istype(usr, /mob/living/simple_animal))
if( !usr.get_active_hand() ) //if active hand is empty if( !usr.get_active_hand() ) //if active hand is empty
attack_hand(usr, 1, 1) var/mob/living/carbon/human/H = user
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
if (H.hand)
temp = H.organs_by_name["l_hand"]
if(temp && !temp.is_usable())
user << "<span class='notice'>You try to move your [temp.name], but cannot!</span>"
return
user << "<span class='notice'>You pick up the [src].</span>"
user.put_in_hands(src)
return return

View File

@@ -110,18 +110,18 @@
/obj/item/ammo_magazine/c9mm/empty /obj/item/ammo_magazine/c9mm/empty
initial_ammo = 0 initial_ammo = 0
/obj/item/ammo_magazine/a12mm /obj/item/ammo_magazine/a10mm
name = "magazine (12mm)" name = "magazine (10mm)"
icon_state = "12mm" icon_state = "12mm"
origin_tech = list(TECH_COMBAT = 2) origin_tech = list(TECH_COMBAT = 2)
mag_type = MAGAZINE mag_type = MAGAZINE
caliber = "12mm" caliber = "10mm"
matter = list(DEFAULT_WALL_MATERIAL = 1500) matter = list(DEFAULT_WALL_MATERIAL = 1500)
ammo_type = "/obj/item/ammo_casing/a12mm" ammo_type = /obj/item/ammo_casing/a10mm
max_ammo = 20 max_ammo = 20
multiple_sprites = 1 multiple_sprites = 1
/obj/item/ammo_magazine/a12mm/empty /obj/item/ammo_magazine/a10mm/empty
initial_ammo = 0 initial_ammo = 0
/obj/item/ammo_magazine/a556 /obj/item/ammo_magazine/a556

View File

@@ -64,9 +64,9 @@
caliber = ".45" caliber = ".45"
projectile_type = /obj/item/projectile/energy/flash projectile_type = /obj/item/projectile/energy/flash
/obj/item/ammo_casing/a12mm /obj/item/ammo_casing/a10mm
desc = "A 12mm bullet casing." desc = "A 10mm bullet casing."
caliber = "12mm" caliber = "10mm"
projectile_type = /obj/item/projectile/bullet/pistol/medium projectile_type = /obj/item/projectile/bullet/pistol/medium

View File

@@ -1,14 +1,14 @@
/obj/item/weapon/gun/energy/laser /obj/item/weapon/gun/energy/laser
name = "laser carbine" name = "laser carbine"
desc = "A common laser weapon, designed to kill with concentrated energy blasts." desc = "An Hesphaistos Industries G40E carbine, designed to kill with concentrated energy blasts."
icon_state = "laser" icon_state = "laser"
item_state = "laser" item_state = "laser"
fire_sound = 'sound/weapons/Laser.ogg' fire_sound = 'sound/weapons/Laser.ogg'
slot_flags = SLOT_BELT|SLOT_BACK slot_flags = SLOT_BELT|SLOT_BACK
w_class = 3 w_class = 3
force = 10 force = 10
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2) origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
matter = list(DEFAULT_WALL_MATERIAL = 2000) matter = list(DEFAULT_WALL_MATERIAL = 2000)
projectile_type = /obj/item/projectile/beam projectile_type = /obj/item/projectile/beam
fire_delay = 1 //rapid fire fire_delay = 1 //rapid fire
@@ -17,15 +17,15 @@
use_external_power = 1 use_external_power = 1
/obj/item/weapon/gun/energy/laser/practice /obj/item/weapon/gun/energy/laser/practice
name = "practice laser gun" name = "practice laser carbine"
desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice." desc = "A modified version of the HI G40E, this one fires less concentrated energy bolts designed for target practice."
projectile_type = /obj/item/projectile/beam/practice projectile_type = /obj/item/projectile/beam/practice
obj/item/weapon/gun/energy/retro obj/item/weapon/gun/energy/retro
name = "retro laser" name = "retro laser"
icon_state = "retro" icon_state = "retro"
item_state = "retro" item_state = "retro"
desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws." desc = "An older model of the basic lasergun. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws."
fire_sound = 'sound/weapons/Laser.ogg' fire_sound = 'sound/weapons/Laser.ogg'
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
w_class = 3 w_class = 3
@@ -36,7 +36,7 @@ obj/item/weapon/gun/energy/retro
name = "antique laser gun" name = "antique laser gun"
icon_state = "caplaser" icon_state = "caplaser"
item_state = "caplaser" item_state = "caplaser"
desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. The object menaces with spikes of energy. On the item is an image of Space Station 13. The station is exploding." desc = "A rare weapon, handcrafted by a now defunct specialty manufacturer on Luna for a small fortune. It's certainly aged well"
force = 5 force = 5
fire_sound = 'sound/weapons/Laser.ogg' fire_sound = 'sound/weapons/Laser.ogg'
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
@@ -78,8 +78,8 @@ obj/item/weapon/gun/energy/retro
fire_delay = 1 fire_delay = 1
/obj/item/weapon/gun/energy/sniperrifle /obj/item/weapon/gun/energy/sniperrifle
name = "\improper L.W.A.P. sniper rifle" name = "marksman energy rifle"
desc = "A high-power laser rifle fitted with a SMART aiming-system scope." desc = "The HI DMR 9E is an older design of Hesphaistos Industries. A designated marksman rifle capable of shooting powerful ionized beams, this is a weapon to kill from a distance."
icon_state = "sniper" icon_state = "sniper"
item_state = "laser" item_state = "laser"
fire_sound = 'sound/weapons/marauder.ogg' fire_sound = 'sound/weapons/marauder.ogg'

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/gun/energy/gun /obj/item/weapon/gun/energy/gun
name = "energy gun" name = "energy gun"
desc = "An energy-based gun with two settings: Stun and kill." desc = "Another bestseller of Lawson Arms and the FTU, the LAEP90 Perun is a versatile energy based sidearm, capable of switching between low and high capacity projectile settings. In other words: Stun or Kill."
icon_state = "energystun100" icon_state = "energystun100"
item_state = null //so the human update icon uses the icon_state instead. item_state = null //so the human update icon uses the icon_state instead.
fire_sound = 'sound/weapons/Taser.ogg' fire_sound = 'sound/weapons/Taser.ogg'
@@ -24,9 +24,9 @@
name = "advanced energy gun" name = "advanced energy gun"
desc = "An energy gun with an experimental miniaturized reactor." desc = "An energy gun with an experimental miniaturized reactor."
icon_state = "nucgun" icon_state = "nucgun"
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3) origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3)
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
force = 8 //looks heavier than a pistol force = 8 //looks heavier than a pistol
self_recharge = 1 self_recharge = 1
modifystate = null modifystate = null
@@ -34,7 +34,7 @@
list(name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg'), list(name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg'),
list(name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg'), list(name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg'),
) )
var/lightfail = 0 var/lightfail = 0
//override for failcheck behaviour //override for failcheck behaviour

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/gun/energy/ionrifle /obj/item/weapon/gun/energy/ionrifle
name = "ion rifle" name = "ion rifle"
desc = "A man portable anti-armor weapon designed to disable mechanical threats" desc = "The NT Mk60 EW Halicon is a man portable anti-armor weapon designed to disable mechanical threats, produced by NT. Not the best of its type."
icon_state = "ionrifle" icon_state = "ionrifle"
item_state = "ionrifle" item_state = "ionrifle"
fire_sound = 'sound/weapons/Laser.ogg' fire_sound = 'sound/weapons/Laser.ogg'
@@ -28,9 +28,9 @@
desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements." desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
icon_state = "decloner" icon_state = "decloner"
item_state = "decloner" item_state = "decloner"
fire_sound = 'sound/weapons/pulse3.ogg' fire_sound = 'sound/weapons/pulse3.ogg'
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_POWER = 3) origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_POWER = 3)
max_shots = 10 max_shots = 10
projectile_type = /obj/item/projectile/energy/declone projectile_type = /obj/item/projectile/energy/declone
/obj/item/weapon/gun/energy/floragun /obj/item/weapon/gun/energy/floragun

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/gun/energy/taser /obj/item/weapon/gun/energy/taser
name = "taser gun" name = "taser gun"
desc = "A small, low capacity gun used for non-lethal takedowns." desc = "The NT Mk30 NL is a small, low capacity gun used for non-lethal takedowns. Produced by NT, it's actually a licensed version of a W-T design."
icon_state = "taser" icon_state = "taser"
item_state = null //so the human update icon uses the icon_state instead. item_state = null //so the human update icon uses the icon_state instead.
fire_sound = 'sound/weapons/Taser.ogg' fire_sound = 'sound/weapons/Taser.ogg'
@@ -20,11 +20,11 @@
/obj/item/weapon/gun/energy/stunrevolver /obj/item/weapon/gun/energy/stunrevolver
name = "stun revolver" name = "stun revolver"
desc = "A high-tech revolver that fires stun cartridges. The stun cartridges can be recharged using a conventional energy weapon recharger." desc = "A LAEP20 Zeus. Designed by Lawson Arms and produced under the wing of the FTU, several TSCs have been trying to get a hold of the blueprints for half a decade."
icon_state = "stunrevolver" icon_state = "stunrevolver"
item_state = "stunrevolver" item_state = "stunrevolver"
fire_sound = 'sound/weapons/Gunshot.ogg' fire_sound = 'sound/weapons/Gunshot.ogg'
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
projectile_type = /obj/item/projectile/energy/electrode projectile_type = /obj/item/projectile/energy/electrode
max_shots = 8 max_shots = 8
@@ -35,8 +35,8 @@
icon_state = "crossbow" icon_state = "crossbow"
w_class = 2.0 w_class = 2.0
item_state = "crossbow" item_state = "crossbow"
origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2, TECH_ILLEGAL = 5) origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2, TECH_ILLEGAL = 5)
matter = list(DEFAULT_WALL_MATERIAL = 2000) matter = list(DEFAULT_WALL_MATERIAL = 2000)
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
silenced = 1 silenced = 1
fire_sound = 'sound/weapons/Genhit.ogg' fire_sound = 'sound/weapons/Genhit.ogg'

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/gun/projectile/automatic //Hopefully someone will find a way to make these fire in bursts or something. --Superxpdude /obj/item/weapon/gun/projectile/automatic //Hopefully someone will find a way to make these fire in bursts or something. --Superxpdude
name = "submachine gun" name = "prototype SMG"
desc = "A lightweight, fast firing gun. Uses 9mm rounds." desc = "A protoype lightweight, fast firing gun. Uses 9mm rounds."
icon_state = "saber" //ugly icon_state = "saber" //ugly
w_class = 3 w_class = 3
load_method = SPEEDLOADER //yup. until someone sprites a magazine for it. load_method = SPEEDLOADER //yup. until someone sprites a magazine for it.
@@ -20,7 +20,7 @@
/obj/item/weapon/gun/projectile/automatic/mini_uzi /obj/item/weapon/gun/projectile/automatic/mini_uzi
name = "\improper Uzi" name = "\improper Uzi"
desc = "A lightweight, fast firing gun, for when you want someone dead. Uses .45 rounds." desc = "The UZI is a lightweight, fast firing gun. For when you want someone dead. Uses .45 rounds."
icon_state = "mini-uzi" icon_state = "mini-uzi"
w_class = 3 w_class = 3
load_method = SPEEDLOADER //yup. until someone sprites a magazine for it. load_method = SPEEDLOADER //yup. until someone sprites a magazine for it.
@@ -30,18 +30,18 @@
ammo_type = /obj/item/ammo_casing/c45 ammo_type = /obj/item/ammo_casing/c45
/obj/item/weapon/gun/projectile/automatic/c20r /obj/item/weapon/gun/projectile/automatic/c20r
name = "\improper C-20r SMG" name = "submachine gun"
desc = "A lightweight, fast firing gun, for when you REALLY need someone dead. Uses 12mm pistol rounds. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp" desc = "The C-20r is a lightweight and rapid firing SMG, for when you REALLY need someone dead. Uses 10mm rounds. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp."
icon_state = "c20r" icon_state = "c20r"
item_state = "c20r" item_state = "c20r"
w_class = 3 w_class = 3
force = 10 force = 10
caliber = "12mm" caliber = "10mm"
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
slot_flags = SLOT_BELT|SLOT_BACK slot_flags = SLOT_BELT|SLOT_BACK
fire_sound = 'sound/weapons/Gunshot_light.ogg' fire_sound = 'sound/weapons/Gunshot_light.ogg'
load_method = MAGAZINE load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/a12mm magazine_type = /obj/item/ammo_magazine/a10mm
auto_eject = 1 auto_eject = 1
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
@@ -54,8 +54,8 @@
return return
/obj/item/weapon/gun/projectile/automatic/sts35 /obj/item/weapon/gun/projectile/automatic/sts35
name = "\improper STS-35 automatic rifle" name = "assault rifle"
desc = "A durable, rugged looking automatic weapon of a make popular on the frontier worlds. Uses 7.62mm rounds. It is unmarked." desc = "The rugged STS-35 is a durable automatic weapon of a make popular on the frontier worlds. Uses 7.62mm rounds. This one is unmarked."
icon_state = "arifle" icon_state = "arifle"
item_state = null item_state = null
w_class = 4 w_class = 4
@@ -78,8 +78,8 @@
update_held_icon() update_held_icon()
/obj/item/weapon/gun/projectile/automatic/wt550 /obj/item/weapon/gun/projectile/automatic/wt550
name = "\improper W-T 550 Saber" name = "machine pistol"
desc = "A cheap, mass produced Ward-Takahashi PDW. Uses 9mm rounds." desc = "The W-T 550 Saber is a cheap self-defense weapon, mass-produced by Ward-Takahashi for paramilitary and private use. Uses 9mm rounds."
icon_state = "wt550" icon_state = "wt550"
item_state = "wt550" item_state = "wt550"
w_class = 3 w_class = 3
@@ -100,8 +100,8 @@
return return
/obj/item/weapon/gun/projectile/automatic/z8 /obj/item/weapon/gun/projectile/automatic/z8
name = "\improper Z8 Bulldog" name = "bullpup assault rifle"
desc = "An older model bullpup carbine, made by the now defunct Zendai Foundries. Uses armor piercing 5.56mm rounds. Makes you feel like a space marine when you hold it." desc = "The Z8 Bulldog is an older model bullpup carbine, made by the now defunct Zendai Foundries. Uses armor piercing 5.56mm rounds. Makes you feel like a space marine when you hold it."
icon_state = "carbine" icon_state = "carbine"
item_state = "z8carbine" item_state = "z8carbine"
w_class = 4 w_class = 4
@@ -166,8 +166,8 @@
user << "\The [launcher] is empty." user << "\The [launcher] is empty."
/obj/item/weapon/gun/projectile/automatic/l6_saw /obj/item/weapon/gun/projectile/automatic/l6_saw
name = "\improper L6 SAW" name = "light machine gun"
desc = "A rather traditionally made light machine gun with a pleasantly lacquered wooden pistol grip. Has 'Aussec Armoury- 2531' engraved on the reciever" desc = "A rather traditionally made L6 SAW with a pleasantly lacquered wooden pistol grip. Has 'Aussec Armoury- 2531' engraved on the reciever"
icon_state = "l6closed100" icon_state = "l6closed100"
item_state = "l6closedmag" item_state = "l6closedmag"
w_class = 4 w_class = 4

View File

@@ -43,7 +43,7 @@
/obj/item/weapon/gun/projectile/dartgun /obj/item/weapon/gun/projectile/dartgun
name = "dart gun" name = "dart gun"
desc = "A small gas-powered dartgun, capable of delivering chemical cocktails swiftly across short distances." desc = "Zeng-Hu Pharmaceutical's entry into the arms market, the Z-H P Artemis is a gas-powered dart gun capable of delivering chemical cocktails swiftly across short distances."
icon_state = "dartgun-empty" icon_state = "dartgun-empty"
item_state = null item_state = null
@@ -203,4 +203,4 @@
starting_chems = list("kelotane","bicaridine","anti_toxin") starting_chems = list("kelotane","bicaridine","anti_toxin")
/obj/item/weapon/gun/projectile/dartgun/vox/raider /obj/item/weapon/gun/projectile/dartgun/vox/raider
starting_chems = list("space_drugs","stoxin","impedrezene") starting_chems = list("space_drugs","stoxin","impedrezene")

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/gun/projectile/colt /obj/item/weapon/gun/projectile/colt
name = "\improper Colt M1911" name = "vintage .45 pistol"
desc = "A cheap Martian knock-off of a Colt M1911." desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds."
magazine_type = /obj/item/ammo_magazine/c45m magazine_type = /obj/item/ammo_magazine/c45m
icon_state = "colt" icon_state = "colt"
caliber = ".45" caliber = ".45"
@@ -9,7 +9,6 @@
load_method = MAGAZINE load_method = MAGAZINE
/obj/item/weapon/gun/projectile/colt/detective /obj/item/weapon/gun/projectile/colt/detective
desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds."
magazine_type = /obj/item/ammo_magazine/c45m/rubber magazine_type = /obj/item/ammo_magazine/c45m/rubber
/obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun() /obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun()
@@ -31,8 +30,8 @@
return 1 return 1
/obj/item/weapon/gun/projectile/sec /obj/item/weapon/gun/projectile/sec
desc = "A NanoTrasen designed sidearm, found pretty much everywhere humans are. Uses .45 rounds." name = ".45 pistol"
name = "\improper NT Mk58" desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a Nanotrasen subsidiary. Found pretty much everywhere humans are. Uses .45 rounds."
icon_state = "secguncomp" icon_state = "secguncomp"
magazine_type = /obj/item/ammo_magazine/c45m/rubber magazine_type = /obj/item/ammo_magazine/c45m/rubber
caliber = ".45" caliber = ".45"
@@ -41,12 +40,12 @@
load_method = MAGAZINE load_method = MAGAZINE
/obj/item/weapon/gun/projectile/sec/flash /obj/item/weapon/gun/projectile/sec/flash
name = "\improper NT Mk58 signal pistol" name = ".45 signal pistol"
magazine_type = /obj/item/ammo_magazine/c45m/flash magazine_type = /obj/item/ammo_magazine/c45m/flash
/obj/item/weapon/gun/projectile/sec/wood /obj/item/weapon/gun/projectile/sec/wood
desc = "A Nanotrasen designed sidearm, this one has a sweet wooden grip. Uses .45 rounds." desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a Nanotrasen subsidiary. This one has a sweet wooden grip. Uses .45 rounds."
name = "\improper Custom NT Mk58" name = "custom .45 Pistol"
icon_state = "secgundark" icon_state = "secgundark"
/obj/item/weapon/gun/projectile/silenced /obj/item/weapon/gun/projectile/silenced
@@ -106,8 +105,8 @@
icon_state = "gyropistol" icon_state = "gyropistol"
/obj/item/weapon/gun/projectile/pistol /obj/item/weapon/gun/projectile/pistol
name = "\improper Stechtkin pistol" name = "holdout pistol"
desc = "A small, easily concealable gun. Uses 9mm rounds." desc = "The Lumoco Arms P3 Whisper. A small, easily concealable gun. Uses 9mm rounds."
icon_state = "pistol" icon_state = "pistol"
item_state = null item_state = null
w_class = 2 w_class = 2
@@ -119,8 +118,7 @@
magazine_type = /obj/item/ammo_magazine/mc9mm magazine_type = /obj/item/ammo_magazine/mc9mm
/obj/item/weapon/gun/projectile/pistol/flash /obj/item/weapon/gun/projectile/pistol/flash
name = "\improper Stechtkin signal pistol" name = "holdout signal pistol"
desc = "A small, easily concealable gun. Uses 9mm rounds."
magazine_type = /obj/item/ammo_magazine/mc9mm/flash magazine_type = /obj/item/ammo_magazine/mc9mm/flash
/obj/item/weapon/gun/projectile/pistol/attack_hand(mob/user as mob) /obj/item/weapon/gun/projectile/pistol/attack_hand(mob/user as mob)
@@ -166,19 +164,19 @@
w_class = 2 w_class = 2
/obj/item/weapon/gun/projectile/pirate /obj/item/weapon/gun/projectile/pirate
name = "zipgun" name = "zip gun"
desc = "Little more than a barrel, handle, and firing mechanism, cheap makeshift firearms like this one are not uncommon in frontier systems." desc = "Little more than a barrel, handle, and firing mechanism, cheap makeshift firearms like this one are not uncommon in frontier systems."
icon_state = "sawnshotgun" icon_state = "sawnshotgun"
item_state = "sawnshotgun" item_state = "sawnshotgun"
handle_casings = CYCLE_CASINGS //player has to take the old casing out manually before reloading handle_casings = CYCLE_CASINGS //player has to take the old casing out manually before reloading
load_method = SINGLE_CASING load_method = SINGLE_CASING
max_shells = 1 //literally just a barrel max_shells = 1 //literally just a barrel
var/global/list/ammo_types = list( var/global/list/ammo_types = list(
/obj/item/ammo_casing/a357 = ".357", /obj/item/ammo_casing/a357 = ".357",
/obj/item/ammo_casing/c9mmf = "9mm", /obj/item/ammo_casing/c9mmf = "9mm",
/obj/item/ammo_casing/c45f = ".45", /obj/item/ammo_casing/c45f = ".45",
/obj/item/ammo_casing/a12mm = "12mm", /obj/item/ammo_casing/a10mm = "10mm",
/obj/item/ammo_casing/shotgun = "12 gauge", /obj/item/ammo_casing/shotgun = "12 gauge",
/obj/item/ammo_casing/shotgun = "12 gauge", /obj/item/ammo_casing/shotgun = "12 gauge",
/obj/item/ammo_casing/shotgun/pellet = "12 gauge", /obj/item/ammo_casing/shotgun/pellet = "12 gauge",
@@ -194,7 +192,7 @@
/obj/item/weapon/gun/projectile/pirate/New() /obj/item/weapon/gun/projectile/pirate/New()
ammo_type = pick(ammo_types) ammo_type = pick(ammo_types)
desc += " Uses [ammo_types[ammo_type]] rounds." desc += " Uses [ammo_types[ammo_type]] rounds."
var/obj/item/ammo_casing/ammo = ammo_type var/obj/item/ammo_casing/ammo = ammo_type
caliber = initial(ammo.caliber) caliber = initial(ammo.caliber)
..() ..()

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/gun/projectile/revolver /obj/item/weapon/gun/projectile/revolver
name = "revolver" name = "revolver"
desc = "A classic revolver. Uses .357 ammo" desc = "The Lumoco Arms HE Colt is a choice revolver for when you absolutely, positively need to put a hole in the other guy. Uses .357 ammo."
icon_state = "revolver" icon_state = "revolver"
item_state = "revolver" item_state = "revolver"
caliber = "357" caliber = "357"
@@ -11,7 +11,6 @@
/obj/item/weapon/gun/projectile/revolver/mateba /obj/item/weapon/gun/projectile/revolver/mateba
name = "mateba" name = "mateba"
desc = "When you absolutely, positively need a 10mm hole in the other guy. Uses .357 ammo." //>10mm hole >.357
icon_state = "mateba" icon_state = "mateba"
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/gun/projectile/shotgun/pump /obj/item/weapon/gun/projectile/shotgun/pump
name = "shotgun" name = "shotgun"
desc = "Useful for sweeping alleys." desc = "The mass-produced W-T Remmington 29x shotgun is a favourite of police and security forces on many worlds. Useful for sweeping alleys."
icon_state = "shotgun" icon_state = "shotgun"
item_state = "shotgun" item_state = "shotgun"
max_shells = 4 max_shells = 4
@@ -41,6 +41,7 @@
/obj/item/weapon/gun/projectile/shotgun/pump/combat /obj/item/weapon/gun/projectile/shotgun/pump/combat
name = "combat shotgun" name = "combat shotgun"
desc = "Built for close quarters combat, the Hesphaistos Industries KS-40 is widely regarded as a weapon of choice for repelling boarders."
icon_state = "cshotgun" icon_state = "cshotgun"
item_state = "cshotgun" item_state = "cshotgun"
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2) origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2)

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/gun/projectile/heavysniper /obj/item/weapon/gun/projectile/heavysniper
name = "\improper PTR-7 rifle" name = "anti-materiel rifle"
desc = "A portable anti-armour rifle fitted with a scope. Originally designed to used against armoured exosuits, it is capable of punching through windows and non-reinforced walls with ease. Fires armor piercing 14.5mm shells." desc = "A portable anti-armour rifle fitted with a scope, the HI PTR-7 Rifle was originally designed to used against armoured exosuits. It is capable of punching through windows and non-reinforced walls with ease. Fires armor piercing 14.5mm shells."
icon_state = "heavysniper" icon_state = "heavysniper"
item_state = "l6closednomag" //placeholder item_state = "l6closednomag" //placeholder
w_class = 4 w_class = 4

View File

@@ -292,9 +292,15 @@
return trans_to_obj(target, amount, multiplier, copy) return trans_to_obj(target, amount, multiplier, copy)
return 0 return 0
//Using this in case we want to differentiate splashing an atom from transferring reagents to it later down the road. //Splashing reagents is messier than trans_to, the target's loc gets some of the reagents as well.
//For now it just calls trans_to. /datum/reagents/proc/splash(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/min_spill=0, var/max_spill=60)
/datum/reagents/proc/splash(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0) var/spill = 0
if(!isturf(target) && target.loc)
spill = amount*(rand(min_spill, max_spill)/100)
amount -= spill
if(spill)
splash(target.loc, spill, multiplier, copy, min_spill, max_spill)
trans_to(target, amount, multiplier, copy) trans_to(target, amount, multiplier, copy)
/datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1) /datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1)

View File

@@ -112,6 +112,19 @@
M.resistances += data M.resistances += data
return return
// pure concentrated antibodies
/datum/reagent/antibodies
data = list("antibodies"=list())
name = "Antibodies"
id = "antibodies"
reagent_state = LIQUID
color = "#0050F0"
/datum/reagent/antibodies/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(src.data)
M.antibodies |= src.data["antibodies"]
..()
#define WATER_LATENT_HEAT 19000 // How much heat is removed when applied to a hot turf, in J/unit (19000 makes 120 u of water roughly equivalent to 4L) #define WATER_LATENT_HEAT 19000 // How much heat is removed when applied to a hot turf, in J/unit (19000 makes 120 u of water roughly equivalent to 4L)
/datum/reagent/water /datum/reagent/water
name = "Water" name = "Water"
@@ -145,7 +158,7 @@
environment.add_thermal_energy(-removed_heat) environment.add_thermal_energy(-removed_heat)
if (prob(5)) if (prob(5))
T.visible_message("<span class='warning'>The water sizzles as it lands on \the [T]!</span>") T.visible_message("<span class='warning'>The water sizzles as it lands on \the [T]!</span>")
else if(volume >= 10) else if(volume >= 10)
if(T.wet >= 1) if(T.wet >= 1)
return return

View File

@@ -65,7 +65,7 @@
return return
else else
trans = reagents.splash(target, amount_per_transfer_from_this) //sprinkling reagents on generic non-mobs trans = reagents.trans_to(target, amount_per_transfer_from_this) //sprinkling reagents on generic non-mobs
user << "<span class='notice'>You transfer [trans] units of the solution.</span>" user << "<span class='notice'>You transfer [trans] units of the solution.</span>"
else // Taking from something else // Taking from something

View File

@@ -1,43 +1,12 @@
/obj/item/weapon/reagent_containers/food/drinks/cans /obj/item/weapon/reagent_containers/food/drinks/cans
volume = 40 //just over one and a half cups
amount_per_transfer_from_this = 5 amount_per_transfer_from_this = 5
flags = 0 flags = 0 //starts closed
attack_self(mob/user as mob)
if (!is_open_container())
playsound(loc,'sound/effects/canopen.ogg', rand(10,50), 1)
user << "<span class='notice'>You open the drink with an audible pop!</span>"
flags |= OPENCONTAINER
else
return
attack(mob/M as mob, mob/user as mob, def_zone)
if(!is_open_container())
user << "<span class='notice'>You need to open the drink!</span>"
return
return ..()
afterattack(obj/target, mob/user, proximity)
if(!proximity) return
if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
if(!is_open_container())
user << "<span class='notice'>You need to open the drink!</span>"
return
else if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it.
if(!is_open_container())
user << "<span class='notice'>You need to open the drink!</span>"
return
return ..()
//DRINKS //DRINKS
/obj/item/weapon/reagent_containers/food/drinks/cans/cola /obj/item/weapon/reagent_containers/food/drinks/cans/cola
name = "Space Cola" name = "\improper Space Cola"
desc = "Cola. in space." desc = "Cola. in space."
icon_state = "cola" icon_state = "cola"
center_of_mass = list("x"=16, "y"=10) center_of_mass = list("x"=16, "y"=10)
@@ -46,7 +15,7 @@
reagents.add_reagent("cola", 30) reagents.add_reagent("cola", 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle
name = "Bottled Water" name = "bottled water"
desc = "Introduced to the vending machines by Skrellian request, this water comes straight from the Martian poles." desc = "Introduced to the vending machines by Skrellian request, this water comes straight from the Martian poles."
icon_state = "waterbottle" icon_state = "waterbottle"
center_of_mass = list("x"=15, "y"=8) center_of_mass = list("x"=15, "y"=8)
@@ -54,28 +23,8 @@
..() ..()
reagents.add_reagent("water", 30) reagents.add_reagent("water", 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/beer
name = "Space Beer"
desc = "Contains only water, malt and hops."
icon_state = "beer"
center_of_mass = list("x"=16, "y"=12)
New()
..()
reagents.add_reagent("beer", 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/ale
name = "Magm-Ale"
desc = "A true dorf's drink of choice."
icon_state = "alebottle"
item_state = "beer"
center_of_mass = list("x"=16, "y"=10)
New()
..()
reagents.add_reagent("ale", 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind /obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind
name = "Space Mountain Wind" name = "\improper Space Mountain Wind"
desc = "Blows right through you like a space wind." desc = "Blows right through you like a space wind."
icon_state = "space_mountain_wind" icon_state = "space_mountain_wind"
center_of_mass = list("x"=16, "y"=10) center_of_mass = list("x"=16, "y"=10)
@@ -84,7 +33,7 @@
reagents.add_reagent("spacemountainwind", 30) reagents.add_reagent("spacemountainwind", 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko /obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko
name = "Thirteen Loko" name = "\improper Thirteen Loko"
desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkeness, or even death. Please Drink Responsibly." desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkeness, or even death. Please Drink Responsibly."
icon_state = "thirteen_loko" icon_state = "thirteen_loko"
center_of_mass = list("x"=16, "y"=8) center_of_mass = list("x"=16, "y"=8)
@@ -93,7 +42,7 @@
reagents.add_reagent("thirteenloko", 30) reagents.add_reagent("thirteenloko", 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb /obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb
name = "Dr. Gibb" name = "\improper Dr. Gibb"
desc = "A delicious mixture of 42 different flavors." desc = "A delicious mixture of 42 different flavors."
icon_state = "dr_gibb" icon_state = "dr_gibb"
center_of_mass = list("x"=16, "y"=10) center_of_mass = list("x"=16, "y"=10)
@@ -102,7 +51,7 @@
reagents.add_reagent("dr_gibb", 30) reagents.add_reagent("dr_gibb", 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/starkist /obj/item/weapon/reagent_containers/food/drinks/cans/starkist
name = "Star-kist" name = "\improper Star-kist"
desc = "The taste of a star in liquid form. And, a bit of tuna...?" desc = "The taste of a star in liquid form. And, a bit of tuna...?"
icon_state = "starkist" icon_state = "starkist"
center_of_mass = list("x"=16, "y"=10) center_of_mass = list("x"=16, "y"=10)
@@ -111,7 +60,7 @@
reagents.add_reagent("brownstar", 30) reagents.add_reagent("brownstar", 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/space_up /obj/item/weapon/reagent_containers/food/drinks/cans/space_up
name = "Space-Up" name = "\improper Space-Up"
desc = "Tastes like a hull breach in your mouth." desc = "Tastes like a hull breach in your mouth."
icon_state = "space-up" icon_state = "space-up"
center_of_mass = list("x"=16, "y"=10) center_of_mass = list("x"=16, "y"=10)
@@ -120,7 +69,7 @@
reagents.add_reagent("space_up", 30) reagents.add_reagent("space_up", 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/lemon_lime /obj/item/weapon/reagent_containers/food/drinks/cans/lemon_lime
name = "Lemon-Lime" name = "\improper Lemon-Lime"
desc = "You wanted ORANGE. It gave you Lemon Lime." desc = "You wanted ORANGE. It gave you Lemon Lime."
icon_state = "lemon-lime" icon_state = "lemon-lime"
center_of_mass = list("x"=16, "y"=10) center_of_mass = list("x"=16, "y"=10)
@@ -129,7 +78,7 @@
reagents.add_reagent("lemon_lime", 30) reagents.add_reagent("lemon_lime", 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea
name = "Vrisk Serket Iced Tea" name = "\improper Vrisk Serket Iced Tea"
desc = "That sweet, refreshing southern earthy flavor. That's where it's from, right? South Earth?" desc = "That sweet, refreshing southern earthy flavor. That's where it's from, right? South Earth?"
icon_state = "ice_tea_can" icon_state = "ice_tea_can"
center_of_mass = list("x"=16, "y"=10) center_of_mass = list("x"=16, "y"=10)
@@ -138,7 +87,7 @@
reagents.add_reagent("icetea", 30) reagents.add_reagent("icetea", 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice /obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice
name = "Grapel Juice" name = "\improper Grapel Juice"
desc = "500 pages of rules of how to appropriately enter into a combat with this juice!" desc = "500 pages of rules of how to appropriately enter into a combat with this juice!"
icon_state = "purple_can" icon_state = "purple_can"
center_of_mass = list("x"=16, "y"=10) center_of_mass = list("x"=16, "y"=10)
@@ -147,7 +96,7 @@
reagents.add_reagent("grapejuice", 30) reagents.add_reagent("grapejuice", 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/tonic /obj/item/weapon/reagent_containers/food/drinks/cans/tonic
name = "T-Borg's Tonic Water" name = "\improper T-Borg's Tonic Water"
desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
icon_state = "tonic" icon_state = "tonic"
center_of_mass = list("x"=16, "y"=10) center_of_mass = list("x"=16, "y"=10)
@@ -156,7 +105,7 @@
reagents.add_reagent("tonic", 50) reagents.add_reagent("tonic", 50)
/obj/item/weapon/reagent_containers/food/drinks/cans/sodawater /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater
name = "Soda Water" name = "soda water"
desc = "A can of soda water. Still water's more refreshing cousin." desc = "A can of soda water. Still water's more refreshing cousin."
icon_state = "sodawater" icon_state = "sodawater"
center_of_mass = list("x"=16, "y"=10) center_of_mass = list("x"=16, "y"=10)

View File

@@ -14,12 +14,18 @@
return return
attack_self(mob/user as mob) attack_self(mob/user as mob)
return if(!is_open_container())
open(user)
attack(mob/M as mob, mob/user as mob, def_zone) proc/open(mob/user)
if(standard_feed_mob(user, M)) playsound(loc,'sound/effects/canopen.ogg', rand(10,50), 1)
user << "<span class='notice'>You open [src] with an audible pop!</span>"
flags |= OPENCONTAINER
attack(mob/M as mob, mob/user as mob, def_zone)
if(standard_feed_mob(user, M))
return return
return 0 return 0
afterattack(obj/target, mob/user, proximity) afterattack(obj/target, mob/user, proximity)
@@ -29,7 +35,24 @@
return return
if(standard_pour_into(user, target)) if(standard_pour_into(user, target))
return return
return ..()
standard_feed_mob(var/mob/user, var/mob/target)
if(!is_open_container())
user << "<span class='notice'>You need to open [src]!</span>"
return 1
return ..()
standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target)
if(!is_open_container())
user << "<span class='notice'>You need to open [src]!</span>"
return 1
return ..()
standard_pour_into(var/mob/user, var/atom/target)
if(!is_open_container())
user << "<span class='notice'>You need to open [src]!</span>"
return 1
return ..() return ..()
self_feed_message(var/mob/user) self_feed_message(var/mob/user)

View File

@@ -4,19 +4,51 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle /obj/item/weapon/reagent_containers/food/drinks/bottle
amount_per_transfer_from_this = 10 amount_per_transfer_from_this = 10
volume = 120 volume = 100
item_state = "broken_beer" //Generic held-item sprite until unique ones are made. item_state = "broken_beer" //Generic held-item sprite until unique ones are made.
var/const/duration = 13 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets) force = 5
var/smash_duration = 5 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets)
var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it
var/obj/item/weapon/reagent_containers/glass/rag/rag = null
var/rag_underlay = "rag"
/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target as mob, mob/living/user as mob) /obj/item/weapon/reagent_containers/food/drinks/bottle/Destroy()
rag = null
..()
//when thrown on impact, bottles smash and spill their contents
/obj/item/weapon/reagent_containers/food/drinks/bottle/throw_impact(atom/hit_atom, var/speed)
..()
var/mob/M = thrower
if(isGlass && istype(M) && M.a_intent == I_HURT)
var/throw_dist = get_dist(throw_source, loc)
if(speed >= throw_speed && smash_check(throw_dist)) //not as reliable as smashing directly
if(reagents)
hit_atom.visible_message("<span class='notice'>The contents of the [src] splash all over [hit_atom]!</span>")
reagents.splash(hit_atom, reagents.total_volume)
src.smash(loc, hit_atom)
/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash_check(var/distance)
if(!isGlass || !smash_duration)
return 0
var/list/chance_table = list(90, 90, 85, 85, 60, 35, 15) //starting from distance 0
var/idx = max(distance + 1, 1) //since list indices start at 1
if(idx > chance_table.len)
return 0
return prob(chance_table[idx])
/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(var/newloc, atom/against = null)
if(ismob(loc))
var/mob/M = loc
M.drop_from_inventory(src)
//Creates a shattering noise and replaces the bottle with a broken_bottle //Creates a shattering noise and replaces the bottle with a broken_bottle
user.drop_item() var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(newloc)
var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(user.loc)
user.put_in_active_hand(B)
if(prob(33)) if(prob(33))
new/obj/item/weapon/material/shard(target.loc) // Create a glass shard at the target's location! new/obj/item/weapon/material/shard(newloc) // Create a glass shard at the target's location!
B.icon_state = src.icon_state B.icon_state = src.icon_state
var/icon/I = new('icons/obj/drinks.dmi', src.icon_state) var/icon/I = new('icons/obj/drinks.dmi', src.icon_state)
@@ -24,23 +56,68 @@
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0)) I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
B.icon = I B.icon = I
if(rag && rag.on_fire && isliving(against))
rag.forceMove(loc)
var/mob/living/L = against
L.IgniteMob()
playsound(src, "shatter", 70, 1) playsound(src, "shatter", 70, 1)
user.put_in_active_hand(B)
src.transfer_fingerprints_to(B) src.transfer_fingerprints_to(B)
qdel(src) qdel(src)
return B
/obj/item/weapon/reagent_containers/food/drinks/bottle/attackby(obj/item/W, mob/user)
if(!rag && istype(W, /obj/item/weapon/reagent_containers/glass/rag))
insert_rag(W, user)
return
if(rag && istype(W, /obj/item/weapon/flame))
rag.attackby(W, user)
return
..()
/obj/item/weapon/reagent_containers/food/drinks/bottle/attack_self(mob/user)
if(rag)
remove_rag(user)
else
..()
/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/insert_rag(obj/item/weapon/reagent_containers/glass/rag/R, mob/user)
if(!isGlass || rag) return
if(user.unEquip(R))
user << "<span class='notice'>You stuff [R] into [src].</span>"
rag = R
rag.forceMove(src)
flags &= ~OPENCONTAINER
update_icon()
/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/remove_rag(mob/user)
if(!rag) return
user.put_in_hands(rag)
rag = null
flags |= (initial(flags) & OPENCONTAINER)
update_icon()
/obj/item/weapon/reagent_containers/food/drinks/bottle/open(mob/user)
if(rag) return
..()
/obj/item/weapon/reagent_containers/food/drinks/bottle/update_icon()
underlays.Cut()
if(rag)
var/underlay_image = image(icon='icons/obj/drinks.dmi', icon_state=rag.on_fire? "[rag_underlay]_lit" : rag_underlay)
underlays += underlay_image
copy_light(rag)
else
set_light(0)
/obj/item/weapon/reagent_containers/food/drinks/bottle/attack(mob/living/target as mob, mob/living/user as mob) /obj/item/weapon/reagent_containers/food/drinks/bottle/attack(mob/living/target as mob, mob/living/user as mob)
if(!target) if(!target)
return return
if(user.a_intent != I_HURT || !isGlass) if(user.a_intent != I_HURT || !isGlass)
return ..() return ..()
force = 15 //Smashing bottles over someoen's head hurts.
var/obj/item/organ/external/affecting = user.zone_sel.selecting //Find what the player is aiming at var/obj/item/organ/external/affecting = user.zone_sel.selecting //Find what the player is aiming at
var/armor_block = 0 //Get the target's armour values for normal attack damage. var/armor_block = 0 //Get the target's armour values for normal attack damage.
@@ -48,13 +125,16 @@
//Calculating duration and calculating damage. //Calculating duration and calculating damage.
armor_block = target.run_armor_check(affecting, "melee") armor_block = target.run_armor_check(affecting, "melee")
armor_duration = duration + force - target.getarmor(affecting, "melee")
//force will counteract armour, but will never increase duration
armor_duration = smash_duration + min(0, force - target.getarmor(affecting, "melee") + 10)
//Apply the damage! //Apply the damage!
target.apply_damage(force, BRUTE, affecting, armor_block, sharp=0) target.apply_damage(force, BRUTE, affecting, armor_block, sharp=0)
// You are going to knock someone out for longer if they are not wearing a helmet. // You are going to knock someone out for longer if they are not wearing a helmet.
if(affecting == "head" && istype(target, /mob/living/carbon/)) var/do_smash = smash_check(1) //won't always break on the first hit
if(affecting == "head" && istype(target, /mob/living/carbon/) && do_smash)
//Display an attack message. //Display an attack message.
for(var/mob/O in viewers(user, null)) for(var/mob/O in viewers(user, null))
@@ -62,8 +142,7 @@
else O.show_message(text("\red <B>[target] hit \himself with a bottle of [src.name] on the head!</B>"), 1) else O.show_message(text("\red <B>[target] hit \himself with a bottle of [src.name] on the head!</B>"), 1)
//Weaken the target for the duration that we calculated and divide it by 5. //Weaken the target for the duration that we calculated and divide it by 5.
if(armor_duration) if(armor_duration)
target.apply_effect(min(armor_duration, 10) , WEAKEN, armor_block) // Never weaken more than a flash! target.apply_effect(min(armor_duration, 5) , WEAKEN, armor_block) // Never weaken more than a flash!
else else
//Default attack message and don't weaken the target. //Default attack message and don't weaken the target.
for(var/mob/O in viewers(user, null)) for(var/mob/O in viewers(user, null))
@@ -75,13 +154,15 @@
target.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been smashed with a bottle by [user.name] ([user.ckey])</font>") target.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been smashed with a bottle by [user.name] ([user.ckey])</font>")
msg_admin_attack("[user.name] ([user.ckey]) attacked [target.name] ([target.ckey]) with a bottle. (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)") msg_admin_attack("[user.name] ([user.ckey]) attacked [target.name] ([target.ckey]) with a bottle. (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
//The reagents in the bottle splash all over the target, thanks for the idea Nodrak if(do_smash)
if(reagents) //The reagents in the bottle splash all over the target, thanks for the idea Nodrak
user.visible_message("<span class='notice'>The contents of the [src] splash all over [target]!</span>") if(reagents)
reagents.splash(target, reagents.total_volume) user.visible_message("<span class='notice'>The contents of the [src] splash all over [target]!</span>")
reagents.splash(target, reagents.total_volume)
//Finally, smash the bottle. This kills (qdel) the bottle. //Finally, smash the bottle. This kills (qdel) the bottle.
src.smash(target, user) var/obj/item/weapon/broken_bottle/B = src.smash(target.loc, target)
user.put_in_active_hand(B)
return return
@@ -92,8 +173,8 @@
desc = "A bottle with a sharp broken bottom." desc = "A bottle with a sharp broken bottom."
icon = 'icons/obj/drinks.dmi' icon = 'icons/obj/drinks.dmi'
icon_state = "broken_bottle" icon_state = "broken_bottle"
force = 9.0 force = 9
throwforce = 5.0 throwforce = 5
throw_speed = 3 throw_speed = 3
throw_range = 5 throw_range = 5
item_state = "beer" item_state = "beer"
@@ -314,3 +395,31 @@
New() New()
..() ..()
reagents.add_reagent("limejuice", 100) reagents.add_reagent("limejuice", 100)
//Small bottles
/obj/item/weapon/reagent_containers/food/drinks/bottle/small
volume = 50
smash_duration = 1
flags = 0 //starts closed
rag_underlay = "rag_small"
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer
name = "space beer"
desc = "Contains only water, malt and hops."
icon_state = "beer"
center_of_mass = list("x"=16, "y"=12)
New()
..()
reagents.add_reagent("beer", 30)
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale
name = "\improper Magm-Ale"
desc = "A true dorf's drink of choice."
icon_state = "alebottle"
item_state = "beer"
center_of_mass = list("x"=16, "y"=10)
New()
..()
reagents.add_reagent("ale", 30)

View File

@@ -463,6 +463,7 @@
desc = "An egg!" desc = "An egg!"
icon_state = "egg" icon_state = "egg"
filling_color = "#FDFFD1" filling_color = "#FDFFD1"
volume = 10
/obj/item/weapon/reagent_containers/food/snacks/egg/New() /obj/item/weapon/reagent_containers/food/snacks/egg/New()
..() ..()

View File

@@ -58,8 +58,6 @@
<I>This spell opens nearby doors and does not require wizard garb.</I><BR> <I>This spell opens nearby doors and does not require wizard garb.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=horseman'>Curse of the Horseman</A> (15)<BR> <A href='byond://?src=\ref[src];spell_choice=horseman'>Curse of the Horseman</A> (15)<BR>
<I>This spell will curse a person to wear an unremovable horse mask (it has glue on the inside) and speak like a horse. It does not require wizard garb.</I><BR> <I>This spell will curse a person to wear an unremovable horse mask (it has glue on the inside) and speak like a horse. It does not require wizard garb.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=fleshtostone'>Flesh to Stone</A> (60)<BR>
<I>This spell will curse a person to immediately turn into an unmoving statue. The effect will eventually wear off if the statue is not destroyed.</I><BR>
<A href='byond://?src=\ref[src];spell_choice=noclothes'>Remove Clothes Requirement</A> <b>Warning: this takes away 2 spell choices.</b><BR> <A href='byond://?src=\ref[src];spell_choice=noclothes'>Remove Clothes Requirement</A> <b>Warning: this takes away 2 spell choices.</b><BR>
<HR> <HR>
<B>Artefacts:</B><BR> <B>Artefacts:</B><BR>
@@ -123,7 +121,7 @@
uses-- uses--
/* /*
*/ */
var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", subjugation = "Subjugation", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", staffchange = "Staff of Change", mentalfocus = "Mental Focus", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", noclothes = "No Clothes",fleshtostone = "Flesh to Stone") var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", subjugation = "Subjugation", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", staffchange = "Staff of Change", mentalfocus = "Mental Focus", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", noclothes = "No Clothes")
var/already_knows = 0 var/already_knows = 0
for(var/spell/aspell in H.spell_list) for(var/spell/aspell in H.spell_list)
if(available_spells[href_list["spell_choice"]] == initial(aspell.name)) if(available_spells[href_list["spell_choice"]] == initial(aspell.name))

View File

@@ -0,0 +1,22 @@
// Mostly for debugging table connections
// This file is not #included in the .dme.
/obj/structure/table/debug
New()
material = get_material_by_name("debugium")
..()
/material/debug
name = "debugium"
stack_type = /obj/item/stack/material/debug
icon_base = "debug"
icon_reinf = "rdebug"
icon_colour = "#FFFFFF"
/obj/item/stack/material/debug
name = "debugium"
icon = 'icons/obj/tables.dmi'
icon_state = "debugium"
default_type = "debugium"

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