mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-13 11:43:31 +00:00
Merge branch 'dev' into ofBeesAndHoney
Conflicts: code/modules/materials/material_recipes.dm
This commit is contained in:
@@ -4,8 +4,8 @@ sudo: false
|
||||
|
||||
env:
|
||||
BYOND_MAJOR="508"
|
||||
BYOND_MINOR="1287"
|
||||
MACRO_COUNT=1234
|
||||
BYOND_MINOR="1293"
|
||||
MACRO_COUNT=1230
|
||||
|
||||
cache:
|
||||
directories:
|
||||
|
||||
@@ -607,6 +607,7 @@
|
||||
#include "code\game\objects\items\devices\scanners.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\t_scanner.dm"
|
||||
#include "code\game\objects\items\devices\taperecorder.dm"
|
||||
#include "code\game\objects\items\devices\traitordevices.dm"
|
||||
#include "code\game\objects\items\devices\transfer_valve.dm"
|
||||
@@ -1115,6 +1116,7 @@
|
||||
#include "code\modules\mob\animations.dm"
|
||||
#include "code\modules\mob\death.dm"
|
||||
#include "code\modules\mob\emote.dm"
|
||||
#include "code\modules\mob\gender.dm"
|
||||
#include "code\modules\mob\hear_say.dm"
|
||||
#include "code\modules\mob\holder.dm"
|
||||
#include "code\modules\mob\inventory.dm"
|
||||
|
||||
@@ -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_CLOSED_LAYER 3.1 //Above most items if closed
|
||||
#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 SCREEN_LAYER 22 //Mob HUD/effects layer
|
||||
|
||||
|
||||
@@ -94,3 +94,13 @@
|
||||
#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/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)
|
||||
|
||||
@@ -210,23 +210,14 @@ proc/listclearnulls(list/list)
|
||||
return (result + R.Copy(Ri, 0))
|
||||
|
||||
//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(!L)
|
||||
testing("sortAtom() called with null as first parameter!")
|
||||
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
|
||||
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
|
||||
/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/Ri=1
|
||||
var/list/result = new()
|
||||
@@ -239,14 +230,8 @@ proc/listclearnulls(list/list)
|
||||
result += R[Ri++]
|
||||
|
||||
if(Li <= L.len)
|
||||
. = (result + L.Copy(Li, 0))
|
||||
if(!.)
|
||||
testing("mergeAtoms returning [.]")
|
||||
return
|
||||
. = (result + R.Copy(Ri, 0))
|
||||
if(!.)
|
||||
testing("mergeAtoms returning [.]")
|
||||
return
|
||||
return (result + L.Copy(Li, 0))
|
||||
return (result + R.Copy(Ri, 0))
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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/storage/fancy/cigarettes/dromedaryco,
|
||||
/obj/item/weapon/lipstick/random,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/ale,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/ale,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/beer,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/beer,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/beer,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/beer)
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Party equipment"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
/datum/antagonist/proc/create_objectives(var/datum/mind/player)
|
||||
if(config.objectives_disabled)
|
||||
return 0
|
||||
if(create_global_objectives())
|
||||
if(create_global_objectives() || global_objectives.len)
|
||||
player.objectives |= global_objectives
|
||||
return 1
|
||||
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
for(var/datum/mind/P in current_antagonists)
|
||||
text += print_player_full(P)
|
||||
text += get_special_objective_text(P)
|
||||
var/failed
|
||||
if(!global_objectives.len && P.objectives && P.objectives.len)
|
||||
var/failed
|
||||
var/num = 1
|
||||
for(var/datum/objective/O in P.objectives)
|
||||
text += print_objective(O, num)
|
||||
@@ -20,8 +20,6 @@
|
||||
feedback_add_details(feedback_tag,"[O.type]|FAIL")
|
||||
failed = 1
|
||||
num++
|
||||
|
||||
if(!config.objectives_disabled)
|
||||
if(failed)
|
||||
text += "<br><font color='red'><B>The [role_text] has failed.</B></font>"
|
||||
else
|
||||
|
||||
@@ -21,9 +21,14 @@
|
||||
if(auto_init && ticker && ticker.current_state == GAME_STATE_PLAYING)
|
||||
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()
|
||||
if(isnull(gcDestroyed) && loc)
|
||||
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))
|
||||
// testing("GC: [type] was deleted via GC without qdel()") //Not really a huge issue but from now on, please qdel()
|
||||
// else
|
||||
@@ -34,6 +39,7 @@
|
||||
. = ..()
|
||||
if(reagents)
|
||||
qdel(reagents)
|
||||
reagents = null
|
||||
for(var/atom/movable/AM in contents)
|
||||
qdel(AM)
|
||||
loc = null
|
||||
|
||||
@@ -286,7 +286,6 @@ var/global/list/additional_antag_types = list()
|
||||
/datum/game_mode/proc/declare_completion()
|
||||
|
||||
var/is_antag_mode = (antag_templates && antag_templates.len)
|
||||
if(!config.objectives_disabled)
|
||||
check_victory()
|
||||
if(is_antag_mode)
|
||||
sleep(10)
|
||||
@@ -395,8 +394,8 @@ var/global/list/additional_antag_types = list()
|
||||
|
||||
if (special_role in disregard_roles)
|
||||
continue
|
||||
else if(man.client.prefs.nanotrasen_relation == "Opposed" && prob(50) || \
|
||||
man.client.prefs.nanotrasen_relation == "Skeptical" && prob(20))
|
||||
else if(man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED && prob(50) || \
|
||||
man.client.prefs.nanotrasen_relation == COMPANY_SKEPTICAL && prob(20))
|
||||
suspects += man
|
||||
// Antags
|
||||
else if(special_role_data && prob(special_role_data.suspicion_chance))
|
||||
@@ -562,9 +561,9 @@ proc/get_nt_opposed()
|
||||
var/list/dudes = list()
|
||||
for(var/mob/living/carbon/human/man in player_list)
|
||||
if(man.client)
|
||||
if(man.client.prefs.nanotrasen_relation == "Opposed")
|
||||
if(man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED)
|
||||
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
|
||||
if(dudes.len == 0) return null
|
||||
return pick(dudes)
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
|
||||
/datum/intercept_text/proc/get_suspect()
|
||||
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
|
||||
for(var/i = 0, i < max(player_list.len/10,2), i++)
|
||||
dudes += pick(player_list)
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
spawn_positions = -1
|
||||
supervisors = "absolutely everyone"
|
||||
selection_color = "#dddddd"
|
||||
economic_modifier = 1
|
||||
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")
|
||||
|
||||
@@ -16,6 +16,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
access = list() //See get_access()
|
||||
minimal_access = list() //See get_access()
|
||||
minimal_player_age = 14
|
||||
economic_modifier = 20
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
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
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 10
|
||||
economic_modifier = 10
|
||||
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_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of personnel"
|
||||
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)
|
||||
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
|
||||
supervisors = "the quartermaster and the head of personnel"
|
||||
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)
|
||||
minimal_access = list(access_mining, access_mining_station, access_mailsorting)
|
||||
alt_titles = list("Drill Technician","Prospector")
|
||||
@@ -311,6 +313,7 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "Nanotrasen officials and Corporate Regulations"
|
||||
selection_color = "#dddddd"
|
||||
economic_modifier = 7
|
||||
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)
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
selection_color = "#ffeeaa"
|
||||
idtype = /obj/item/weapon/card/id/silver
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 10
|
||||
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_heads, access_construction, access_sec_doors,
|
||||
@@ -53,6 +54,7 @@
|
||||
spawn_positions = 5
|
||||
supervisors = "the chief engineer"
|
||||
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)
|
||||
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")
|
||||
@@ -89,6 +91,7 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the chief engineer"
|
||||
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)
|
||||
minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
var/department = null // Does this position have a department tag?
|
||||
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)
|
||||
return 1
|
||||
|
||||
@@ -34,6 +37,37 @@
|
||||
H.species.equip_survival_gear(H,0)
|
||||
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()
|
||||
/datum/job/proc/equip_preview(mob/living/carbon/human/H)
|
||||
return equip(H)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
selection_color = "#ffddf0"
|
||||
idtype = /obj/item/weapon/card/id/silver
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 10
|
||||
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_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks)
|
||||
@@ -44,6 +45,7 @@
|
||||
spawn_positions = 3
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#ffeef0"
|
||||
economic_modifier = 7
|
||||
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)
|
||||
alt_titles = list("Surgeon","Emergency Physician","Nurse","Virologist")
|
||||
@@ -106,6 +108,7 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#ffeef0"
|
||||
economic_modifier = 5
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
||||
minimal_access = list(access_medical, access_chemistry)
|
||||
alt_titles = list("Pharmacist")
|
||||
@@ -136,6 +139,7 @@
|
||||
spawn_positions = 0
|
||||
supervisors = "the chief medical officer and research director"
|
||||
selection_color = "#ffeef0"
|
||||
economic_modifier = 7
|
||||
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)
|
||||
|
||||
@@ -162,6 +166,7 @@
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
economic_modifier = 5
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#ffeef0"
|
||||
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
|
||||
supervisors = "the chief medical officer"
|
||||
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)
|
||||
minimal_access = list(access_medical, access_medical_equip, access_eva, access_maint_tunnels, access_external_airlocks)
|
||||
alt_titles = list("Emergency Medical Technician")
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
selection_color = "#ffddff"
|
||||
idtype = /obj/item/weapon/card/id/silver
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 15
|
||||
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
|
||||
access_tox_storage, access_teleporter, access_sec_doors,
|
||||
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
|
||||
@@ -47,6 +48,7 @@
|
||||
spawn_positions = 3
|
||||
supervisors = "the research director"
|
||||
selection_color = "#ffeeff"
|
||||
economic_modifier = 7
|
||||
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)
|
||||
alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher")
|
||||
@@ -76,6 +78,7 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the research director"
|
||||
selection_color = "#ffeeff"
|
||||
economic_modifier = 7
|
||||
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)
|
||||
alt_titles = list("Xenobotanist")
|
||||
@@ -105,6 +108,7 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "research director"
|
||||
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.
|
||||
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")
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
selection_color = "#ffdddd"
|
||||
idtype = /obj/item/weapon/card/id/silver
|
||||
req_admin_notify = 1
|
||||
economic_modifier = 10
|
||||
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_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
|
||||
@@ -54,6 +55,7 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of security"
|
||||
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)
|
||||
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
|
||||
@@ -91,7 +93,7 @@
|
||||
supervisors = "the head of security"
|
||||
selection_color = "#ffeeee"
|
||||
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)
|
||||
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
|
||||
alt_titles = list("Forensic Technician")
|
||||
@@ -133,6 +135,7 @@
|
||||
spawn_positions = 3
|
||||
supervisors = "the head of security"
|
||||
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)
|
||||
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_external_airlocks)
|
||||
minimal_player_age = 3
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
supervisors = "your laws"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 7
|
||||
|
||||
account_allowed = 0
|
||||
economic_modifier = 0
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
return 1
|
||||
@@ -40,6 +41,8 @@
|
||||
selection_color = "#ddffdd"
|
||||
minimal_player_age = 1
|
||||
alt_titles = list("Android", "Robot")
|
||||
account_allowed = 0
|
||||
economic_modifier = 0
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
|
||||
@@ -392,6 +392,7 @@ var/global/datum/controller/occupations/job_master
|
||||
spawn_in_storage += thing
|
||||
//Equip job items.
|
||||
job.equip(H)
|
||||
job.setup_account(H)
|
||||
job.equip_backpack(H)
|
||||
job.equip_survival(H)
|
||||
job.apply_fingerprints(H)
|
||||
@@ -428,21 +429,6 @@ var/global/datum/controller/occupations/job_master
|
||||
H.buckled.loc = H.loc
|
||||
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(H.mind && job.head_position)
|
||||
var/remembered_info = ""
|
||||
@@ -455,9 +441,6 @@ var/global/datum/controller/occupations/job_master
|
||||
|
||||
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
|
||||
if(H.mind)
|
||||
H.mind.assigned_role = rank
|
||||
|
||||
@@ -333,7 +333,7 @@
|
||||
|
||||
/datum/autolathe/recipe/magazine_c20r
|
||||
name = "ammunition (12mm)"
|
||||
path = /obj/item/ammo_magazine/a12mm
|
||||
path = /obj/item/ammo_magazine/a10mm
|
||||
hidden = 1
|
||||
category = "Arms and Ammunition"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
/*
|
||||
// Edit by Atlantis: Commented out as emergency fix due to causing extreme delays in communications.
|
||||
// Apply some lag based on traffic rates
|
||||
var/netlag = round(traffic / 50)
|
||||
if(netlag > signal.data["slow"])
|
||||
signal.data["slow"] = netlag
|
||||
|
||||
*/
|
||||
// Loop through all linked machines and send the signal or copy.
|
||||
for(var/obj/machinery/telecomms/machine in links)
|
||||
if(filter && !istype( machine, text2path(filter) ))
|
||||
|
||||
@@ -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/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/kahlua = 5,/obj/item/weapon/reagent_containers/food/drinks/cans/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/kahlua = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 6,
|
||||
/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/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,
|
||||
|
||||
@@ -7,60 +7,6 @@ GAS ANALYZER
|
||||
MASS SPECTROMETER
|
||||
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
|
||||
name = "health analyzer"
|
||||
|
||||
135
code/game/objects/items/devices/t_scanner.dm
Normal file
135
code/game/objects/items/devices/t_scanner.dm
Normal 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
|
||||
@@ -131,7 +131,7 @@ datum/uplink_item/dd_SortValue()
|
||||
path = /obj/item/ammo_magazine/a357
|
||||
|
||||
/datum/uplink_item/item/ammo/mc9mm
|
||||
name = ".9mm"
|
||||
name = "9mm"
|
||||
path = /obj/item/ammo_magazine/mc9mm
|
||||
|
||||
/datum/uplink_item/item/ammo/darts
|
||||
@@ -142,6 +142,14 @@ datum/uplink_item/dd_SortValue()
|
||||
name = "14.5mm"
|
||||
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 *
|
||||
***************************************/
|
||||
@@ -188,6 +196,17 @@ datum/uplink_item/dd_SortValue()
|
||||
item_cost = DEFAULT_TELECRYSTAL_AMOUNT
|
||||
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 *
|
||||
*************************************/
|
||||
|
||||
@@ -68,10 +68,7 @@
|
||||
|
||||
if (istype(E, /datum/stack_recipe_list))
|
||||
var/datum/stack_recipe_list/srl = E
|
||||
if (src.get_amount() >= srl.req_amount)
|
||||
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>"
|
||||
t1 += "<a href='?src=\ref[src];sublist=[i]'>[srl.title]</a>"
|
||||
|
||||
if (istype(E, /datum/stack_recipe))
|
||||
var/datum/stack_recipe/R = E
|
||||
@@ -360,8 +357,6 @@
|
||||
/datum/stack_recipe_list
|
||||
var/title = "ERROR"
|
||||
var/list/recipes = null
|
||||
var/req_amount = 1
|
||||
New(title, recipes, req_amount = 1)
|
||||
New(title, recipes)
|
||||
src.title = title
|
||||
src.recipes = recipes
|
||||
src.req_amount = req_amount
|
||||
|
||||
@@ -100,10 +100,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
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
|
||||
|
||||
/obj/item/clothing/mask/smokable/Destroy()
|
||||
..()
|
||||
qdel(reagents)
|
||||
|
||||
/obj/item/clothing/mask/smokable/process()
|
||||
var/turf/location = get_turf(src)
|
||||
smoketime--
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
|
||||
/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/cans/beer(src)
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/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)
|
||||
|
||||
@@ -146,11 +146,6 @@
|
||||
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
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigarettes/Destroy()
|
||||
qdel(reagents)
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigarettes/update_icon()
|
||||
icon_state = "[initial(icon_state)][contents.len]"
|
||||
return
|
||||
@@ -202,10 +197,6 @@
|
||||
new /obj/item/clothing/mask/smokable/cigarette/cigar(src)
|
||||
create_reagents(15 * storage_slots)
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigar/Destroy()
|
||||
qdel(reagents)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigar/update_icon()
|
||||
icon_state = "[initial(icon_state)][contents.len]"
|
||||
return
|
||||
|
||||
@@ -25,6 +25,16 @@ LINEN BINS
|
||||
add_fingerprint(user)
|
||||
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
|
||||
icon_state = "sheetblue"
|
||||
|
||||
@@ -11,16 +11,16 @@
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/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/bottle/small/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||
return
|
||||
|
||||
/obj/structure/closet/secure_closet/bar/update_icon()
|
||||
|
||||
@@ -42,11 +42,11 @@
|
||||
/obj/structure/closet/syndicate/nuclear/New()
|
||||
..()
|
||||
|
||||
new /obj/item/ammo_magazine/a12mm(src)
|
||||
new /obj/item/ammo_magazine/a12mm(src)
|
||||
new /obj/item/ammo_magazine/a12mm(src)
|
||||
new /obj/item/ammo_magazine/a12mm(src)
|
||||
new /obj/item/ammo_magazine/a12mm(src)
|
||||
new /obj/item/ammo_magazine/a10mm(src)
|
||||
new /obj/item/ammo_magazine/a10mm(src)
|
||||
new /obj/item/ammo_magazine/a10mm(src)
|
||||
new /obj/item/ammo_magazine/a10mm(src)
|
||||
new /obj/item/ammo_magazine/a10mm(src)
|
||||
new /obj/item/weapon/storage/box/handcuffs(src)
|
||||
new /obj/item/weapon/storage/box/flashbangs(src)
|
||||
new /obj/item/weapon/gun/energy/gun(src)
|
||||
|
||||
@@ -395,7 +395,7 @@
|
||||
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))
|
||||
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))
|
||||
var/obj/item/weapon/melee/baton/B = O
|
||||
@@ -413,7 +413,7 @@
|
||||
user.visible_message( \
|
||||
"<span class='danger'>[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.
|
||||
else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
|
||||
return
|
||||
|
||||
@@ -239,6 +239,7 @@
|
||||
if(istype(W, /obj/item/weapon/screwdriver))
|
||||
if(reinf && state >= 1)
|
||||
state = 3 - state
|
||||
update_nearby_icons()
|
||||
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>")
|
||||
else if(reinf && state == 0)
|
||||
@@ -337,7 +338,11 @@
|
||||
/obj/structure/window/Destroy()
|
||||
density = 0
|
||||
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,33 +362,29 @@
|
||||
//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()
|
||||
update_icon()
|
||||
for(var/direction in cardinal)
|
||||
for(var/obj/structure/window/W in get_step(src,direction) )
|
||||
for(var/obj/structure/window/W in orange(src, 1))
|
||||
W.update_icon()
|
||||
|
||||
//merges adjacent full-tile windows into one (blatant ripoff from game/smoothwall.dm)
|
||||
/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.
|
||||
//this way it will only update full-tile ones
|
||||
//This spawn is here so windows get properly updated when one gets deleted.
|
||||
spawn(2)
|
||||
if(!src) return
|
||||
overlays.Cut()
|
||||
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
|
||||
var/list/dirs = list()
|
||||
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]"
|
||||
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
|
||||
|
||||
@@ -466,11 +467,9 @@
|
||||
basestate = "window"
|
||||
maxhealth = 40
|
||||
reinf = 1
|
||||
basestate = "w"
|
||||
dir = 5
|
||||
|
||||
update_icon() //icon_state has to be set manually
|
||||
return
|
||||
|
||||
/obj/structure/window/reinforced/polarized
|
||||
name = "electrochromic window"
|
||||
desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it."
|
||||
|
||||
@@ -197,7 +197,7 @@ var/list/mechtoys = list(
|
||||
|
||||
// Sell phoron and platinum
|
||||
if(istype(A, /obj/item/stack))
|
||||
var/obj/item/stack/P
|
||||
var/obj/item/stack/P = A
|
||||
switch(P.get_material_name())
|
||||
if("phoron") phoron_count += P.get_amount()
|
||||
if("platinum") plat_count += P.get_amount()
|
||||
|
||||
@@ -6,16 +6,16 @@
|
||||
|
||||
if(density)
|
||||
can_open = WALL_OPENING
|
||||
set_wall_state("[material.icon_base]fwall_open")
|
||||
//flick("[material.icon_base]fwall_opening", src)
|
||||
sleep(15)
|
||||
density = 0
|
||||
update_icon()
|
||||
set_light(0)
|
||||
else
|
||||
can_open = WALL_OPENING
|
||||
//flick("[material.icon_base]fwall_closing", src)
|
||||
set_wall_state("[material.icon_base]0")
|
||||
density = 1
|
||||
update_icon()
|
||||
sleep(15)
|
||||
set_light(1)
|
||||
|
||||
@@ -208,7 +208,7 @@
|
||||
construction_stage = 5
|
||||
new /obj/item/stack/rods( src )
|
||||
user << "<span class='notice'>You cut the outer grille.</span>"
|
||||
set_wall_state()
|
||||
update_icon()
|
||||
return
|
||||
if(5)
|
||||
if (istype(W, /obj/item/weapon/screwdriver))
|
||||
@@ -217,7 +217,7 @@
|
||||
if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 5)
|
||||
return
|
||||
construction_stage = 4
|
||||
set_wall_state()
|
||||
update_icon()
|
||||
user << "<span class='notice'>You remove the support lines.</span>"
|
||||
return
|
||||
else if( istype(W, /obj/item/stack/rods) )
|
||||
@@ -225,7 +225,7 @@
|
||||
if(O.get_amount()>0)
|
||||
O.use(1)
|
||||
construction_stage = 6
|
||||
set_wall_state()
|
||||
update_icon()
|
||||
user << "<span class='notice'>You replace the outer grille.</span>"
|
||||
return
|
||||
if(4)
|
||||
@@ -247,7 +247,7 @@
|
||||
if(!do_after(user, 60) || !istype(src, /turf/simulated/wall) || construction_stage != 4)
|
||||
return
|
||||
construction_stage = 3
|
||||
set_wall_state()
|
||||
update_icon()
|
||||
user << "<span class='notice'>You press firmly on the cover, dislodging it.</span>"
|
||||
return
|
||||
if(3)
|
||||
@@ -257,7 +257,7 @@
|
||||
if(!do_after(user,100) || !istype(src, /turf/simulated/wall) || construction_stage != 3)
|
||||
return
|
||||
construction_stage = 2
|
||||
set_wall_state()
|
||||
update_icon()
|
||||
user << "<span class='notice'>You pry off the cover.</span>"
|
||||
return
|
||||
if(2)
|
||||
@@ -267,7 +267,7 @@
|
||||
if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 2)
|
||||
return
|
||||
construction_stage = 1
|
||||
set_wall_state()
|
||||
update_icon()
|
||||
user << "<span class='notice'>You remove the bolts anchoring the support rods.</span>"
|
||||
return
|
||||
if(1)
|
||||
@@ -287,7 +287,7 @@
|
||||
if(!do_after(user,70) || !istype(src, /turf/simulated/wall) || construction_stage != 1)
|
||||
return
|
||||
construction_stage = 0
|
||||
set_wall_state()
|
||||
update_icon()
|
||||
new /obj/item/stack/rods(src)
|
||||
user << "<span class='notice'>The support rods drop out as you cut them loose from the frame.</span>"
|
||||
return
|
||||
|
||||
@@ -21,58 +21,19 @@
|
||||
name = "[material.display_name] wall"
|
||||
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)
|
||||
set_light(1)
|
||||
else if(material.opacity < 0.5 && opacity)
|
||||
set_light(0)
|
||||
|
||||
update_connections(1)
|
||||
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)
|
||||
material = newmaterial
|
||||
reinf_material = newrmaterial
|
||||
update_material()
|
||||
check_relatives()
|
||||
check_relatives(1)
|
||||
|
||||
/turf/simulated/wall/proc/update_icon()
|
||||
if(!material)
|
||||
@@ -81,16 +42,38 @@
|
||||
if(!damage_overlays[1]) //list hasn't been populated
|
||||
generate_overlays()
|
||||
|
||||
if(density)
|
||||
check_relatives(1)
|
||||
else
|
||||
set_wall_state("[material.icon_base]fwall_open")
|
||||
overlays.Cut()
|
||||
var/image/I
|
||||
|
||||
if(damage == 0)
|
||||
if(damage_overlay != 0)
|
||||
overlays -= damage_overlays[damage_overlay]
|
||||
damage_overlay = 0
|
||||
else if(density)
|
||||
if(!density)
|
||||
I = image('icons/turf/wall_masks.dmi', "[material.icon_base]fwall_open")
|
||||
I.color = material.icon_colour
|
||||
overlays += I
|
||||
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
|
||||
if(reinf_material)
|
||||
integrity += reinf_material.integrity
|
||||
@@ -99,12 +82,7 @@
|
||||
if(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]
|
||||
damage_overlay = overlay
|
||||
return
|
||||
|
||||
/turf/simulated/wall/proc/generate_overlays()
|
||||
@@ -116,25 +94,21 @@
|
||||
img.alpha = (i * alpha_inc) - 1
|
||||
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)
|
||||
return
|
||||
var/junction
|
||||
if(update_self)
|
||||
junction = 0
|
||||
for(var/checkdir in cardinal)
|
||||
var/turf/simulated/wall/T = get_step(src, checkdir)
|
||||
if(!istype(T) || !T.material)
|
||||
var/list/dirs = list()
|
||||
for(var/turf/simulated/wall/W in orange(src, 1))
|
||||
if(!W.material)
|
||||
continue
|
||||
if(update_self)
|
||||
if(can_join_with(T))
|
||||
junction |= get_dir(src,T) //Not too sure why, but using checkdir just breaks walls.
|
||||
else
|
||||
T.check_relatives(1)
|
||||
if(!isnull(junction))
|
||||
set_wall_state("[material.icon_base][junction]")
|
||||
return
|
||||
if(propagate)
|
||||
W.update_connections()
|
||||
W.update_icon()
|
||||
if(can_join_with(W))
|
||||
dirs += get_dir(src, W)
|
||||
|
||||
wall_connections = dirs_to_corner_states(dirs)
|
||||
|
||||
/turf/simulated/wall/proc/can_join_with(var/turf/simulated/wall/W)
|
||||
if(material && W.material && material.icon_base == W.material.icon_base)
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
var/list/global/wall_cache = list()
|
||||
|
||||
/turf/simulated/wall
|
||||
name = "wall"
|
||||
desc = "A huge chunk of metal used to seperate rooms."
|
||||
@@ -21,6 +19,8 @@ var/list/global/wall_cache = list()
|
||||
var/last_state
|
||||
var/construction_stage
|
||||
|
||||
var/list/wall_connections = list("0", "0", "0", "0")
|
||||
|
||||
/turf/simulated/wall/New(var/newloc, var/materialtype, var/rmaterialtype)
|
||||
..(newloc)
|
||||
icon_state = "blank"
|
||||
@@ -171,7 +171,7 @@ var/list/global/wall_cache = list()
|
||||
clear_plants()
|
||||
material = get_material_by_name("placeholder")
|
||||
reinf_material = null
|
||||
check_relatives()
|
||||
update_connections(1)
|
||||
|
||||
ChangeTurf(/turf/simulated/floor/plating)
|
||||
|
||||
|
||||
@@ -1401,7 +1401,7 @@ datum/preferences
|
||||
backbag = backbaglist.Find(new_backbag)
|
||||
|
||||
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)
|
||||
nanotrasen_relation = new_relation
|
||||
|
||||
|
||||
@@ -275,6 +275,41 @@ BLIND // can't see anything
|
||||
update_icon(user)
|
||||
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)
|
||||
|
||||
overlays.Cut()
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
name = "mounted grenade launcher"
|
||||
desc = "A shoulder-mounted micro-explosive dispenser."
|
||||
selectable = 1
|
||||
icon_state = "grenadelauncher"
|
||||
icon_state = "grenade"
|
||||
|
||||
interface_name = "integrated grenade launcher"
|
||||
interface_desc = "Discharges loaded grenades against the wearer's location."
|
||||
|
||||
@@ -14,33 +14,207 @@
|
||||
var/track_blood = 0
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/rag
|
||||
name = "damp rag"
|
||||
name = "rag"
|
||||
desc = "For cleaning up messes, you suppose."
|
||||
w_class = 1
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "rag"
|
||||
amount_per_transfer_from_this = 5
|
||||
possible_transfer_amounts = list(5)
|
||||
volume = 5
|
||||
volume = 10
|
||||
can_be_placed_into = null
|
||||
flags = OPENCONTAINER | NOBLUDGEON
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/rag/attack_self(mob/user as mob)
|
||||
return
|
||||
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/attack(atom/target as obj|turf|area, mob/user as mob , flag)
|
||||
if(ismob(target) && target.reagents && reagents.total_volume)
|
||||
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")
|
||||
reagents.trans_to_mob(target, reagents.total_volume, CHEM_INGEST)
|
||||
return
|
||||
else
|
||||
/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/afterattack(atom/A as obj|turf|area, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if(istype(A) && src in user)
|
||||
user.visible_message("[user] starts to wipe down [A] with [src]!")
|
||||
if(do_after(user,30))
|
||||
user.visible_message("[user] finishes wiping off the [A]!")
|
||||
A.clean_blood()
|
||||
/obj/item/weapon/reagent_containers/glass/rag/attack_self(mob/user as mob)
|
||||
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)
|
||||
if(isliving(target))
|
||||
var/mob/living/M = target
|
||||
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 ..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/rag/afterattack(atom/A as obj|turf|area, mob/user as mob, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
|
||||
if(istype(A, /obj/structure/reagent_dispensers))
|
||||
if(!reagents.get_free_space())
|
||||
user << "<span class='warning'>\The [src] is already soaked.</span>"
|
||||
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--
|
||||
|
||||
@@ -46,6 +46,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:
|
||||
//Corporation NanoTrasen - Generalised / high tech research and phoron exploitation.
|
||||
//Corporation Vessel Contracting - Ship and station construction, materials research.
|
||||
|
||||
@@ -36,6 +36,20 @@
|
||||
return
|
||||
else
|
||||
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
|
||||
..()
|
||||
|
||||
@@ -81,6 +95,7 @@
|
||||
icon_state = "book-5"
|
||||
|
||||
|
||||
|
||||
/obj/structure/bookcase/manuals/medical
|
||||
name = "Medical Manuals bookcase"
|
||||
|
||||
|
||||
@@ -122,6 +122,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
|
||||
density = 1
|
||||
var/arcanecheckout = 0
|
||||
var/screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book
|
||||
var/sortby = "author"
|
||||
var/buffer_book
|
||||
var/buffer_mob
|
||||
var/upload_category = "Fiction"
|
||||
@@ -195,9 +196,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
|
||||
else
|
||||
dat += {"<A href='?src=\ref[src];orderbyid=1'>(Order book by SS<sup>13</sup>BN)</A><BR><BR>
|
||||
<table>
|
||||
<tr><td>AUTHOR</td><td>TITLE</td><td>CATEGORY</td><td></td></tr>"}
|
||||
|
||||
var/DBQuery/query = dbcon_old.NewQuery("SELECT id, author, title, category FROM library")
|
||||
<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]")
|
||||
query.Execute()
|
||||
|
||||
while(query.NextRow())
|
||||
@@ -389,6 +389,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
|
||||
if(isnum(orderid))
|
||||
var/nhref = "src=\ref[src];targetid=[orderid]"
|
||||
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.updateUsrDialog()
|
||||
return
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
|
||||
if(.) update_light()
|
||||
|
||||
/atom/proc/copy_light(atom/A)
|
||||
set_light(A.light_range, A.light_power, A.light_color)
|
||||
|
||||
/atom/proc/update_light()
|
||||
if(!light_power || !light_range)
|
||||
if(light)
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
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("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( \
|
||||
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), \
|
||||
@@ -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("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), \
|
||||
), 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("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("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), \
|
||||
), 4)
|
||||
))
|
||||
|
||||
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)
|
||||
@@ -86,7 +86,7 @@
|
||||
|
||||
/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()
|
||||
..()
|
||||
@@ -106,6 +106,7 @@
|
||||
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 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()
|
||||
..()
|
||||
@@ -124,4 +125,4 @@
|
||||
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("yellow folder", /obj/item/weapon/folder/yellow), \
|
||||
), 3)
|
||||
))
|
||||
|
||||
@@ -359,7 +359,7 @@ var/list/name_to_material
|
||||
weight = 15
|
||||
door_icon_base = "stone"
|
||||
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
|
||||
wire_product = /obj/item/stack/light_w
|
||||
rod_product = /obj/item/stack/material/glass/reinforced
|
||||
@@ -417,9 +417,8 @@ var/list/name_to_material
|
||||
return 1
|
||||
|
||||
var/build_path = /obj/structure/windoor_assembly
|
||||
var/sheets_needed = 4
|
||||
var/sheets_needed = window_options[choice]
|
||||
if(choice == "Windoor")
|
||||
sheets_needed = 5
|
||||
build_dir = user.dir
|
||||
else
|
||||
build_path = created_window
|
||||
@@ -450,7 +449,7 @@ var/list/name_to_material
|
||||
weight = 30
|
||||
stack_origin_tech = "materials=2"
|
||||
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
|
||||
wire_product = null
|
||||
rod_product = null
|
||||
|
||||
@@ -318,7 +318,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if(following && following == target)
|
||||
return
|
||||
following = target
|
||||
src << "\blue Now following [target]"
|
||||
src << "<span class='notice'>Now following [target]</span>"
|
||||
if(ismob(target))
|
||||
loc = get_turf(target)
|
||||
var/mob/M = target
|
||||
M.following_mobs += src
|
||||
else
|
||||
spawn(0)
|
||||
while(target && following == target && client)
|
||||
var/turf/T = get_turf(target)
|
||||
@@ -329,6 +334,41 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
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)
|
||||
return 0
|
||||
|
||||
|
||||
56
code/modules/mob/gender.dm
Normal file
56
code/modules/mob/gender.dm
Normal 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"
|
||||
@@ -5,10 +5,12 @@
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
slot_flags = SLOT_HEAD
|
||||
sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi')
|
||||
origin_tech = null
|
||||
item_icons = list(
|
||||
slot_l_hand_str = 'icons/mob/items/lefthand_holder.dmi',
|
||||
slot_r_hand_str = 'icons/mob/items/righthand_holder.dmi',
|
||||
)
|
||||
pixel_y = 8
|
||||
|
||||
/obj/item/weapon/holder/New()
|
||||
..()
|
||||
@@ -31,6 +33,38 @@
|
||||
|
||||
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)
|
||||
for(var/mob/M in src.contents)
|
||||
M.attackby(W,user)
|
||||
@@ -50,72 +84,5 @@
|
||||
grabber << "You scoop up [src]."
|
||||
src << "[grabber] scoops you up."
|
||||
grabber.status_flags |= PASSEMOTES
|
||||
H.sync(src)
|
||||
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"
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
universal_understand = 1
|
||||
universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea.
|
||||
holder_type = /obj/item/weapon/holder/diona
|
||||
var/obj/item/hat
|
||||
|
||||
/mob/living/carbon/alien/diona/New()
|
||||
|
||||
@@ -32,3 +33,10 @@
|
||||
/mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands.
|
||||
W.loc = get_turf(src)
|
||||
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()
|
||||
@@ -6,5 +6,22 @@
|
||||
return
|
||||
get_scooped(H)
|
||||
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
|
||||
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 ..()
|
||||
@@ -6,3 +6,7 @@
|
||||
icon_state = "[initial(icon_state)]_sleep"
|
||||
else
|
||||
icon_state = "[initial(icon_state)]"
|
||||
|
||||
overlays.Cut()
|
||||
if(hat)
|
||||
overlays |= get_hat_icon(hat, 0, -8)
|
||||
@@ -17,6 +17,9 @@
|
||||
germ_level++
|
||||
|
||||
/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)
|
||||
qdel(guts)
|
||||
for(var/food in stomach_contents)
|
||||
|
||||
@@ -24,46 +24,18 @@
|
||||
if(wear_mask)
|
||||
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 "
|
||||
|
||||
//big suits/masks/helmets make it hard to tell their gender
|
||||
if(!skipjumpsuit || !skipface)
|
||||
var/datum/gender/T = gender_datums[gender]
|
||||
if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender
|
||||
T = gender_datums[PLURAL]
|
||||
else
|
||||
if(icon)
|
||||
msg += "\icon[icon] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated
|
||||
switch(gender)
|
||||
if(MALE)
|
||||
t_He = "He"
|
||||
t_he = "he"
|
||||
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"
|
||||
|
||||
if(!T)
|
||||
// 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.
|
||||
CRASH("Gender datum was null; key was '[(skipjumpsuit && skipface) ? PLURAL : gender]'")
|
||||
|
||||
msg += "<EM>[src.name]</EM>"
|
||||
if(species.name != "Human")
|
||||
@@ -80,111 +52,111 @@
|
||||
tie_msg += ". Attached to it is [lowertext(english_list(U.accessories))]"
|
||||
|
||||
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
|
||||
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
|
||||
if(head)
|
||||
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
|
||||
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
|
||||
if(wear_suit)
|
||||
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
|
||||
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
|
||||
if(s_store && !skipsuitstorage)
|
||||
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
|
||||
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
|
||||
if(back)
|
||||
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
|
||||
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
|
||||
if(l_hand)
|
||||
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
|
||||
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
|
||||
if(r_hand)
|
||||
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
|
||||
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
|
||||
if(gloves && !skipgloves)
|
||||
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
|
||||
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)
|
||||
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?
|
||||
if(handcuffed)
|
||||
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
|
||||
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
|
||||
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
|
||||
if(belt)
|
||||
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
|
||||
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
|
||||
if(shoes && !skipshoes)
|
||||
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
|
||||
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)
|
||||
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
|
||||
if(wear_mask && !skipmask)
|
||||
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
|
||||
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
|
||||
if(glasses && !skipeyes)
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
if(wear_id)
|
||||
@@ -196,70 +168,71 @@
|
||||
var/obj/item/weapon/card/id/idcard = wear_id
|
||||
id = idcard.registered_name
|
||||
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*/
|
||||
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
|
||||
if(is_jittery)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
|
||||
var/obj/item/organ/external/o = get_organ(organ)
|
||||
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)
|
||||
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)
|
||||
msg += "[t_He] [t_is] small halfling!\n"
|
||||
msg += "[T.He] [T.is] small halfling!\n"
|
||||
|
||||
var/distance = get_dist(usr,src)
|
||||
if(istype(usr, /mob/dead/observer) || usr.stat == 2) // ghosts can see anything
|
||||
distance = 1
|
||||
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)
|
||||
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))
|
||||
usr.visible_message("<b>[usr]</b> checks [src]'s pulse.", "You check [src]'s pulse.")
|
||||
spawn(15)
|
||||
if(distance <= 1 && usr.stat != 1)
|
||||
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
|
||||
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)
|
||||
msg += "[t_He] [t_is] covered in some liquid.\n"
|
||||
msg += "[T.He] [T.is] covered in some liquid.\n"
|
||||
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'>"
|
||||
|
||||
if(nutrition < 100)
|
||||
msg += "[t_He] [t_is] severely malnourished.\n"
|
||||
msg += "[T.He] [T.is] severely malnourished.\n"
|
||||
else if(nutrition >= 500)
|
||||
/*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*/
|
||||
msg += "[t_He] [t_is] quite chubby.\n"
|
||||
msg += "[T.He] [T.is] quite chubby.\n"
|
||||
|
||||
msg += "</span>"
|
||||
|
||||
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(!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)
|
||||
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/is_destroyed = list()
|
||||
@@ -273,9 +246,9 @@
|
||||
|
||||
var/obj/item/organ/external/E = organs_by_name[organ_tag]
|
||||
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())
|
||||
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
|
||||
is_destroyed["organ_descriptor"] = 0
|
||||
continue
|
||||
@@ -284,24 +257,24 @@
|
||||
if(temp)
|
||||
if(temp.status & ORGAN_DESTROYED)
|
||||
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
|
||||
if(temp.status & ORGAN_ROBOT)
|
||||
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
|
||||
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)
|
||||
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)
|
||||
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
|
||||
wound_flavor_text["[temp.name]"] = ""
|
||||
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))
|
||||
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.
|
||||
//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)))))
|
||||
msg += wound_flavor_text["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.
|
||||
msg += wound_flavor_text["upper body"]
|
||||
@@ -369,11 +342,11 @@
|
||||
display_shoes = 1
|
||||
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
@@ -382,9 +355,9 @@
|
||||
for(var/limb in is_bleeding)
|
||||
msg += is_bleeding[limb]
|
||||
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)
|
||||
msg += "[t_He] [t_is] repulsively uncanny!\n"
|
||||
msg += "[T.He] [T.is] repulsively uncanny!\n"
|
||||
|
||||
if(hasHUD(usr,"security"))
|
||||
var/perpname = "wot"
|
||||
@@ -438,7 +411,7 @@
|
||||
if (pose)
|
||||
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.
|
||||
msg += "\n[t_He] [t_is] [pose]"
|
||||
msg += "\n[T.He] [T.is] [pose]"
|
||||
|
||||
user << msg
|
||||
|
||||
|
||||
@@ -207,8 +207,7 @@
|
||||
|
||||
|
||||
/mob/living/carbon/human/show_inv(mob/user as mob)
|
||||
// TODO : Change to incapacitated() on merge.
|
||||
if(user.stat || user.lying || user.resting || user.buckled)
|
||||
if(user.incapacitated())
|
||||
return
|
||||
|
||||
var/obj/item/clothing/under/suit = null
|
||||
@@ -1023,22 +1022,28 @@
|
||||
|
||||
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()
|
||||
|
||||
for(var/obj/item/organ/external/organ in src.organs)
|
||||
if(organ.status & ORGAN_SPLINTED) //Splints prevent movement.
|
||||
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.
|
||||
// All kinds of embedded objects cause bleeding.
|
||||
var/msg = null
|
||||
switch(rand(1,3))
|
||||
if(1)
|
||||
msg ="<span class='warning'>A spike of pain jolts your [organ.name] as you bump [O] inside.</span>"
|
||||
if(2)
|
||||
msg ="<span class='warning'>Your movement jostles [O] in your [organ.name] painfully.</span>"
|
||||
if(3)
|
||||
msg ="<span class='warning'>[O] in your [organ.name] twists painfully as you move.</span>"
|
||||
if(species.flags & NO_PAIN)
|
||||
src << "<span class='warning'>You feel [O] moving inside your [organ.name].</span>"
|
||||
else
|
||||
var/msg = pick( \
|
||||
"<span class='warning'>A spike of pain jolts your [organ.name] as you bump [O] inside.</span>", \
|
||||
"<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>")
|
||||
src << msg
|
||||
|
||||
organ.take_damage(rand(1,3), 0, 0)
|
||||
|
||||
@@ -134,11 +134,12 @@
|
||||
continue
|
||||
|
||||
if(E.is_broken() || E.is_dislocated())
|
||||
if(E.body_part == HAND_LEFT)
|
||||
switch(E.body_part)
|
||||
if(HAND_LEFT, ARM_LEFT)
|
||||
if(!l_hand)
|
||||
continue
|
||||
drop_from_inventory(l_hand)
|
||||
else
|
||||
if(HAND_RIGHT, ARM_RIGHT)
|
||||
if(!r_hand)
|
||||
continue
|
||||
drop_from_inventory(r_hand)
|
||||
@@ -147,12 +148,12 @@
|
||||
emote("me", 1, "[(species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
|
||||
|
||||
else if(E.is_malfunctioning())
|
||||
|
||||
if(E.body_part == HAND_LEFT)
|
||||
switch(E.body_part)
|
||||
if(HAND_LEFT, ARM_LEFT)
|
||||
if(!l_hand)
|
||||
continue
|
||||
drop_from_inventory(l_hand)
|
||||
else
|
||||
if(HAND_RIGHT, ARM_RIGHT)
|
||||
if(!r_hand)
|
||||
continue
|
||||
drop_from_inventory(r_hand)
|
||||
|
||||
@@ -1015,6 +1015,10 @@
|
||||
|
||||
// Check everything else.
|
||||
|
||||
//Periodically double-check embedded_flag
|
||||
if(embedded_flag && !(life_tick % 10))
|
||||
if(!embedded_needs_process())
|
||||
embedded_flag = 0
|
||||
//Vision
|
||||
var/obj/item/organ/vision
|
||||
if(species.vision_organ)
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
bump_flag = MONKEY
|
||||
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
|
||||
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)
|
||||
if(H.stat != CONSCIOUS)
|
||||
@@ -47,10 +46,6 @@
|
||||
if(prob(1))
|
||||
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()
|
||||
return "[lowertext(name)] ([rand(100,999)])"
|
||||
|
||||
@@ -66,7 +61,6 @@
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#333333"
|
||||
tail = "farwatail"
|
||||
holder_type = /obj/item/weapon/holder/monkey/farwa
|
||||
|
||||
/datum/species/monkey/skrell
|
||||
name = "Neara"
|
||||
@@ -81,7 +75,6 @@
|
||||
blood_color = "#1D2CBF"
|
||||
reagent_tag = IS_SKRELL
|
||||
tail = null
|
||||
holder_type = /obj/item/weapon/holder/monkey/neaera
|
||||
|
||||
/datum/species/monkey/unathi
|
||||
name = "Stok"
|
||||
@@ -96,4 +89,3 @@
|
||||
flesh_color = "#34AF10"
|
||||
base_color = "#066000"
|
||||
reagent_tag = IS_UNATHI
|
||||
holder_type = /obj/item/weapon/holder/monkey/stok
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
if(!slot_to_strip || !istype(user))
|
||||
return
|
||||
|
||||
// TODO : Change to incapacitated() on merge.
|
||||
if(user.stat || user.lying || user.resting || user.buckled)
|
||||
if(user.incapacitated())
|
||||
user << browse(null, text("window=mob[src.name]"))
|
||||
return
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
..()
|
||||
|
||||
if (transforming)
|
||||
return
|
||||
if(!loc)
|
||||
@@ -125,7 +127,8 @@
|
||||
|
||||
//this handles hud updates. Calls update_vision() and handle_hud_icons()
|
||||
/mob/living/handle_regular_hud_updates()
|
||||
if(!client) return 0
|
||||
if(!client)
|
||||
return 0
|
||||
..()
|
||||
|
||||
handle_vision()
|
||||
|
||||
@@ -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>"
|
||||
msg_admin_attack("[key_name(user)] knifed [key_name(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" )
|
||||
return
|
||||
|
||||
/mob/living/incapacitated()
|
||||
if(stat || paralysis || stunned || weakened || restrained())
|
||||
return 1
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person)
|
||||
small = 1
|
||||
pass_flags = 1
|
||||
holder_type = /obj/item/weapon/holder/pai
|
||||
|
||||
var/network = "SS13"
|
||||
var/obj/machinery/camera/current = null
|
||||
|
||||
@@ -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
|
||||
name = "drone"
|
||||
real_name = "drone"
|
||||
@@ -29,9 +49,26 @@
|
||||
var/module_type = /obj/item/weapon/robot_module/drone
|
||||
var/can_pull_size = 2
|
||||
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
|
||||
|
||||
/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()
|
||||
|
||||
..()
|
||||
@@ -82,6 +119,8 @@
|
||||
overlays += "eyes-[icon_state]"
|
||||
else
|
||||
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()
|
||||
return
|
||||
@@ -89,10 +128,25 @@
|
||||
/mob/living/silicon/robot/drone/pick_module()
|
||||
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/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
/mob/living/silicon/robot/drone/proc/wear_hat(var/obj/item/new_hat)
|
||||
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>"
|
||||
return
|
||||
|
||||
@@ -279,13 +333,6 @@
|
||||
/mob/living/silicon/robot/drone/remove_robot_verbs()
|
||||
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()
|
||||
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."
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
mail_destination = ""
|
||||
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
|
||||
|
||||
//Auto flush if we use this verb inside a disposal chute.
|
||||
var/obj/machinery/disposal/D = src.loc
|
||||
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
|
||||
|
||||
return
|
||||
@@ -27,5 +27,11 @@
|
||||
if(H.a_intent == "help")
|
||||
get_scooped(H)
|
||||
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
|
||||
return ..()
|
||||
@@ -14,6 +14,7 @@
|
||||
/obj/item/weapon/firealarm_electronics,
|
||||
/obj/item/weapon/airalarm_electronics,
|
||||
/obj/item/weapon/airlock_electronics,
|
||||
/obj/item/weapon/tracker_electronics,
|
||||
/obj/item/weapon/module/power_control,
|
||||
/obj/item/weapon/stock_parts,
|
||||
/obj/item/frame,
|
||||
|
||||
@@ -78,7 +78,8 @@
|
||||
flick("h_lathe_leave",src)
|
||||
|
||||
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.master_fabricator = src
|
||||
|
||||
@@ -90,7 +91,6 @@
|
||||
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."
|
||||
|
||||
|
||||
if(ticker.current_state < GAME_STATE_PLAYING)
|
||||
src << "<span class='danger'>The game hasn't started yet!</span>"
|
||||
return
|
||||
@@ -113,12 +113,6 @@
|
||||
return
|
||||
|
||||
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/pluralcheck = "minute"
|
||||
if(deathtimeminutes == 0)
|
||||
|
||||
@@ -996,7 +996,7 @@
|
||||
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>"
|
||||
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(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>"
|
||||
|
||||
@@ -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/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)
|
||||
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
|
||||
E.reagents.add_reagent("enzyme", 2 * amount)
|
||||
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)
|
||||
|
||||
/obj/item/weapon/robot_module/miner
|
||||
|
||||
@@ -59,8 +59,13 @@
|
||||
var/mob/dead/observer/spook = locate() in range(src,5)
|
||||
if(spook)
|
||||
var/turf/T = spook.loc
|
||||
var/obj/O = pick(T.contents)
|
||||
visible_emote("suddenly stops and stares at something unseen[istype(O) ? " near [O]":""].")
|
||||
var/list/visible = list()
|
||||
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()
|
||||
//if our target is neither inside a turf or inside a human(???), stop
|
||||
|
||||
@@ -63,13 +63,6 @@
|
||||
|
||||
if(!body_color)
|
||||
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_living = "mouse_[body_color]"
|
||||
icon_dead = "mouse_[body_color]_dead"
|
||||
@@ -125,17 +118,14 @@
|
||||
/mob/living/simple_animal/mouse/white
|
||||
body_color = "white"
|
||||
icon_state = "mouse_white"
|
||||
holder_type = /obj/item/weapon/holder/mouse/white
|
||||
|
||||
/mob/living/simple_animal/mouse/gray
|
||||
body_color = "gray"
|
||||
icon_state = "mouse_gray"
|
||||
holder_type = /obj/item/weapon/holder/mouse/gray
|
||||
|
||||
/mob/living/simple_animal/mouse/brown
|
||||
body_color = "brown"
|
||||
icon_state = "mouse_brown"
|
||||
holder_type = /obj/item/weapon/holder/mouse/brown
|
||||
|
||||
//TOM IS ALIVE! SQUEEEEEEEE~K :)
|
||||
/mob/living/simple_animal/mouse/brown/Tom
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
rapid = 1
|
||||
icon_state = "syndicateranged"
|
||||
icon_living = "syndicateranged"
|
||||
casingtype = /obj/item/ammo_casing/a12mm
|
||||
casingtype = /obj/item/ammo_casing/a10mm
|
||||
projectilesound = 'sound/weapons/Gunshot_light.ogg'
|
||||
projectiletype = /obj/item/projectile/bullet/pistol/medium
|
||||
|
||||
|
||||
@@ -153,7 +153,7 @@
|
||||
return
|
||||
|
||||
/mob/proc/incapacitated()
|
||||
return
|
||||
return (stat || paralysis || stunned || weakened || restrained())
|
||||
|
||||
/mob/proc/restrained()
|
||||
return
|
||||
@@ -872,6 +872,9 @@
|
||||
visible_implants += O
|
||||
return visible_implants
|
||||
|
||||
/mob/proc/embedded_needs_process()
|
||||
return (embedded.len > 0)
|
||||
|
||||
mob/proc/yank_out_object()
|
||||
set category = "Object"
|
||||
set name = "Yank out object"
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
var/joint = "joint" // Descriptive string used in dislocation.
|
||||
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/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
|
||||
|
||||
/obj/item/organ/external/Destroy()
|
||||
|
||||
@@ -107,6 +107,15 @@
|
||||
return
|
||||
|
||||
/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)
|
||||
if(rigged && (Holiday == "April Fool's Day"))
|
||||
if(spam_flag == 0)
|
||||
@@ -442,6 +451,10 @@
|
||||
B.update_icon()
|
||||
|
||||
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
|
||||
if ( istype(RP) && RP.mode == 2 )
|
||||
RP.RenamePaper(user,src)
|
||||
|
||||
@@ -17,7 +17,17 @@
|
||||
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( !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
|
||||
|
||||
|
||||
@@ -110,18 +110,18 @@
|
||||
/obj/item/ammo_magazine/c9mm/empty
|
||||
initial_ammo = 0
|
||||
|
||||
/obj/item/ammo_magazine/a12mm
|
||||
name = "magazine (12mm)"
|
||||
/obj/item/ammo_magazine/a10mm
|
||||
name = "magazine (10mm)"
|
||||
icon_state = "12mm"
|
||||
origin_tech = list(TECH_COMBAT = 2)
|
||||
mag_type = MAGAZINE
|
||||
caliber = "12mm"
|
||||
caliber = "10mm"
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1500)
|
||||
ammo_type = "/obj/item/ammo_casing/a12mm"
|
||||
ammo_type = /obj/item/ammo_casing/a10mm
|
||||
max_ammo = 20
|
||||
multiple_sprites = 1
|
||||
|
||||
/obj/item/ammo_magazine/a12mm/empty
|
||||
/obj/item/ammo_magazine/a10mm/empty
|
||||
initial_ammo = 0
|
||||
|
||||
/obj/item/ammo_magazine/a556
|
||||
|
||||
@@ -64,9 +64,9 @@
|
||||
caliber = ".45"
|
||||
projectile_type = /obj/item/projectile/energy/flash
|
||||
|
||||
/obj/item/ammo_casing/a12mm
|
||||
desc = "A 12mm bullet casing."
|
||||
caliber = "12mm"
|
||||
/obj/item/ammo_casing/a10mm
|
||||
desc = "A 10mm bullet casing."
|
||||
caliber = "10mm"
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/medium
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/weapon/gun/energy/laser
|
||||
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"
|
||||
item_state = "laser"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
@@ -17,15 +17,15 @@
|
||||
use_external_power = 1
|
||||
|
||||
/obj/item/weapon/gun/energy/laser/practice
|
||||
name = "practice laser gun"
|
||||
desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice."
|
||||
name = "practice laser carbine"
|
||||
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
|
||||
|
||||
obj/item/weapon/gun/energy/retro
|
||||
name = "retro laser"
|
||||
icon_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'
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = 3
|
||||
@@ -36,7 +36,7 @@ obj/item/weapon/gun/energy/retro
|
||||
name = "antique laser gun"
|
||||
icon_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
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
slot_flags = SLOT_BELT
|
||||
@@ -78,8 +78,8 @@ obj/item/weapon/gun/energy/retro
|
||||
fire_delay = 1
|
||||
|
||||
/obj/item/weapon/gun/energy/sniperrifle
|
||||
name = "\improper L.W.A.P. sniper rifle"
|
||||
desc = "A high-power laser rifle fitted with a SMART aiming-system scope."
|
||||
name = "marksman energy rifle"
|
||||
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"
|
||||
item_state = "laser"
|
||||
fire_sound = 'sound/weapons/marauder.ogg'
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/weapon/gun/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"
|
||||
item_state = null //so the human update icon uses the icon_state instead.
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/weapon/gun/energy/ionrifle
|
||||
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"
|
||||
item_state = "ionrifle"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/weapon/gun/energy/taser
|
||||
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"
|
||||
item_state = null //so the human update icon uses the icon_state instead.
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
/obj/item/weapon/gun/energy/stunrevolver
|
||||
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"
|
||||
item_state = "stunrevolver"
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
|
||||
@@ -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
|
||||
name = "submachine gun"
|
||||
desc = "A lightweight, fast firing gun. Uses 9mm rounds."
|
||||
name = "prototype SMG"
|
||||
desc = "A protoype lightweight, fast firing gun. Uses 9mm rounds."
|
||||
icon_state = "saber" //ugly
|
||||
w_class = 3
|
||||
load_method = SPEEDLOADER //yup. until someone sprites a magazine for it.
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/mini_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"
|
||||
w_class = 3
|
||||
load_method = SPEEDLOADER //yup. until someone sprites a magazine for it.
|
||||
@@ -30,18 +30,18 @@
|
||||
ammo_type = /obj/item/ammo_casing/c45
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/c20r
|
||||
name = "\improper C-20r SMG"
|
||||
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"
|
||||
name = "submachine gun"
|
||||
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"
|
||||
item_state = "c20r"
|
||||
w_class = 3
|
||||
force = 10
|
||||
caliber = "12mm"
|
||||
caliber = "10mm"
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
|
||||
slot_flags = SLOT_BELT|SLOT_BACK
|
||||
fire_sound = 'sound/weapons/Gunshot_light.ogg'
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/a12mm
|
||||
magazine_type = /obj/item/ammo_magazine/a10mm
|
||||
auto_eject = 1
|
||||
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
|
||||
|
||||
@@ -54,8 +54,8 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/sts35
|
||||
name = "\improper STS-35 automatic rifle"
|
||||
desc = "A durable, rugged looking automatic weapon of a make popular on the frontier worlds. Uses 7.62mm rounds. It is unmarked."
|
||||
name = "assault rifle"
|
||||
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"
|
||||
item_state = null
|
||||
w_class = 4
|
||||
@@ -78,8 +78,8 @@
|
||||
update_held_icon()
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/wt550
|
||||
name = "\improper W-T 550 Saber"
|
||||
desc = "A cheap, mass produced Ward-Takahashi PDW. Uses 9mm rounds."
|
||||
name = "machine pistol"
|
||||
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"
|
||||
item_state = "wt550"
|
||||
w_class = 3
|
||||
@@ -100,8 +100,8 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/z8
|
||||
name = "\improper Z8 Bulldog"
|
||||
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."
|
||||
name = "bullpup assault rifle"
|
||||
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"
|
||||
item_state = "z8carbine"
|
||||
w_class = 4
|
||||
@@ -166,8 +166,8 @@
|
||||
user << "\The [launcher] is empty."
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/l6_saw
|
||||
name = "\improper L6 SAW"
|
||||
desc = "A rather traditionally made light machine gun with a pleasantly lacquered wooden pistol grip. Has 'Aussec Armoury- 2531' engraved on the reciever"
|
||||
name = "light machine gun"
|
||||
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"
|
||||
item_state = "l6closedmag"
|
||||
w_class = 4
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
/obj/item/weapon/gun/projectile/dartgun
|
||||
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"
|
||||
item_state = null
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/weapon/gun/projectile/colt
|
||||
name = "\improper Colt M1911"
|
||||
desc = "A cheap Martian knock-off of a Colt M1911."
|
||||
name = "vintage .45 pistol"
|
||||
desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds."
|
||||
magazine_type = /obj/item/ammo_magazine/c45m
|
||||
icon_state = "colt"
|
||||
caliber = ".45"
|
||||
@@ -9,7 +9,6 @@
|
||||
load_method = MAGAZINE
|
||||
|
||||
/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
|
||||
|
||||
/obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun()
|
||||
@@ -31,8 +30,8 @@
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/gun/projectile/sec
|
||||
desc = "A NanoTrasen designed sidearm, found pretty much everywhere humans are. Uses .45 rounds."
|
||||
name = "\improper NT Mk58"
|
||||
name = ".45 pistol"
|
||||
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"
|
||||
magazine_type = /obj/item/ammo_magazine/c45m/rubber
|
||||
caliber = ".45"
|
||||
@@ -41,12 +40,12 @@
|
||||
load_method = MAGAZINE
|
||||
|
||||
/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
|
||||
|
||||
/obj/item/weapon/gun/projectile/sec/wood
|
||||
desc = "A Nanotrasen designed sidearm, this one has a sweet wooden grip. Uses .45 rounds."
|
||||
name = "\improper Custom NT Mk58"
|
||||
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 = "custom .45 Pistol"
|
||||
icon_state = "secgundark"
|
||||
|
||||
/obj/item/weapon/gun/projectile/silenced
|
||||
@@ -106,8 +105,8 @@
|
||||
icon_state = "gyropistol"
|
||||
|
||||
/obj/item/weapon/gun/projectile/pistol
|
||||
name = "\improper Stechtkin pistol"
|
||||
desc = "A small, easily concealable gun. Uses 9mm rounds."
|
||||
name = "holdout pistol"
|
||||
desc = "The Lumoco Arms P3 Whisper. A small, easily concealable gun. Uses 9mm rounds."
|
||||
icon_state = "pistol"
|
||||
item_state = null
|
||||
w_class = 2
|
||||
@@ -119,8 +118,7 @@
|
||||
magazine_type = /obj/item/ammo_magazine/mc9mm
|
||||
|
||||
/obj/item/weapon/gun/projectile/pistol/flash
|
||||
name = "\improper Stechtkin signal pistol"
|
||||
desc = "A small, easily concealable gun. Uses 9mm rounds."
|
||||
name = "holdout signal pistol"
|
||||
magazine_type = /obj/item/ammo_magazine/mc9mm/flash
|
||||
|
||||
/obj/item/weapon/gun/projectile/pistol/attack_hand(mob/user as mob)
|
||||
@@ -178,7 +176,7 @@
|
||||
/obj/item/ammo_casing/a357 = ".357",
|
||||
/obj/item/ammo_casing/c9mmf = "9mm",
|
||||
/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/pellet = "12 gauge",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/weapon/gun/projectile/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"
|
||||
item_state = "revolver"
|
||||
caliber = "357"
|
||||
@@ -11,7 +11,6 @@
|
||||
|
||||
/obj/item/weapon/gun/projectile/revolver/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"
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/weapon/gun/projectile/shotgun/pump
|
||||
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"
|
||||
item_state = "shotgun"
|
||||
max_shells = 4
|
||||
@@ -41,6 +41,7 @@
|
||||
|
||||
/obj/item/weapon/gun/projectile/shotgun/pump/combat
|
||||
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"
|
||||
item_state = "cshotgun"
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/weapon/gun/projectile/heavysniper
|
||||
name = "\improper PTR-7 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."
|
||||
name = "anti-materiel rifle"
|
||||
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"
|
||||
item_state = "l6closednomag" //placeholder
|
||||
w_class = 4
|
||||
|
||||
@@ -292,9 +292,15 @@
|
||||
return trans_to_obj(target, amount, multiplier, copy)
|
||||
return 0
|
||||
|
||||
//Using this in case we want to differentiate splashing an atom from transferring reagents to it later down the road.
|
||||
//For now it just calls trans_to.
|
||||
/datum/reagents/proc/splash(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0)
|
||||
//Splashing reagents is messier than trans_to, the target's loc gets some of the reagents as well.
|
||||
/datum/reagents/proc/splash(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/min_spill=0, var/max_spill=60)
|
||||
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)
|
||||
|
||||
/datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1)
|
||||
|
||||
@@ -112,6 +112,19 @@
|
||||
M.resistances += data
|
||||
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)
|
||||
/datum/reagent/water
|
||||
name = "Water"
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
return
|
||||
|
||||
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>"
|
||||
|
||||
else // Taking from something
|
||||
|
||||
@@ -1,43 +1,12 @@
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans
|
||||
volume = 40 //just over one and a half cups
|
||||
amount_per_transfer_from_this = 5
|
||||
flags = 0
|
||||
|
||||
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 ..()
|
||||
flags = 0 //starts closed
|
||||
|
||||
//DRINKS
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/cola
|
||||
name = "Space Cola"
|
||||
name = "\improper Space Cola"
|
||||
desc = "Cola. in space."
|
||||
icon_state = "cola"
|
||||
center_of_mass = list("x"=16, "y"=10)
|
||||
@@ -46,7 +15,7 @@
|
||||
reagents.add_reagent("cola", 30)
|
||||
|
||||
/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."
|
||||
icon_state = "waterbottle"
|
||||
center_of_mass = list("x"=15, "y"=8)
|
||||
@@ -54,28 +23,8 @@
|
||||
..()
|
||||
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
|
||||
name = "Space Mountain Wind"
|
||||
name = "\improper Space Mountain Wind"
|
||||
desc = "Blows right through you like a space wind."
|
||||
icon_state = "space_mountain_wind"
|
||||
center_of_mass = list("x"=16, "y"=10)
|
||||
@@ -84,7 +33,7 @@
|
||||
reagents.add_reagent("spacemountainwind", 30)
|
||||
|
||||
/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."
|
||||
icon_state = "thirteen_loko"
|
||||
center_of_mass = list("x"=16, "y"=8)
|
||||
@@ -93,7 +42,7 @@
|
||||
reagents.add_reagent("thirteenloko", 30)
|
||||
|
||||
/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."
|
||||
icon_state = "dr_gibb"
|
||||
center_of_mass = list("x"=16, "y"=10)
|
||||
@@ -102,7 +51,7 @@
|
||||
reagents.add_reagent("dr_gibb", 30)
|
||||
|
||||
/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...?"
|
||||
icon_state = "starkist"
|
||||
center_of_mass = list("x"=16, "y"=10)
|
||||
@@ -111,7 +60,7 @@
|
||||
reagents.add_reagent("brownstar", 30)
|
||||
|
||||
/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."
|
||||
icon_state = "space-up"
|
||||
center_of_mass = list("x"=16, "y"=10)
|
||||
@@ -120,7 +69,7 @@
|
||||
reagents.add_reagent("space_up", 30)
|
||||
|
||||
/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."
|
||||
icon_state = "lemon-lime"
|
||||
center_of_mass = list("x"=16, "y"=10)
|
||||
@@ -129,7 +78,7 @@
|
||||
reagents.add_reagent("lemon_lime", 30)
|
||||
|
||||
/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?"
|
||||
icon_state = "ice_tea_can"
|
||||
center_of_mass = list("x"=16, "y"=10)
|
||||
@@ -138,7 +87,7 @@
|
||||
reagents.add_reagent("icetea", 30)
|
||||
|
||||
/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!"
|
||||
icon_state = "purple_can"
|
||||
center_of_mass = list("x"=16, "y"=10)
|
||||
@@ -147,7 +96,7 @@
|
||||
reagents.add_reagent("grapejuice", 30)
|
||||
|
||||
/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."
|
||||
icon_state = "tonic"
|
||||
center_of_mass = list("x"=16, "y"=10)
|
||||
@@ -156,7 +105,7 @@
|
||||
reagents.add_reagent("tonic", 50)
|
||||
|
||||
/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."
|
||||
icon_state = "sodawater"
|
||||
center_of_mass = list("x"=16, "y"=10)
|
||||
|
||||
@@ -14,7 +14,13 @@
|
||||
return
|
||||
|
||||
attack_self(mob/user as mob)
|
||||
return
|
||||
if(!is_open_container())
|
||||
open(user)
|
||||
|
||||
proc/open(mob/user)
|
||||
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))
|
||||
@@ -29,7 +35,24 @@
|
||||
return
|
||||
if(standard_pour_into(user, target))
|
||||
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 ..()
|
||||
|
||||
self_feed_message(var/mob/user)
|
||||
|
||||
@@ -4,19 +4,51 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle
|
||||
amount_per_transfer_from_this = 10
|
||||
volume = 120
|
||||
volume = 100
|
||||
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
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target as mob, mob/living/user as mob)
|
||||
var/obj/item/weapon/reagent_containers/glass/rag/rag = null
|
||||
var/rag_underlay = "rag"
|
||||
|
||||
/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
|
||||
user.drop_item()
|
||||
var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(user.loc)
|
||||
user.put_in_active_hand(B)
|
||||
var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(newloc)
|
||||
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
|
||||
|
||||
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))
|
||||
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)
|
||||
user.put_in_active_hand(B)
|
||||
src.transfer_fingerprints_to(B)
|
||||
|
||||
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)
|
||||
|
||||
if(!target)
|
||||
return
|
||||
|
||||
if(user.a_intent != I_HURT || !isGlass)
|
||||
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/armor_block = 0 //Get the target's armour values for normal attack damage.
|
||||
@@ -48,13 +125,16 @@
|
||||
|
||||
//Calculating duration and calculating damage.
|
||||
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!
|
||||
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.
|
||||
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.
|
||||
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)
|
||||
//Weaken the target for the duration that we calculated and divide it by 5.
|
||||
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
|
||||
//Default attack message and don't weaken the target.
|
||||
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>")
|
||||
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>)")
|
||||
|
||||
if(do_smash)
|
||||
//The reagents in the bottle splash all over the target, thanks for the idea Nodrak
|
||||
if(reagents)
|
||||
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.
|
||||
src.smash(target, user)
|
||||
var/obj/item/weapon/broken_bottle/B = src.smash(target.loc, target)
|
||||
user.put_in_active_hand(B)
|
||||
|
||||
return
|
||||
|
||||
@@ -92,8 +173,8 @@
|
||||
desc = "A bottle with a sharp broken bottom."
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
icon_state = "broken_bottle"
|
||||
force = 9.0
|
||||
throwforce = 5.0
|
||||
force = 9
|
||||
throwforce = 5
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
item_state = "beer"
|
||||
@@ -314,3 +395,31 @@
|
||||
New()
|
||||
..()
|
||||
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)
|
||||
|
||||
|
||||
|
||||
@@ -463,6 +463,7 @@
|
||||
desc = "An egg!"
|
||||
icon_state = "egg"
|
||||
filling_color = "#FDFFD1"
|
||||
volume = 10
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/egg/New()
|
||||
..()
|
||||
|
||||
@@ -58,8 +58,6 @@
|
||||
<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>
|
||||
<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>
|
||||
<HR>
|
||||
<B>Artefacts:</B><BR>
|
||||
@@ -123,7 +121,7 @@
|
||||
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
|
||||
for(var/spell/aspell in H.spell_list)
|
||||
if(available_spells[href_list["spell_choice"]] == initial(aspell.name))
|
||||
|
||||
22
code/modules/tables/debug.dm
Normal file
22
code/modules/tables/debug.dm
Normal 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
Reference in New Issue
Block a user