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:
|
env:
|
||||||
BYOND_MAJOR="508"
|
BYOND_MAJOR="508"
|
||||||
BYOND_MINOR="1287"
|
BYOND_MINOR="1293"
|
||||||
MACRO_COUNT=1234
|
MACRO_COUNT=1230
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
|
|||||||
@@ -607,6 +607,7 @@
|
|||||||
#include "code\game\objects\items\devices\scanners.dm"
|
#include "code\game\objects\items\devices\scanners.dm"
|
||||||
#include "code\game\objects\items\devices\spy_bug.dm"
|
#include "code\game\objects\items\devices\spy_bug.dm"
|
||||||
#include "code\game\objects\items\devices\suit_cooling.dm"
|
#include "code\game\objects\items\devices\suit_cooling.dm"
|
||||||
|
#include "code\game\objects\items\devices\t_scanner.dm"
|
||||||
#include "code\game\objects\items\devices\taperecorder.dm"
|
#include "code\game\objects\items\devices\taperecorder.dm"
|
||||||
#include "code\game\objects\items\devices\traitordevices.dm"
|
#include "code\game\objects\items\devices\traitordevices.dm"
|
||||||
#include "code\game\objects\items\devices\transfer_valve.dm"
|
#include "code\game\objects\items\devices\transfer_valve.dm"
|
||||||
@@ -1115,6 +1116,7 @@
|
|||||||
#include "code\modules\mob\animations.dm"
|
#include "code\modules\mob\animations.dm"
|
||||||
#include "code\modules\mob\death.dm"
|
#include "code\modules\mob\death.dm"
|
||||||
#include "code\modules\mob\emote.dm"
|
#include "code\modules\mob\emote.dm"
|
||||||
|
#include "code\modules\mob\gender.dm"
|
||||||
#include "code\modules\mob\hear_say.dm"
|
#include "code\modules\mob\hear_say.dm"
|
||||||
#include "code\modules\mob\holder.dm"
|
#include "code\modules\mob\holder.dm"
|
||||||
#include "code\modules\mob\inventory.dm"
|
#include "code\modules\mob\inventory.dm"
|
||||||
|
|||||||
@@ -117,6 +117,7 @@
|
|||||||
#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
|
#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
|
||||||
#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed
|
#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed
|
||||||
#define LIGHTING_LAYER 11
|
#define LIGHTING_LAYER 11
|
||||||
|
#define HUD_LAYER 20 //Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots)
|
||||||
#define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put
|
#define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put
|
||||||
#define SCREEN_LAYER 22 //Mob HUD/effects layer
|
#define SCREEN_LAYER 22 //Mob HUD/effects layer
|
||||||
|
|
||||||
|
|||||||
@@ -94,3 +94,13 @@
|
|||||||
#define INV_ACCESSORIES_DEF_ICON 'icons/mob/ties.dmi'
|
#define INV_ACCESSORIES_DEF_ICON 'icons/mob/ties.dmi'
|
||||||
#define INV_SUIT_DEF_ICON 'icons/mob/ties.dmi'
|
#define INV_SUIT_DEF_ICON 'icons/mob/ties.dmi'
|
||||||
#define INV_SUIT_DEF_ICON 'icons/mob/suit.dmi'
|
#define INV_SUIT_DEF_ICON 'icons/mob/suit.dmi'
|
||||||
|
#define MAX_SUPPLIED_LAW_NUMBER 50
|
||||||
|
|
||||||
|
// NT's alignment towards the character
|
||||||
|
#define COMPANY_LOYAL "Loyal"
|
||||||
|
#define COMPANY_SUPPORTATIVE "Supportive"
|
||||||
|
#define COMPANY_NEUTRAL "Neutral"
|
||||||
|
#define COMPANY_SKEPTICAL "Skeptical"
|
||||||
|
#define COMPANY_OPPOSED "Opposed"
|
||||||
|
|
||||||
|
#define COMPANY_ALIGNMENTS list(COMPANY_LOYAL,COMPANY_SUPPORTATIVE,COMPANY_NEUTRAL,COMPANY_SKEPTICAL,COMPANY_OPPOSED)
|
||||||
|
|||||||
@@ -210,23 +210,14 @@ proc/listclearnulls(list/list)
|
|||||||
return (result + R.Copy(Ri, 0))
|
return (result + R.Copy(Ri, 0))
|
||||||
|
|
||||||
//Mergesort: divides up the list into halves to begin the sort
|
//Mergesort: divides up the list into halves to begin the sort
|
||||||
/proc/sortAtom(var/list/atom/L, var/order = 1, first = 1)
|
/proc/sortAtom(var/list/atom/L, var/order = 1)
|
||||||
if(isnull(L) || L.len < 2)
|
if(isnull(L) || L.len < 2)
|
||||||
if(!L)
|
|
||||||
testing("sortAtom() called with null as first parameter!")
|
|
||||||
return L
|
return L
|
||||||
if(first)
|
|
||||||
var/msg = "sortAtom() called with list([L.len]): "
|
|
||||||
for(var/x in L)
|
|
||||||
msg += "'[x]'; "
|
|
||||||
testing(msg)
|
|
||||||
var/middle = L.len / 2 + 1
|
var/middle = L.len / 2 + 1
|
||||||
return mergeAtoms(sortAtom(L.Copy(0,middle), order, 0), sortAtom(L.Copy(middle), order, 0), order)
|
return mergeAtoms(sortAtom(L.Copy(0,middle)), sortAtom(L.Copy(middle)), order)
|
||||||
|
|
||||||
//Mergsort: does the actual sorting and returns the results back to sortAtom
|
//Mergsort: does the actual sorting and returns the results back to sortAtom
|
||||||
/proc/mergeAtoms(var/list/atom/L, var/list/atom/R, var/order = 1)
|
/proc/mergeAtoms(var/list/atom/L, var/list/atom/R, var/order = 1)
|
||||||
if(!L || !R)
|
|
||||||
testing("mergeAtoms([L] ([L ? L.len : "*null*"]), [R] ([R ? R.len : "*null*"]))")
|
|
||||||
var/Li=1
|
var/Li=1
|
||||||
var/Ri=1
|
var/Ri=1
|
||||||
var/list/result = new()
|
var/list/result = new()
|
||||||
@@ -239,14 +230,8 @@ proc/listclearnulls(list/list)
|
|||||||
result += R[Ri++]
|
result += R[Ri++]
|
||||||
|
|
||||||
if(Li <= L.len)
|
if(Li <= L.len)
|
||||||
. = (result + L.Copy(Li, 0))
|
return (result + L.Copy(Li, 0))
|
||||||
if(!.)
|
return (result + R.Copy(Ri, 0))
|
||||||
testing("mergeAtoms returning [.]")
|
|
||||||
return
|
|
||||||
. = (result + R.Copy(Ri, 0))
|
|
||||||
if(!.)
|
|
||||||
testing("mergeAtoms returning [.]")
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -126,12 +126,12 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
|||||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager,
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager,
|
||||||
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,
|
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,
|
||||||
/obj/item/weapon/lipstick/random,
|
/obj/item/weapon/lipstick/random,
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/ale,
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale,
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/ale,
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale,
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/beer,
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/beer,
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/beer,
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/beer)
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer)
|
||||||
cost = 20
|
cost = 20
|
||||||
containertype = /obj/structure/closet/crate
|
containertype = /obj/structure/closet/crate
|
||||||
containername = "Party equipment"
|
containername = "Party equipment"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
/datum/antagonist/proc/create_objectives(var/datum/mind/player)
|
/datum/antagonist/proc/create_objectives(var/datum/mind/player)
|
||||||
if(config.objectives_disabled)
|
if(config.objectives_disabled)
|
||||||
return 0
|
return 0
|
||||||
if(create_global_objectives())
|
if(create_global_objectives() || global_objectives.len)
|
||||||
player.objectives |= global_objectives
|
player.objectives |= global_objectives
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
for(var/datum/mind/P in current_antagonists)
|
for(var/datum/mind/P in current_antagonists)
|
||||||
text += print_player_full(P)
|
text += print_player_full(P)
|
||||||
text += get_special_objective_text(P)
|
text += get_special_objective_text(P)
|
||||||
var/failed
|
|
||||||
if(!global_objectives.len && P.objectives && P.objectives.len)
|
if(!global_objectives.len && P.objectives && P.objectives.len)
|
||||||
|
var/failed
|
||||||
var/num = 1
|
var/num = 1
|
||||||
for(var/datum/objective/O in P.objectives)
|
for(var/datum/objective/O in P.objectives)
|
||||||
text += print_objective(O, num)
|
text += print_objective(O, num)
|
||||||
@@ -20,8 +20,6 @@
|
|||||||
feedback_add_details(feedback_tag,"[O.type]|FAIL")
|
feedback_add_details(feedback_tag,"[O.type]|FAIL")
|
||||||
failed = 1
|
failed = 1
|
||||||
num++
|
num++
|
||||||
|
|
||||||
if(!config.objectives_disabled)
|
|
||||||
if(failed)
|
if(failed)
|
||||||
text += "<br><font color='red'><B>The [role_text] has failed.</B></font>"
|
text += "<br><font color='red'><B>The [role_text] has failed.</B></font>"
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -21,9 +21,14 @@
|
|||||||
if(auto_init && ticker && ticker.current_state == GAME_STATE_PLAYING)
|
if(auto_init && ticker && ticker.current_state == GAME_STATE_PLAYING)
|
||||||
initialize()
|
initialize()
|
||||||
|
|
||||||
|
/proc/generate_debug_runtime() // Guaranteed to runtime and print a stack trace to the runtime log
|
||||||
|
var/t = 0 // BYOND won't let us do var/t = 1/0 directly, but it's fine with this.
|
||||||
|
t = 1 / t
|
||||||
|
|
||||||
/atom/movable/Del()
|
/atom/movable/Del()
|
||||||
if(isnull(gcDestroyed) && loc)
|
if(isnull(gcDestroyed) && loc)
|
||||||
testing("GC: -- [type] was deleted via del() rather than qdel() --")
|
testing("GC: -- [type] was deleted via del() rather than qdel() --")
|
||||||
|
generate_debug_runtime() // stick a stack trace in the runtime logs
|
||||||
// else if(isnull(gcDestroyed))
|
// else if(isnull(gcDestroyed))
|
||||||
// testing("GC: [type] was deleted via GC without qdel()") //Not really a huge issue but from now on, please qdel()
|
// testing("GC: [type] was deleted via GC without qdel()") //Not really a huge issue but from now on, please qdel()
|
||||||
// else
|
// else
|
||||||
@@ -34,6 +39,7 @@
|
|||||||
. = ..()
|
. = ..()
|
||||||
if(reagents)
|
if(reagents)
|
||||||
qdel(reagents)
|
qdel(reagents)
|
||||||
|
reagents = null
|
||||||
for(var/atom/movable/AM in contents)
|
for(var/atom/movable/AM in contents)
|
||||||
qdel(AM)
|
qdel(AM)
|
||||||
loc = null
|
loc = null
|
||||||
|
|||||||
@@ -286,14 +286,13 @@ var/global/list/additional_antag_types = list()
|
|||||||
/datum/game_mode/proc/declare_completion()
|
/datum/game_mode/proc/declare_completion()
|
||||||
|
|
||||||
var/is_antag_mode = (antag_templates && antag_templates.len)
|
var/is_antag_mode = (antag_templates && antag_templates.len)
|
||||||
if(!config.objectives_disabled)
|
check_victory()
|
||||||
check_victory()
|
if(is_antag_mode)
|
||||||
if(is_antag_mode)
|
sleep(10)
|
||||||
|
for(var/datum/antagonist/antag in antag_templates)
|
||||||
sleep(10)
|
sleep(10)
|
||||||
for(var/datum/antagonist/antag in antag_templates)
|
antag.check_victory()
|
||||||
sleep(10)
|
antag.print_player_summary()
|
||||||
antag.check_victory()
|
|
||||||
antag.print_player_summary()
|
|
||||||
|
|
||||||
var/clients = 0
|
var/clients = 0
|
||||||
var/surviving_humans = 0
|
var/surviving_humans = 0
|
||||||
@@ -395,8 +394,8 @@ var/global/list/additional_antag_types = list()
|
|||||||
|
|
||||||
if (special_role in disregard_roles)
|
if (special_role in disregard_roles)
|
||||||
continue
|
continue
|
||||||
else if(man.client.prefs.nanotrasen_relation == "Opposed" && prob(50) || \
|
else if(man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED && prob(50) || \
|
||||||
man.client.prefs.nanotrasen_relation == "Skeptical" && prob(20))
|
man.client.prefs.nanotrasen_relation == COMPANY_SKEPTICAL && prob(20))
|
||||||
suspects += man
|
suspects += man
|
||||||
// Antags
|
// Antags
|
||||||
else if(special_role_data && prob(special_role_data.suspicion_chance))
|
else if(special_role_data && prob(special_role_data.suspicion_chance))
|
||||||
@@ -562,9 +561,9 @@ proc/get_nt_opposed()
|
|||||||
var/list/dudes = list()
|
var/list/dudes = list()
|
||||||
for(var/mob/living/carbon/human/man in player_list)
|
for(var/mob/living/carbon/human/man in player_list)
|
||||||
if(man.client)
|
if(man.client)
|
||||||
if(man.client.prefs.nanotrasen_relation == "Opposed")
|
if(man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED)
|
||||||
dudes += man
|
dudes += man
|
||||||
else if(man.client.prefs.nanotrasen_relation == "Skeptical" && prob(50))
|
else if(man.client.prefs.nanotrasen_relation == COMPANY_SKEPTICAL && prob(50))
|
||||||
dudes += man
|
dudes += man
|
||||||
if(dudes.len == 0) return null
|
if(dudes.len == 0) return null
|
||||||
return pick(dudes)
|
return pick(dudes)
|
||||||
|
|||||||
@@ -90,7 +90,7 @@
|
|||||||
|
|
||||||
/datum/intercept_text/proc/get_suspect()
|
/datum/intercept_text/proc/get_suspect()
|
||||||
var/list/dudes = list()
|
var/list/dudes = list()
|
||||||
for(var/mob/living/carbon/human/man in player_list) if(man.client && man.client.prefs.nanotrasen_relation == "Opposed")
|
for(var/mob/living/carbon/human/man in player_list) if(man.client && man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED)
|
||||||
dudes += man
|
dudes += man
|
||||||
for(var/i = 0, i < max(player_list.len/10,2), i++)
|
for(var/i = 0, i < max(player_list.len/10,2), i++)
|
||||||
dudes += pick(player_list)
|
dudes += pick(player_list)
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
spawn_positions = -1
|
spawn_positions = -1
|
||||||
supervisors = "absolutely everyone"
|
supervisors = "absolutely everyone"
|
||||||
selection_color = "#dddddd"
|
selection_color = "#dddddd"
|
||||||
|
economic_modifier = 1
|
||||||
access = list() //See /datum/job/assistant/get_access()
|
access = list() //See /datum/job/assistant/get_access()
|
||||||
minimal_access = list() //See /datum/job/assistant/get_access()
|
minimal_access = list() //See /datum/job/assistant/get_access()
|
||||||
alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Visitor")
|
alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Visitor")
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
|||||||
access = list() //See get_access()
|
access = list() //See get_access()
|
||||||
minimal_access = list() //See get_access()
|
minimal_access = list() //See get_access()
|
||||||
minimal_player_age = 14
|
minimal_player_age = 14
|
||||||
|
economic_modifier = 20
|
||||||
equip(var/mob/living/carbon/human/H)
|
equip(var/mob/living/carbon/human/H)
|
||||||
if(!H) return 0
|
if(!H) return 0
|
||||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear)
|
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear)
|
||||||
@@ -60,6 +61,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
|||||||
idtype = /obj/item/weapon/card/id/silver
|
idtype = /obj/item/weapon/card/id/silver
|
||||||
req_admin_notify = 1
|
req_admin_notify = 1
|
||||||
minimal_player_age = 10
|
minimal_player_age = 10
|
||||||
|
economic_modifier = 10
|
||||||
access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
|
access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
|
||||||
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
|
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
|
||||||
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
|
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
|
||||||
|
|||||||
@@ -97,6 +97,7 @@
|
|||||||
spawn_positions = 1
|
spawn_positions = 1
|
||||||
supervisors = "the head of personnel"
|
supervisors = "the head of personnel"
|
||||||
selection_color = "#dddddd"
|
selection_color = "#dddddd"
|
||||||
|
economic_modifier = 5
|
||||||
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
|
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
|
||||||
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
|
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
|
||||||
|
|
||||||
@@ -149,6 +150,7 @@
|
|||||||
spawn_positions = 3
|
spawn_positions = 3
|
||||||
supervisors = "the quartermaster and the head of personnel"
|
supervisors = "the quartermaster and the head of personnel"
|
||||||
selection_color = "#dddddd"
|
selection_color = "#dddddd"
|
||||||
|
economic_modifier = 5
|
||||||
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
|
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
|
||||||
minimal_access = list(access_mining, access_mining_station, access_mailsorting)
|
minimal_access = list(access_mining, access_mining_station, access_mailsorting)
|
||||||
alt_titles = list("Drill Technician","Prospector")
|
alt_titles = list("Drill Technician","Prospector")
|
||||||
@@ -311,6 +313,7 @@
|
|||||||
spawn_positions = 2
|
spawn_positions = 2
|
||||||
supervisors = "Nanotrasen officials and Corporate Regulations"
|
supervisors = "Nanotrasen officials and Corporate Regulations"
|
||||||
selection_color = "#dddddd"
|
selection_color = "#dddddd"
|
||||||
|
economic_modifier = 7
|
||||||
access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels, access_heads)
|
access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels, access_heads)
|
||||||
minimal_access = list(access_lawyer, access_court, access_sec_doors, access_heads)
|
minimal_access = list(access_lawyer, access_court, access_sec_doors, access_heads)
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
selection_color = "#ffeeaa"
|
selection_color = "#ffeeaa"
|
||||||
idtype = /obj/item/weapon/card/id/silver
|
idtype = /obj/item/weapon/card/id/silver
|
||||||
req_admin_notify = 1
|
req_admin_notify = 1
|
||||||
|
economic_modifier = 10
|
||||||
access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
|
access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
|
||||||
access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
|
access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
|
||||||
access_heads, access_construction, access_sec_doors,
|
access_heads, access_construction, access_sec_doors,
|
||||||
@@ -53,6 +54,7 @@
|
|||||||
spawn_positions = 5
|
spawn_positions = 5
|
||||||
supervisors = "the chief engineer"
|
supervisors = "the chief engineer"
|
||||||
selection_color = "#fff5cc"
|
selection_color = "#fff5cc"
|
||||||
|
economic_modifier = 5
|
||||||
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
|
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
|
||||||
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
|
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
|
||||||
alt_titles = list("Maintenance Technician","Engine Technician","Electrician")
|
alt_titles = list("Maintenance Technician","Engine Technician","Electrician")
|
||||||
@@ -89,6 +91,7 @@
|
|||||||
spawn_positions = 2
|
spawn_positions = 2
|
||||||
supervisors = "the chief engineer"
|
supervisors = "the chief engineer"
|
||||||
selection_color = "#fff5cc"
|
selection_color = "#fff5cc"
|
||||||
|
economic_modifier = 5
|
||||||
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks)
|
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks)
|
||||||
minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)
|
minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,9 @@
|
|||||||
var/department = null // Does this position have a department tag?
|
var/department = null // Does this position have a department tag?
|
||||||
var/head_position = 0 // Is this position Command?
|
var/head_position = 0 // Is this position Command?
|
||||||
|
|
||||||
|
var/account_allowed = 1 // Does this job type come with a station account?
|
||||||
|
var/economic_modifier = 2 // With how much does this job modify the initial account amount?
|
||||||
|
|
||||||
/datum/job/proc/equip(var/mob/living/carbon/human/H)
|
/datum/job/proc/equip(var/mob/living/carbon/human/H)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
@@ -34,6 +37,37 @@
|
|||||||
H.species.equip_survival_gear(H,0)
|
H.species.equip_survival_gear(H,0)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
/datum/job/proc/setup_account(var/mob/living/carbon/human/H)
|
||||||
|
if(!account_allowed || (H.mind && H.mind.initial_account))
|
||||||
|
return
|
||||||
|
|
||||||
|
var/loyalty = 1
|
||||||
|
if(H.client)
|
||||||
|
switch(H.client.prefs.nanotrasen_relation)
|
||||||
|
if(COMPANY_LOYAL) loyalty = 1.30
|
||||||
|
if(COMPANY_SUPPORTATIVE)loyalty = 1.15
|
||||||
|
if(COMPANY_NEUTRAL) loyalty = 1
|
||||||
|
if(COMPANY_SKEPTICAL) loyalty = 0.85
|
||||||
|
if(COMPANY_OPPOSED) loyalty = 0.70
|
||||||
|
|
||||||
|
//give them an account in the station database
|
||||||
|
var/money_amount = (rand(5,50) + rand(5, 50)) * loyalty * economic_modifier * (H.species ? economic_species_modifier[H.species.type] : 2)
|
||||||
|
var/datum/money_account/M = create_account(H.real_name, money_amount, null)
|
||||||
|
if(H.mind)
|
||||||
|
var/remembered_info = ""
|
||||||
|
remembered_info += "<b>Your account number is:</b> #[M.account_number]<br>"
|
||||||
|
remembered_info += "<b>Your account pin is:</b> [M.remote_access_pin]<br>"
|
||||||
|
remembered_info += "<b>Your account funds are:</b> $[M.money]<br>"
|
||||||
|
|
||||||
|
if(M.transaction_log.len)
|
||||||
|
var/datum/transaction/T = M.transaction_log[1]
|
||||||
|
remembered_info += "<b>Your account was created:</b> [T.time], [T.date] at [T.source_terminal]<br>"
|
||||||
|
H.mind.store_memory(remembered_info)
|
||||||
|
|
||||||
|
H.mind.initial_account = M
|
||||||
|
|
||||||
|
H << "<span class='notice'><b>Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]</b></span>"
|
||||||
|
|
||||||
// overrideable separately so AIs/borgs can have cardborg hats without unneccessary new()/del()
|
// overrideable separately so AIs/borgs can have cardborg hats without unneccessary new()/del()
|
||||||
/datum/job/proc/equip_preview(mob/living/carbon/human/H)
|
/datum/job/proc/equip_preview(mob/living/carbon/human/H)
|
||||||
return equip(H)
|
return equip(H)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
selection_color = "#ffddf0"
|
selection_color = "#ffddf0"
|
||||||
idtype = /obj/item/weapon/card/id/silver
|
idtype = /obj/item/weapon/card/id/silver
|
||||||
req_admin_notify = 1
|
req_admin_notify = 1
|
||||||
|
economic_modifier = 10
|
||||||
access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
|
access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
|
||||||
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
|
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
|
||||||
access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks)
|
access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks)
|
||||||
@@ -44,6 +45,7 @@
|
|||||||
spawn_positions = 3
|
spawn_positions = 3
|
||||||
supervisors = "the chief medical officer"
|
supervisors = "the chief medical officer"
|
||||||
selection_color = "#ffeef0"
|
selection_color = "#ffeef0"
|
||||||
|
economic_modifier = 7
|
||||||
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
||||||
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology)
|
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology)
|
||||||
alt_titles = list("Surgeon","Emergency Physician","Nurse","Virologist")
|
alt_titles = list("Surgeon","Emergency Physician","Nurse","Virologist")
|
||||||
@@ -106,6 +108,7 @@
|
|||||||
spawn_positions = 2
|
spawn_positions = 2
|
||||||
supervisors = "the chief medical officer"
|
supervisors = "the chief medical officer"
|
||||||
selection_color = "#ffeef0"
|
selection_color = "#ffeef0"
|
||||||
|
economic_modifier = 5
|
||||||
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
||||||
minimal_access = list(access_medical, access_chemistry)
|
minimal_access = list(access_medical, access_chemistry)
|
||||||
alt_titles = list("Pharmacist")
|
alt_titles = list("Pharmacist")
|
||||||
@@ -136,6 +139,7 @@
|
|||||||
spawn_positions = 0
|
spawn_positions = 0
|
||||||
supervisors = "the chief medical officer and research director"
|
supervisors = "the chief medical officer and research director"
|
||||||
selection_color = "#ffeef0"
|
selection_color = "#ffeef0"
|
||||||
|
economic_modifier = 7
|
||||||
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research)
|
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research)
|
||||||
minimal_access = list(access_medical, access_morgue, access_genetics, access_research)
|
minimal_access = list(access_medical, access_morgue, access_genetics, access_research)
|
||||||
|
|
||||||
@@ -162,6 +166,7 @@
|
|||||||
faction = "Station"
|
faction = "Station"
|
||||||
total_positions = 1
|
total_positions = 1
|
||||||
spawn_positions = 1
|
spawn_positions = 1
|
||||||
|
economic_modifier = 5
|
||||||
supervisors = "the chief medical officer"
|
supervisors = "the chief medical officer"
|
||||||
selection_color = "#ffeef0"
|
selection_color = "#ffeef0"
|
||||||
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_psychiatrist)
|
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_psychiatrist)
|
||||||
@@ -198,6 +203,7 @@
|
|||||||
spawn_positions = 2
|
spawn_positions = 2
|
||||||
supervisors = "the chief medical officer"
|
supervisors = "the chief medical officer"
|
||||||
selection_color = "#ffeef0"
|
selection_color = "#ffeef0"
|
||||||
|
economic_modifier = 4
|
||||||
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist)
|
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist)
|
||||||
minimal_access = list(access_medical, access_medical_equip, access_eva, access_maint_tunnels, access_external_airlocks)
|
minimal_access = list(access_medical, access_medical_equip, access_eva, access_maint_tunnels, access_external_airlocks)
|
||||||
alt_titles = list("Emergency Medical Technician")
|
alt_titles = list("Emergency Medical Technician")
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
selection_color = "#ffddff"
|
selection_color = "#ffddff"
|
||||||
idtype = /obj/item/weapon/card/id/silver
|
idtype = /obj/item/weapon/card/id/silver
|
||||||
req_admin_notify = 1
|
req_admin_notify = 1
|
||||||
|
economic_modifier = 15
|
||||||
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
|
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
|
||||||
access_tox_storage, access_teleporter, access_sec_doors,
|
access_tox_storage, access_teleporter, access_sec_doors,
|
||||||
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
|
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
|
||||||
@@ -47,6 +48,7 @@
|
|||||||
spawn_positions = 3
|
spawn_positions = 3
|
||||||
supervisors = "the research director"
|
supervisors = "the research director"
|
||||||
selection_color = "#ffeeff"
|
selection_color = "#ffeeff"
|
||||||
|
economic_modifier = 7
|
||||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
|
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
|
||||||
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
|
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
|
||||||
alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher")
|
alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher")
|
||||||
@@ -76,6 +78,7 @@
|
|||||||
spawn_positions = 2
|
spawn_positions = 2
|
||||||
supervisors = "the research director"
|
supervisors = "the research director"
|
||||||
selection_color = "#ffeeff"
|
selection_color = "#ffeeff"
|
||||||
|
economic_modifier = 7
|
||||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics)
|
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics)
|
||||||
minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage)
|
minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage)
|
||||||
alt_titles = list("Xenobotanist")
|
alt_titles = list("Xenobotanist")
|
||||||
@@ -105,6 +108,7 @@
|
|||||||
spawn_positions = 2
|
spawn_positions = 2
|
||||||
supervisors = "research director"
|
supervisors = "research director"
|
||||||
selection_color = "#ffeeff"
|
selection_color = "#ffeeff"
|
||||||
|
economic_modifier = 5
|
||||||
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
|
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
|
||||||
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
|
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
|
||||||
alt_titles = list("Biomechanical Engineer","Mechatronic Engineer")
|
alt_titles = list("Biomechanical Engineer","Mechatronic Engineer")
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
selection_color = "#ffdddd"
|
selection_color = "#ffdddd"
|
||||||
idtype = /obj/item/weapon/card/id/silver
|
idtype = /obj/item/weapon/card/id/silver
|
||||||
req_admin_notify = 1
|
req_admin_notify = 1
|
||||||
|
economic_modifier = 10
|
||||||
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court,
|
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court,
|
||||||
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
|
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
|
||||||
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
|
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
|
||||||
@@ -54,6 +55,7 @@
|
|||||||
spawn_positions = 1
|
spawn_positions = 1
|
||||||
supervisors = "the head of security"
|
supervisors = "the head of security"
|
||||||
selection_color = "#ffeeee"
|
selection_color = "#ffeeee"
|
||||||
|
economic_modifier = 5
|
||||||
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_external_airlocks)
|
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_external_airlocks)
|
||||||
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_external_airlocks)
|
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_external_airlocks)
|
||||||
minimal_player_age = 5
|
minimal_player_age = 5
|
||||||
@@ -91,7 +93,7 @@
|
|||||||
supervisors = "the head of security"
|
supervisors = "the head of security"
|
||||||
selection_color = "#ffeeee"
|
selection_color = "#ffeeee"
|
||||||
alt_titles = list("Forensic Technician")
|
alt_titles = list("Forensic Technician")
|
||||||
|
economic_modifier = 5
|
||||||
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
|
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
|
||||||
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
|
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
|
||||||
alt_titles = list("Forensic Technician")
|
alt_titles = list("Forensic Technician")
|
||||||
@@ -133,6 +135,7 @@
|
|||||||
spawn_positions = 3
|
spawn_positions = 3
|
||||||
supervisors = "the head of security"
|
supervisors = "the head of security"
|
||||||
selection_color = "#ffeeee"
|
selection_color = "#ffeeee"
|
||||||
|
economic_modifier = 4
|
||||||
access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_external_airlocks)
|
access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_external_airlocks)
|
||||||
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_external_airlocks)
|
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_external_airlocks)
|
||||||
minimal_player_age = 3
|
minimal_player_age = 3
|
||||||
|
|||||||
@@ -9,7 +9,8 @@
|
|||||||
supervisors = "your laws"
|
supervisors = "your laws"
|
||||||
req_admin_notify = 1
|
req_admin_notify = 1
|
||||||
minimal_player_age = 7
|
minimal_player_age = 7
|
||||||
|
account_allowed = 0
|
||||||
|
economic_modifier = 0
|
||||||
equip(var/mob/living/carbon/human/H)
|
equip(var/mob/living/carbon/human/H)
|
||||||
if(!H) return 0
|
if(!H) return 0
|
||||||
return 1
|
return 1
|
||||||
@@ -40,6 +41,8 @@
|
|||||||
selection_color = "#ddffdd"
|
selection_color = "#ddffdd"
|
||||||
minimal_player_age = 1
|
minimal_player_age = 1
|
||||||
alt_titles = list("Android", "Robot")
|
alt_titles = list("Android", "Robot")
|
||||||
|
account_allowed = 0
|
||||||
|
economic_modifier = 0
|
||||||
|
|
||||||
equip(var/mob/living/carbon/human/H)
|
equip(var/mob/living/carbon/human/H)
|
||||||
if(!H) return 0
|
if(!H) return 0
|
||||||
|
|||||||
@@ -392,6 +392,7 @@ var/global/datum/controller/occupations/job_master
|
|||||||
spawn_in_storage += thing
|
spawn_in_storage += thing
|
||||||
//Equip job items.
|
//Equip job items.
|
||||||
job.equip(H)
|
job.equip(H)
|
||||||
|
job.setup_account(H)
|
||||||
job.equip_backpack(H)
|
job.equip_backpack(H)
|
||||||
job.equip_survival(H)
|
job.equip_survival(H)
|
||||||
job.apply_fingerprints(H)
|
job.apply_fingerprints(H)
|
||||||
@@ -428,21 +429,6 @@ var/global/datum/controller/occupations/job_master
|
|||||||
H.buckled.loc = H.loc
|
H.buckled.loc = H.loc
|
||||||
H.buckled.set_dir(H.dir)
|
H.buckled.set_dir(H.dir)
|
||||||
|
|
||||||
//give them an account in the station database
|
|
||||||
var/datum/money_account/M = create_account(H.real_name, rand(50,500)*10, null)
|
|
||||||
if(H.mind)
|
|
||||||
var/remembered_info = ""
|
|
||||||
remembered_info += "<b>Your account number is:</b> #[M.account_number]<br>"
|
|
||||||
remembered_info += "<b>Your account pin is:</b> [M.remote_access_pin]<br>"
|
|
||||||
remembered_info += "<b>Your account funds are:</b> $[M.money]<br>"
|
|
||||||
|
|
||||||
if(M.transaction_log.len)
|
|
||||||
var/datum/transaction/T = M.transaction_log[1]
|
|
||||||
remembered_info += "<b>Your account was created:</b> [T.time], [T.date] at [T.source_terminal]<br>"
|
|
||||||
H.mind.store_memory(remembered_info)
|
|
||||||
|
|
||||||
H.mind.initial_account = M
|
|
||||||
|
|
||||||
// If they're head, give them the account info for their department
|
// If they're head, give them the account info for their department
|
||||||
if(H.mind && job.head_position)
|
if(H.mind && job.head_position)
|
||||||
var/remembered_info = ""
|
var/remembered_info = ""
|
||||||
@@ -455,9 +441,6 @@ var/global/datum/controller/occupations/job_master
|
|||||||
|
|
||||||
H.mind.store_memory(remembered_info)
|
H.mind.store_memory(remembered_info)
|
||||||
|
|
||||||
spawn(0)
|
|
||||||
H << "<span class='notice'><b>Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]</b></span>"
|
|
||||||
|
|
||||||
var/alt_title = null
|
var/alt_title = null
|
||||||
if(H.mind)
|
if(H.mind)
|
||||||
H.mind.assigned_role = rank
|
H.mind.assigned_role = rank
|
||||||
|
|||||||
@@ -333,7 +333,7 @@
|
|||||||
|
|
||||||
/datum/autolathe/recipe/magazine_c20r
|
/datum/autolathe/recipe/magazine_c20r
|
||||||
name = "ammunition (12mm)"
|
name = "ammunition (12mm)"
|
||||||
path = /obj/item/ammo_magazine/a12mm
|
path = /obj/item/ammo_magazine/a10mm
|
||||||
hidden = 1
|
hidden = 1
|
||||||
category = "Arms and Ammunition"
|
category = "Arms and Ammunition"
|
||||||
|
|
||||||
|
|||||||
@@ -47,11 +47,13 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
|
|||||||
|
|
||||||
signal.data["slow"] += rand(0, round((100-integrity))) // apply some lag based on integrity
|
signal.data["slow"] += rand(0, round((100-integrity))) // apply some lag based on integrity
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Edit by Atlantis: Commented out as emergency fix due to causing extreme delays in communications.
|
||||||
// Apply some lag based on traffic rates
|
// Apply some lag based on traffic rates
|
||||||
var/netlag = round(traffic / 50)
|
var/netlag = round(traffic / 50)
|
||||||
if(netlag > signal.data["slow"])
|
if(netlag > signal.data["slow"])
|
||||||
signal.data["slow"] = netlag
|
signal.data["slow"] = netlag
|
||||||
|
*/
|
||||||
// Loop through all linked machines and send the signal or copy.
|
// Loop through all linked machines and send the signal or copy.
|
||||||
for(var/obj/machinery/telecomms/machine in links)
|
for(var/obj/machinery/telecomms/machine in links)
|
||||||
if(filter && !istype( machine, text2path(filter) ))
|
if(filter && !istype( machine, text2path(filter) ))
|
||||||
|
|||||||
@@ -688,8 +688,8 @@
|
|||||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5,
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5,
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5,
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5,
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5,
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5,
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,/obj/item/weapon/reagent_containers/food/drinks/cans/beer = 6,
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 6,
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/ale = 6,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 4,
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 6,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 4,
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 4,/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 4,
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 4,/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 4,
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 4,/obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 8,
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 4,/obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 8,
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 8, /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 15,
|
/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 8, /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 15,
|
||||||
|
|||||||
@@ -7,60 +7,6 @@ GAS ANALYZER
|
|||||||
MASS SPECTROMETER
|
MASS SPECTROMETER
|
||||||
REAGENT SCANNER
|
REAGENT SCANNER
|
||||||
*/
|
*/
|
||||||
/obj/item/device/t_scanner
|
|
||||||
name = "\improper T-ray scanner"
|
|
||||||
desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
|
|
||||||
icon_state = "t-ray0"
|
|
||||||
var/on = 0
|
|
||||||
slot_flags = SLOT_BELT
|
|
||||||
w_class = 2
|
|
||||||
item_state = "electronic"
|
|
||||||
|
|
||||||
matter = list(DEFAULT_WALL_MATERIAL = 150)
|
|
||||||
|
|
||||||
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINERING = 1)
|
|
||||||
|
|
||||||
/obj/item/device/t_scanner/attack_self(mob/user)
|
|
||||||
|
|
||||||
on = !on
|
|
||||||
icon_state = "t-ray[on]"
|
|
||||||
|
|
||||||
if(on)
|
|
||||||
processing_objects.Add(src)
|
|
||||||
|
|
||||||
|
|
||||||
/obj/item/device/t_scanner/process()
|
|
||||||
if(!on)
|
|
||||||
processing_objects.Remove(src)
|
|
||||||
return null
|
|
||||||
|
|
||||||
for(var/turf/T in range(1, src.loc) )
|
|
||||||
|
|
||||||
if(!T.intact)
|
|
||||||
continue
|
|
||||||
|
|
||||||
for(var/obj/O in T.contents)
|
|
||||||
|
|
||||||
if(O.level != 1)
|
|
||||||
continue
|
|
||||||
|
|
||||||
if(O.invisibility == 101)
|
|
||||||
O.invisibility = 0
|
|
||||||
O.alpha = 128
|
|
||||||
spawn(10)
|
|
||||||
if(O)
|
|
||||||
var/turf/U = O.loc
|
|
||||||
if(U.intact)
|
|
||||||
O.invisibility = 101
|
|
||||||
O.alpha = 255
|
|
||||||
|
|
||||||
var/mob/living/M = locate() in T
|
|
||||||
if(M && M.invisibility == 2)
|
|
||||||
M.invisibility = 0
|
|
||||||
spawn(2)
|
|
||||||
if(M)
|
|
||||||
M.invisibility = INVISIBILITY_LEVEL_TWO
|
|
||||||
|
|
||||||
|
|
||||||
/obj/item/device/healthanalyzer
|
/obj/item/device/healthanalyzer
|
||||||
name = "health analyzer"
|
name = "health analyzer"
|
||||||
|
|||||||
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
|
path = /obj/item/ammo_magazine/a357
|
||||||
|
|
||||||
/datum/uplink_item/item/ammo/mc9mm
|
/datum/uplink_item/item/ammo/mc9mm
|
||||||
name = ".9mm"
|
name = "9mm"
|
||||||
path = /obj/item/ammo_magazine/mc9mm
|
path = /obj/item/ammo_magazine/mc9mm
|
||||||
|
|
||||||
/datum/uplink_item/item/ammo/darts
|
/datum/uplink_item/item/ammo/darts
|
||||||
@@ -142,6 +142,14 @@ datum/uplink_item/dd_SortValue()
|
|||||||
name = "14.5mm"
|
name = "14.5mm"
|
||||||
path = /obj/item/weapon/storage/box/sniperammo
|
path = /obj/item/weapon/storage/box/sniperammo
|
||||||
|
|
||||||
|
/datum/uplink_item/item/ammo/a10mm
|
||||||
|
name = "10mm"
|
||||||
|
path = /obj/item/ammo_magazine/a10mm
|
||||||
|
|
||||||
|
/datum/uplink_item/item/ammo/a762
|
||||||
|
name = "7.62mm"
|
||||||
|
path = /obj/item/ammo_magazine/a762
|
||||||
|
|
||||||
/***************************************
|
/***************************************
|
||||||
* Highly Visible and Dangerous Weapons *
|
* Highly Visible and Dangerous Weapons *
|
||||||
***************************************/
|
***************************************/
|
||||||
@@ -188,6 +196,17 @@ datum/uplink_item/dd_SortValue()
|
|||||||
item_cost = DEFAULT_TELECRYSTAL_AMOUNT
|
item_cost = DEFAULT_TELECRYSTAL_AMOUNT
|
||||||
path = /obj/item/weapon/gun/projectile/heavysniper
|
path = /obj/item/weapon/gun/projectile/heavysniper
|
||||||
|
|
||||||
|
//These are for traitors (or other antags, perhaps) to have the option of purchasing some merc gear.
|
||||||
|
/datum/uplink_item/item/visible_weapons/submachinegun
|
||||||
|
name = "Submachine Gun"
|
||||||
|
item_cost = 6
|
||||||
|
path = /obj/item/weapon/gun/projectile/automatic/c20r
|
||||||
|
|
||||||
|
/datum/uplink_item/item/visible_weapons/assaultrifle
|
||||||
|
name = "Assault Rifle"
|
||||||
|
item_cost = 7
|
||||||
|
path = /obj/item/weapon/gun/projectile/automatic/sts35
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
* Stealthy and Inconspicuous Weapons *
|
* Stealthy and Inconspicuous Weapons *
|
||||||
*************************************/
|
*************************************/
|
||||||
|
|||||||
@@ -68,10 +68,7 @@
|
|||||||
|
|
||||||
if (istype(E, /datum/stack_recipe_list))
|
if (istype(E, /datum/stack_recipe_list))
|
||||||
var/datum/stack_recipe_list/srl = E
|
var/datum/stack_recipe_list/srl = E
|
||||||
if (src.get_amount() >= srl.req_amount)
|
t1 += "<a href='?src=\ref[src];sublist=[i]'>[srl.title]</a>"
|
||||||
t1 += "<a href='?src=\ref[src];sublist=[i]'>[srl.title] ([srl.req_amount] [src.singular_name]\s)</a>"
|
|
||||||
else
|
|
||||||
t1 += "[srl.title] ([srl.req_amount] [src.singular_name]\s)<br>"
|
|
||||||
|
|
||||||
if (istype(E, /datum/stack_recipe))
|
if (istype(E, /datum/stack_recipe))
|
||||||
var/datum/stack_recipe/R = E
|
var/datum/stack_recipe/R = E
|
||||||
@@ -360,8 +357,6 @@
|
|||||||
/datum/stack_recipe_list
|
/datum/stack_recipe_list
|
||||||
var/title = "ERROR"
|
var/title = "ERROR"
|
||||||
var/list/recipes = null
|
var/list/recipes = null
|
||||||
var/req_amount = 1
|
New(title, recipes)
|
||||||
New(title, recipes, req_amount = 1)
|
|
||||||
src.title = title
|
src.title = title
|
||||||
src.recipes = recipes
|
src.recipes = recipes
|
||||||
src.req_amount = req_amount
|
|
||||||
|
|||||||
@@ -100,10 +100,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
|||||||
flags |= NOREACT // so it doesn't react until you light it
|
flags |= NOREACT // so it doesn't react until you light it
|
||||||
create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15
|
create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15
|
||||||
|
|
||||||
/obj/item/clothing/mask/smokable/Destroy()
|
|
||||||
..()
|
|
||||||
qdel(reagents)
|
|
||||||
|
|
||||||
/obj/item/clothing/mask/smokable/process()
|
/obj/item/clothing/mask/smokable/process()
|
||||||
var/turf/location = get_turf(src)
|
var/turf/location = get_turf(src)
|
||||||
smoketime--
|
smoketime--
|
||||||
|
|||||||
@@ -15,8 +15,8 @@
|
|||||||
|
|
||||||
/obj/item/weapon/storage/bible/booze/New()
|
/obj/item/weapon/storage/bible/booze/New()
|
||||||
..()
|
..()
|
||||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
|
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src)
|
||||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
|
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src)
|
||||||
new /obj/item/weapon/spacecash(src)
|
new /obj/item/weapon/spacecash(src)
|
||||||
new /obj/item/weapon/spacecash(src)
|
new /obj/item/weapon/spacecash(src)
|
||||||
new /obj/item/weapon/spacecash(src)
|
new /obj/item/weapon/spacecash(src)
|
||||||
|
|||||||
@@ -146,11 +146,6 @@
|
|||||||
new /obj/item/clothing/mask/smokable/cigarette(src)
|
new /obj/item/clothing/mask/smokable/cigarette(src)
|
||||||
create_reagents(15 * storage_slots)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one
|
create_reagents(15 * storage_slots)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one
|
||||||
|
|
||||||
/obj/item/weapon/storage/fancy/cigarettes/Destroy()
|
|
||||||
qdel(reagents)
|
|
||||||
..()
|
|
||||||
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/fancy/cigarettes/update_icon()
|
/obj/item/weapon/storage/fancy/cigarettes/update_icon()
|
||||||
icon_state = "[initial(icon_state)][contents.len]"
|
icon_state = "[initial(icon_state)][contents.len]"
|
||||||
return
|
return
|
||||||
@@ -202,10 +197,6 @@
|
|||||||
new /obj/item/clothing/mask/smokable/cigarette/cigar(src)
|
new /obj/item/clothing/mask/smokable/cigarette/cigar(src)
|
||||||
create_reagents(15 * storage_slots)
|
create_reagents(15 * storage_slots)
|
||||||
|
|
||||||
/obj/item/weapon/storage/fancy/cigar/Destroy()
|
|
||||||
qdel(reagents)
|
|
||||||
..()
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/fancy/cigar/update_icon()
|
/obj/item/weapon/storage/fancy/cigar/update_icon()
|
||||||
icon_state = "[initial(icon_state)][contents.len]"
|
icon_state = "[initial(icon_state)][contents.len]"
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -25,6 +25,16 @@ LINEN BINS
|
|||||||
add_fingerprint(user)
|
add_fingerprint(user)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
/obj/item/weapon/bedsheet/attackby(obj/item/I, mob/user)
|
||||||
|
if(is_sharp(I))
|
||||||
|
user.visible_message("<span class='notice'>\The [user] begins cutting up [src] with [I].</span>", "<span class='notice'>You begin cutting up [src] with [I].</span>")
|
||||||
|
if(do_after(user, 50))
|
||||||
|
user << "<span class='notice'>You cut [src] into pieces!</span>"
|
||||||
|
for(var/i in 1 to rand(2,5))
|
||||||
|
new /obj/item/weapon/reagent_containers/glass/rag(src.loc)
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
..()
|
||||||
|
|
||||||
/obj/item/weapon/bedsheet/blue
|
/obj/item/weapon/bedsheet/blue
|
||||||
icon_state = "sheetblue"
|
icon_state = "sheetblue"
|
||||||
|
|||||||
@@ -11,16 +11,16 @@
|
|||||||
|
|
||||||
New()
|
New()
|
||||||
..()
|
..()
|
||||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
|
new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src )
|
||||||
return
|
return
|
||||||
|
|
||||||
/obj/structure/closet/secure_closet/bar/update_icon()
|
/obj/structure/closet/secure_closet/bar/update_icon()
|
||||||
|
|||||||
@@ -42,11 +42,11 @@
|
|||||||
/obj/structure/closet/syndicate/nuclear/New()
|
/obj/structure/closet/syndicate/nuclear/New()
|
||||||
..()
|
..()
|
||||||
|
|
||||||
new /obj/item/ammo_magazine/a12mm(src)
|
new /obj/item/ammo_magazine/a10mm(src)
|
||||||
new /obj/item/ammo_magazine/a12mm(src)
|
new /obj/item/ammo_magazine/a10mm(src)
|
||||||
new /obj/item/ammo_magazine/a12mm(src)
|
new /obj/item/ammo_magazine/a10mm(src)
|
||||||
new /obj/item/ammo_magazine/a12mm(src)
|
new /obj/item/ammo_magazine/a10mm(src)
|
||||||
new /obj/item/ammo_magazine/a12mm(src)
|
new /obj/item/ammo_magazine/a10mm(src)
|
||||||
new /obj/item/weapon/storage/box/handcuffs(src)
|
new /obj/item/weapon/storage/box/handcuffs(src)
|
||||||
new /obj/item/weapon/storage/box/flashbangs(src)
|
new /obj/item/weapon/storage/box/flashbangs(src)
|
||||||
new /obj/item/weapon/gun/energy/gun(src)
|
new /obj/item/weapon/gun/energy/gun(src)
|
||||||
|
|||||||
@@ -395,7 +395,7 @@
|
|||||||
if (istype(RG) && RG.is_open_container())
|
if (istype(RG) && RG.is_open_container())
|
||||||
RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this))
|
RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this))
|
||||||
user.visible_message("<span class='notice'>[user] fills \the [RG] using \the [src].</span>","<span class='notice'>You fill \the [RG] using \the [src].</span>")
|
user.visible_message("<span class='notice'>[user] fills \the [RG] using \the [src].</span>","<span class='notice'>You fill \the [RG] using \the [src].</span>")
|
||||||
return
|
return 1
|
||||||
|
|
||||||
else if (istype(O, /obj/item/weapon/melee/baton))
|
else if (istype(O, /obj/item/weapon/melee/baton))
|
||||||
var/obj/item/weapon/melee/baton/B = O
|
var/obj/item/weapon/melee/baton/B = O
|
||||||
@@ -413,7 +413,7 @@
|
|||||||
user.visible_message( \
|
user.visible_message( \
|
||||||
"<span class='danger'>[user] was stunned by \his wet [O]!</span>", \
|
"<span class='danger'>[user] was stunned by \his wet [O]!</span>", \
|
||||||
"<span class='userdanger'>[user] was stunned by \his wet [O]!</span>")
|
"<span class='userdanger'>[user] was stunned by \his wet [O]!</span>")
|
||||||
return
|
return 1
|
||||||
// Short of a rewrite, this is necessary to stop monkeycubes being washed.
|
// Short of a rewrite, this is necessary to stop monkeycubes being washed.
|
||||||
else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
|
else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -239,6 +239,7 @@
|
|||||||
if(istype(W, /obj/item/weapon/screwdriver))
|
if(istype(W, /obj/item/weapon/screwdriver))
|
||||||
if(reinf && state >= 1)
|
if(reinf && state >= 1)
|
||||||
state = 3 - state
|
state = 3 - state
|
||||||
|
update_nearby_icons()
|
||||||
playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
|
playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
|
||||||
user << (state == 1 ? "<span class='notice'>You have unfastened the window from the frame.</span>" : "<span class='notice'>You have fastened the window to the frame.</span>")
|
user << (state == 1 ? "<span class='notice'>You have unfastened the window from the frame.</span>" : "<span class='notice'>You have fastened the window to the frame.</span>")
|
||||||
else if(reinf && state == 0)
|
else if(reinf && state == 0)
|
||||||
@@ -337,7 +338,11 @@
|
|||||||
/obj/structure/window/Destroy()
|
/obj/structure/window/Destroy()
|
||||||
density = 0
|
density = 0
|
||||||
update_nearby_tiles()
|
update_nearby_tiles()
|
||||||
update_nearby_icons()
|
var/turf/location = loc
|
||||||
|
loc = null
|
||||||
|
for(var/obj/structure/window/W in orange(location, 1))
|
||||||
|
W.update_icon()
|
||||||
|
loc = location
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
|
||||||
@@ -357,35 +362,31 @@
|
|||||||
//This proc is used to update the icons of nearby windows. It should not be confused with update_nearby_tiles(), which is an atmos proc!
|
//This proc is used to update the icons of nearby windows. It should not be confused with update_nearby_tiles(), which is an atmos proc!
|
||||||
/obj/structure/window/proc/update_nearby_icons()
|
/obj/structure/window/proc/update_nearby_icons()
|
||||||
update_icon()
|
update_icon()
|
||||||
for(var/direction in cardinal)
|
for(var/obj/structure/window/W in orange(src, 1))
|
||||||
for(var/obj/structure/window/W in get_step(src,direction) )
|
W.update_icon()
|
||||||
W.update_icon()
|
|
||||||
|
|
||||||
//merges adjacent full-tile windows into one (blatant ripoff from game/smoothwall.dm)
|
//merges adjacent full-tile windows into one (blatant ripoff from game/smoothwall.dm)
|
||||||
/obj/structure/window/update_icon()
|
/obj/structure/window/update_icon()
|
||||||
//A little cludge here, since I don't know how it will work with slim windows. Most likely VERY wrong.
|
//A little cludge here, since I don't know how it will work with slim windows. Most likely VERY wrong.
|
||||||
//this way it will only update full-tile ones
|
//this way it will only update full-tile ones
|
||||||
//This spawn is here so windows get properly updated when one gets deleted.
|
overlays.Cut()
|
||||||
spawn(2)
|
if(!is_fulltile())
|
||||||
if(!src) return
|
icon_state = "[basestate]"
|
||||||
if(!is_fulltile())
|
|
||||||
icon_state = "[basestate]"
|
|
||||||
return
|
|
||||||
var/junction = 0 //will be used to determine from which side the window is connected to other windows
|
|
||||||
if(anchored)
|
|
||||||
for(var/obj/structure/window/W in orange(src,1))
|
|
||||||
if(W.anchored && W.density && W.is_fulltile()) //Only counts anchored, not-destroyed fill-tile windows.
|
|
||||||
if(abs(x-W.x)-abs(y-W.y) ) //doesn't count windows, placed diagonally to src
|
|
||||||
junction |= get_dir(src,W)
|
|
||||||
if(opacity)
|
|
||||||
icon_state = "[basestate][junction]"
|
|
||||||
else
|
|
||||||
if(reinf)
|
|
||||||
icon_state = "[basestate][junction]"
|
|
||||||
else
|
|
||||||
icon_state = "[basestate][junction]"
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
var/list/dirs = list()
|
||||||
|
if(anchored)
|
||||||
|
for(var/obj/structure/window/W in orange(src,1))
|
||||||
|
if(W.anchored && W.density && W.type == src.type && W.is_fulltile()) //Only counts anchored, not-destroyed fill-tile windows.
|
||||||
|
dirs += get_dir(src, W)
|
||||||
|
|
||||||
|
var/list/connections = dirs_to_corner_states(dirs)
|
||||||
|
|
||||||
|
icon_state = ""
|
||||||
|
for(var/i = 1 to 4)
|
||||||
|
var/image/I = image(icon, "[basestate][connections[i]]", dir = 1<<(i-1))
|
||||||
|
overlays += I
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
/obj/structure/window/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
/obj/structure/window/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||||
if(exposed_temperature > T0C + 800)
|
if(exposed_temperature > T0C + 800)
|
||||||
@@ -466,11 +467,9 @@
|
|||||||
basestate = "window"
|
basestate = "window"
|
||||||
maxhealth = 40
|
maxhealth = 40
|
||||||
reinf = 1
|
reinf = 1
|
||||||
|
basestate = "w"
|
||||||
dir = 5
|
dir = 5
|
||||||
|
|
||||||
update_icon() //icon_state has to be set manually
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/structure/window/reinforced/polarized
|
/obj/structure/window/reinforced/polarized
|
||||||
name = "electrochromic window"
|
name = "electrochromic window"
|
||||||
desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it."
|
desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it."
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ var/list/mechtoys = list(
|
|||||||
|
|
||||||
// Sell phoron and platinum
|
// Sell phoron and platinum
|
||||||
if(istype(A, /obj/item/stack))
|
if(istype(A, /obj/item/stack))
|
||||||
var/obj/item/stack/P
|
var/obj/item/stack/P = A
|
||||||
switch(P.get_material_name())
|
switch(P.get_material_name())
|
||||||
if("phoron") phoron_count += P.get_amount()
|
if("phoron") phoron_count += P.get_amount()
|
||||||
if("platinum") plat_count += P.get_amount()
|
if("platinum") plat_count += P.get_amount()
|
||||||
|
|||||||
@@ -6,16 +6,16 @@
|
|||||||
|
|
||||||
if(density)
|
if(density)
|
||||||
can_open = WALL_OPENING
|
can_open = WALL_OPENING
|
||||||
set_wall_state("[material.icon_base]fwall_open")
|
|
||||||
//flick("[material.icon_base]fwall_opening", src)
|
//flick("[material.icon_base]fwall_opening", src)
|
||||||
sleep(15)
|
sleep(15)
|
||||||
density = 0
|
density = 0
|
||||||
|
update_icon()
|
||||||
set_light(0)
|
set_light(0)
|
||||||
else
|
else
|
||||||
can_open = WALL_OPENING
|
can_open = WALL_OPENING
|
||||||
//flick("[material.icon_base]fwall_closing", src)
|
//flick("[material.icon_base]fwall_closing", src)
|
||||||
set_wall_state("[material.icon_base]0")
|
|
||||||
density = 1
|
density = 1
|
||||||
|
update_icon()
|
||||||
sleep(15)
|
sleep(15)
|
||||||
set_light(1)
|
set_light(1)
|
||||||
|
|
||||||
@@ -208,7 +208,7 @@
|
|||||||
construction_stage = 5
|
construction_stage = 5
|
||||||
new /obj/item/stack/rods( src )
|
new /obj/item/stack/rods( src )
|
||||||
user << "<span class='notice'>You cut the outer grille.</span>"
|
user << "<span class='notice'>You cut the outer grille.</span>"
|
||||||
set_wall_state()
|
update_icon()
|
||||||
return
|
return
|
||||||
if(5)
|
if(5)
|
||||||
if (istype(W, /obj/item/weapon/screwdriver))
|
if (istype(W, /obj/item/weapon/screwdriver))
|
||||||
@@ -217,7 +217,7 @@
|
|||||||
if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 5)
|
if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 5)
|
||||||
return
|
return
|
||||||
construction_stage = 4
|
construction_stage = 4
|
||||||
set_wall_state()
|
update_icon()
|
||||||
user << "<span class='notice'>You remove the support lines.</span>"
|
user << "<span class='notice'>You remove the support lines.</span>"
|
||||||
return
|
return
|
||||||
else if( istype(W, /obj/item/stack/rods) )
|
else if( istype(W, /obj/item/stack/rods) )
|
||||||
@@ -225,7 +225,7 @@
|
|||||||
if(O.get_amount()>0)
|
if(O.get_amount()>0)
|
||||||
O.use(1)
|
O.use(1)
|
||||||
construction_stage = 6
|
construction_stage = 6
|
||||||
set_wall_state()
|
update_icon()
|
||||||
user << "<span class='notice'>You replace the outer grille.</span>"
|
user << "<span class='notice'>You replace the outer grille.</span>"
|
||||||
return
|
return
|
||||||
if(4)
|
if(4)
|
||||||
@@ -247,7 +247,7 @@
|
|||||||
if(!do_after(user, 60) || !istype(src, /turf/simulated/wall) || construction_stage != 4)
|
if(!do_after(user, 60) || !istype(src, /turf/simulated/wall) || construction_stage != 4)
|
||||||
return
|
return
|
||||||
construction_stage = 3
|
construction_stage = 3
|
||||||
set_wall_state()
|
update_icon()
|
||||||
user << "<span class='notice'>You press firmly on the cover, dislodging it.</span>"
|
user << "<span class='notice'>You press firmly on the cover, dislodging it.</span>"
|
||||||
return
|
return
|
||||||
if(3)
|
if(3)
|
||||||
@@ -257,7 +257,7 @@
|
|||||||
if(!do_after(user,100) || !istype(src, /turf/simulated/wall) || construction_stage != 3)
|
if(!do_after(user,100) || !istype(src, /turf/simulated/wall) || construction_stage != 3)
|
||||||
return
|
return
|
||||||
construction_stage = 2
|
construction_stage = 2
|
||||||
set_wall_state()
|
update_icon()
|
||||||
user << "<span class='notice'>You pry off the cover.</span>"
|
user << "<span class='notice'>You pry off the cover.</span>"
|
||||||
return
|
return
|
||||||
if(2)
|
if(2)
|
||||||
@@ -267,7 +267,7 @@
|
|||||||
if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 2)
|
if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 2)
|
||||||
return
|
return
|
||||||
construction_stage = 1
|
construction_stage = 1
|
||||||
set_wall_state()
|
update_icon()
|
||||||
user << "<span class='notice'>You remove the bolts anchoring the support rods.</span>"
|
user << "<span class='notice'>You remove the bolts anchoring the support rods.</span>"
|
||||||
return
|
return
|
||||||
if(1)
|
if(1)
|
||||||
@@ -287,7 +287,7 @@
|
|||||||
if(!do_after(user,70) || !istype(src, /turf/simulated/wall) || construction_stage != 1)
|
if(!do_after(user,70) || !istype(src, /turf/simulated/wall) || construction_stage != 1)
|
||||||
return
|
return
|
||||||
construction_stage = 0
|
construction_stage = 0
|
||||||
set_wall_state()
|
update_icon()
|
||||||
new /obj/item/stack/rods(src)
|
new /obj/item/stack/rods(src)
|
||||||
user << "<span class='notice'>The support rods drop out as you cut them loose from the frame.</span>"
|
user << "<span class='notice'>The support rods drop out as you cut them loose from the frame.</span>"
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -21,58 +21,19 @@
|
|||||||
name = "[material.display_name] wall"
|
name = "[material.display_name] wall"
|
||||||
desc = "It seems to be a section of hull plated with [material.display_name]."
|
desc = "It seems to be a section of hull plated with [material.display_name]."
|
||||||
|
|
||||||
set_wall_state("[material.icon_base]0")
|
|
||||||
|
|
||||||
if(material.opacity > 0.5 && !opacity)
|
if(material.opacity > 0.5 && !opacity)
|
||||||
set_light(1)
|
set_light(1)
|
||||||
else if(material.opacity < 0.5 && opacity)
|
else if(material.opacity < 0.5 && opacity)
|
||||||
set_light(0)
|
set_light(0)
|
||||||
|
|
||||||
|
update_connections(1)
|
||||||
update_icon()
|
update_icon()
|
||||||
check_relatives()
|
|
||||||
|
|
||||||
/turf/simulated/wall/proc/set_wall_state(var/new_state)
|
|
||||||
|
|
||||||
if(!material)
|
|
||||||
return
|
|
||||||
|
|
||||||
if(new_state)
|
|
||||||
last_state = new_state
|
|
||||||
else if(last_state)
|
|
||||||
new_state = last_state
|
|
||||||
else
|
|
||||||
return
|
|
||||||
|
|
||||||
overlays.Cut()
|
|
||||||
damage_overlay = 0
|
|
||||||
|
|
||||||
if(!wall_cache["[new_state]-[material.icon_colour]"])
|
|
||||||
var/image/I = image(icon='icons/turf/wall_masks.dmi',icon_state="[new_state]")
|
|
||||||
I.color = material.icon_colour
|
|
||||||
wall_cache["[new_state]-[material.icon_colour]"] = I
|
|
||||||
overlays |= wall_cache["[new_state]-[material.icon_colour]"]
|
|
||||||
if(reinf_material)
|
|
||||||
|
|
||||||
var/cache_key = "[material.icon_reinf]-[reinf_material.icon_colour]"
|
|
||||||
if(!isnull(construction_stage) && construction_stage<6)
|
|
||||||
cache_key = "reinf_construct-[reinf_material.icon_colour]-[construction_stage]"
|
|
||||||
|
|
||||||
if(!wall_cache[cache_key])
|
|
||||||
var/image/I
|
|
||||||
if(!isnull(construction_stage) && construction_stage<6)
|
|
||||||
I = image(icon='icons/turf/wall_masks.dmi',icon_state="reinf_construct-[construction_stage]")
|
|
||||||
else
|
|
||||||
I = image(icon='icons/turf/wall_masks.dmi',icon_state="[material.icon_reinf]")
|
|
||||||
I.color = reinf_material.icon_colour
|
|
||||||
wall_cache[cache_key] = I
|
|
||||||
overlays |= wall_cache[cache_key]
|
|
||||||
|
|
||||||
/turf/simulated/wall/proc/set_material(var/material/newmaterial, var/material/newrmaterial)
|
/turf/simulated/wall/proc/set_material(var/material/newmaterial, var/material/newrmaterial)
|
||||||
material = newmaterial
|
material = newmaterial
|
||||||
reinf_material = newrmaterial
|
reinf_material = newrmaterial
|
||||||
update_material()
|
update_material()
|
||||||
check_relatives()
|
|
||||||
check_relatives(1)
|
|
||||||
|
|
||||||
/turf/simulated/wall/proc/update_icon()
|
/turf/simulated/wall/proc/update_icon()
|
||||||
if(!material)
|
if(!material)
|
||||||
@@ -81,16 +42,38 @@
|
|||||||
if(!damage_overlays[1]) //list hasn't been populated
|
if(!damage_overlays[1]) //list hasn't been populated
|
||||||
generate_overlays()
|
generate_overlays()
|
||||||
|
|
||||||
if(density)
|
overlays.Cut()
|
||||||
check_relatives(1)
|
var/image/I
|
||||||
else
|
|
||||||
set_wall_state("[material.icon_base]fwall_open")
|
|
||||||
|
|
||||||
if(damage == 0)
|
if(!density)
|
||||||
if(damage_overlay != 0)
|
I = image('icons/turf/wall_masks.dmi', "[material.icon_base]fwall_open")
|
||||||
overlays -= damage_overlays[damage_overlay]
|
I.color = material.icon_colour
|
||||||
damage_overlay = 0
|
overlays += I
|
||||||
else if(density)
|
return
|
||||||
|
|
||||||
|
for(var/i = 1 to 4)
|
||||||
|
I = image('icons/turf/wall_masks.dmi', "[material.icon_base][wall_connections[i]]", dir = 1<<(i-1))
|
||||||
|
I.color = material.icon_colour
|
||||||
|
overlays += I
|
||||||
|
|
||||||
|
if(reinf_material)
|
||||||
|
if(construction_stage != null && construction_stage < 6)
|
||||||
|
I = image('icons/turf/wall_masks.dmi', "reinf_construct-[construction_stage]")
|
||||||
|
I.color = reinf_material.icon_colour
|
||||||
|
overlays += I
|
||||||
|
else
|
||||||
|
if("[reinf_material.icon_reinf]0" in icon_states('icons/turf/wall_masks.dmi'))
|
||||||
|
// Directional icon
|
||||||
|
for(var/i = 1 to 4)
|
||||||
|
I = image('icons/turf/wall_masks.dmi', "[reinf_material.icon_reinf][wall_connections[i]]", dir = 1<<(i-1))
|
||||||
|
I.color = reinf_material.icon_colour
|
||||||
|
overlays += I
|
||||||
|
else
|
||||||
|
I = image('icons/turf/wall_masks.dmi', reinf_material.icon_reinf)
|
||||||
|
I.color = reinf_material.icon_colour
|
||||||
|
overlays += I
|
||||||
|
|
||||||
|
if(damage != 0)
|
||||||
var/integrity = material.integrity
|
var/integrity = material.integrity
|
||||||
if(reinf_material)
|
if(reinf_material)
|
||||||
integrity += reinf_material.integrity
|
integrity += reinf_material.integrity
|
||||||
@@ -99,12 +82,7 @@
|
|||||||
if(overlay > damage_overlays.len)
|
if(overlay > damage_overlays.len)
|
||||||
overlay = damage_overlays.len
|
overlay = damage_overlays.len
|
||||||
|
|
||||||
if(damage_overlay && overlay == damage_overlay) //No need to update.
|
|
||||||
return
|
|
||||||
|
|
||||||
if(damage_overlay) overlays -= damage_overlays[damage_overlay]
|
|
||||||
overlays += damage_overlays[overlay]
|
overlays += damage_overlays[overlay]
|
||||||
damage_overlay = overlay
|
|
||||||
return
|
return
|
||||||
|
|
||||||
/turf/simulated/wall/proc/generate_overlays()
|
/turf/simulated/wall/proc/generate_overlays()
|
||||||
@@ -116,25 +94,21 @@
|
|||||||
img.alpha = (i * alpha_inc) - 1
|
img.alpha = (i * alpha_inc) - 1
|
||||||
damage_overlays[i] = img
|
damage_overlays[i] = img
|
||||||
|
|
||||||
//Smoothwall code. update_self for relativewall(), not for relativewall_neighbors()
|
|
||||||
/turf/simulated/wall/proc/check_relatives(var/update_self)
|
/turf/simulated/wall/proc/update_connections(propagate = 0)
|
||||||
if(!material)
|
if(!material)
|
||||||
return
|
return
|
||||||
var/junction
|
var/list/dirs = list()
|
||||||
if(update_self)
|
for(var/turf/simulated/wall/W in orange(src, 1))
|
||||||
junction = 0
|
if(!W.material)
|
||||||
for(var/checkdir in cardinal)
|
|
||||||
var/turf/simulated/wall/T = get_step(src, checkdir)
|
|
||||||
if(!istype(T) || !T.material)
|
|
||||||
continue
|
continue
|
||||||
if(update_self)
|
if(propagate)
|
||||||
if(can_join_with(T))
|
W.update_connections()
|
||||||
junction |= get_dir(src,T) //Not too sure why, but using checkdir just breaks walls.
|
W.update_icon()
|
||||||
else
|
if(can_join_with(W))
|
||||||
T.check_relatives(1)
|
dirs += get_dir(src, W)
|
||||||
if(!isnull(junction))
|
|
||||||
set_wall_state("[material.icon_base][junction]")
|
wall_connections = dirs_to_corner_states(dirs)
|
||||||
return
|
|
||||||
|
|
||||||
/turf/simulated/wall/proc/can_join_with(var/turf/simulated/wall/W)
|
/turf/simulated/wall/proc/can_join_with(var/turf/simulated/wall/W)
|
||||||
if(material && W.material && material.icon_base == W.material.icon_base)
|
if(material && W.material && material.icon_base == W.material.icon_base)
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
var/list/global/wall_cache = list()
|
|
||||||
|
|
||||||
/turf/simulated/wall
|
/turf/simulated/wall
|
||||||
name = "wall"
|
name = "wall"
|
||||||
desc = "A huge chunk of metal used to seperate rooms."
|
desc = "A huge chunk of metal used to seperate rooms."
|
||||||
@@ -21,6 +19,8 @@ var/list/global/wall_cache = list()
|
|||||||
var/last_state
|
var/last_state
|
||||||
var/construction_stage
|
var/construction_stage
|
||||||
|
|
||||||
|
var/list/wall_connections = list("0", "0", "0", "0")
|
||||||
|
|
||||||
/turf/simulated/wall/New(var/newloc, var/materialtype, var/rmaterialtype)
|
/turf/simulated/wall/New(var/newloc, var/materialtype, var/rmaterialtype)
|
||||||
..(newloc)
|
..(newloc)
|
||||||
icon_state = "blank"
|
icon_state = "blank"
|
||||||
@@ -171,7 +171,7 @@ var/list/global/wall_cache = list()
|
|||||||
clear_plants()
|
clear_plants()
|
||||||
material = get_material_by_name("placeholder")
|
material = get_material_by_name("placeholder")
|
||||||
reinf_material = null
|
reinf_material = null
|
||||||
check_relatives()
|
update_connections(1)
|
||||||
|
|
||||||
ChangeTurf(/turf/simulated/floor/plating)
|
ChangeTurf(/turf/simulated/floor/plating)
|
||||||
|
|
||||||
|
|||||||
@@ -1401,7 +1401,7 @@ datum/preferences
|
|||||||
backbag = backbaglist.Find(new_backbag)
|
backbag = backbaglist.Find(new_backbag)
|
||||||
|
|
||||||
if("nt_relation")
|
if("nt_relation")
|
||||||
var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed")
|
var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in COMPANY_ALIGNMENTS
|
||||||
if(new_relation)
|
if(new_relation)
|
||||||
nanotrasen_relation = new_relation
|
nanotrasen_relation = new_relation
|
||||||
|
|
||||||
|
|||||||
@@ -275,6 +275,41 @@ BLIND // can't see anything
|
|||||||
update_icon(user)
|
update_icon(user)
|
||||||
user.update_action_buttons()
|
user.update_action_buttons()
|
||||||
|
|
||||||
|
/obj/item/clothing/head/attack_ai(var/mob/user)
|
||||||
|
if(!mob_wear_hat(user))
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/clothing/head/attack_generic(var/mob/user)
|
||||||
|
if(!mob_wear_hat(user))
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user)
|
||||||
|
if(!Adjacent(user))
|
||||||
|
return 0
|
||||||
|
var/success
|
||||||
|
if(istype(user, /mob/living/silicon/robot/drone))
|
||||||
|
var/mob/living/silicon/robot/drone/D = user
|
||||||
|
if(D.hat)
|
||||||
|
success = 2
|
||||||
|
else
|
||||||
|
D.wear_hat(src)
|
||||||
|
success = 1
|
||||||
|
else if(istype(user, /mob/living/carbon/alien/diona))
|
||||||
|
var/mob/living/carbon/alien/diona/D = user
|
||||||
|
if(D.hat)
|
||||||
|
success = 2
|
||||||
|
else
|
||||||
|
D.wear_hat(src)
|
||||||
|
success = 1
|
||||||
|
|
||||||
|
if(!success)
|
||||||
|
return 0
|
||||||
|
else if(success == 2)
|
||||||
|
user << "<span class='warning'>You are already wearing a hat.</span>"
|
||||||
|
else if(success == 1)
|
||||||
|
user << "<span class='notice'>You crawl under \the [src].</span>"
|
||||||
|
return 1
|
||||||
|
|
||||||
/obj/item/clothing/head/update_icon(var/mob/user)
|
/obj/item/clothing/head/update_icon(var/mob/user)
|
||||||
|
|
||||||
overlays.Cut()
|
overlays.Cut()
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
name = "mounted grenade launcher"
|
name = "mounted grenade launcher"
|
||||||
desc = "A shoulder-mounted micro-explosive dispenser."
|
desc = "A shoulder-mounted micro-explosive dispenser."
|
||||||
selectable = 1
|
selectable = 1
|
||||||
icon_state = "grenadelauncher"
|
icon_state = "grenade"
|
||||||
|
|
||||||
interface_name = "integrated grenade launcher"
|
interface_name = "integrated grenade launcher"
|
||||||
interface_desc = "Discharges loaded grenades against the wearer's location."
|
interface_desc = "Discharges loaded grenades against the wearer's location."
|
||||||
|
|||||||
@@ -14,33 +14,207 @@
|
|||||||
var/track_blood = 0
|
var/track_blood = 0
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/glass/rag
|
/obj/item/weapon/reagent_containers/glass/rag
|
||||||
name = "damp rag"
|
name = "rag"
|
||||||
desc = "For cleaning up messes, you suppose."
|
desc = "For cleaning up messes, you suppose."
|
||||||
w_class = 1
|
w_class = 1
|
||||||
icon = 'icons/obj/toy.dmi'
|
icon = 'icons/obj/toy.dmi'
|
||||||
icon_state = "rag"
|
icon_state = "rag"
|
||||||
amount_per_transfer_from_this = 5
|
amount_per_transfer_from_this = 5
|
||||||
possible_transfer_amounts = list(5)
|
possible_transfer_amounts = list(5)
|
||||||
volume = 5
|
volume = 10
|
||||||
can_be_placed_into = null
|
can_be_placed_into = null
|
||||||
flags = OPENCONTAINER | NOBLUDGEON
|
flags = OPENCONTAINER | NOBLUDGEON
|
||||||
|
|
||||||
|
var/on_fire = 0
|
||||||
|
var/burn_time = 20 //if the rag burns for too long it turns to ashes
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/New()
|
||||||
|
..()
|
||||||
|
update_name()
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/Destroy()
|
||||||
|
processing_objects -= src //so we don't continue turning to ash while gc'd
|
||||||
|
..()
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/glass/rag/attack_self(mob/user as mob)
|
/obj/item/weapon/reagent_containers/glass/rag/attack_self(mob/user as mob)
|
||||||
return
|
if(on_fire)
|
||||||
|
user.visible_message("<span class='warning'>\The [user] stamps out [src].</span>", "<span class='warning'>You stamp out [src].</span>")
|
||||||
|
user.unEquip(src)
|
||||||
|
extinguish()
|
||||||
|
else
|
||||||
|
remove_contents(user)
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/attackby(obj/item/W, mob/user)
|
||||||
|
if(!on_fire && istype(W, /obj/item/weapon/flame))
|
||||||
|
var/obj/item/weapon/flame/F = W
|
||||||
|
if(F.lit)
|
||||||
|
ignite()
|
||||||
|
if(on_fire)
|
||||||
|
visible_message("<span class='warning'>\The [user] lights [src] with [W].</span>")
|
||||||
|
else
|
||||||
|
user << "<span class='warning'>You manage to singe [src], but fail to light it.</span>"
|
||||||
|
|
||||||
|
. = ..()
|
||||||
|
update_name()
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/proc/update_name()
|
||||||
|
if(on_fire)
|
||||||
|
name = "burning [initial(name)]"
|
||||||
|
else if(reagents.total_volume)
|
||||||
|
name = "damp [initial(name)]"
|
||||||
|
else
|
||||||
|
name = "dry [initial(name)]"
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/update_icon()
|
||||||
|
if(on_fire)
|
||||||
|
icon_state = "raglit"
|
||||||
|
else
|
||||||
|
icon_state = "rag"
|
||||||
|
|
||||||
|
var/obj/item/weapon/reagent_containers/food/drinks/bottle/B = loc
|
||||||
|
if(istype(B))
|
||||||
|
B.update_icon()
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/proc/remove_contents(mob/user, atom/trans_dest = null)
|
||||||
|
if(!trans_dest && !user.loc)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(reagents.total_volume)
|
||||||
|
var/target_text = trans_dest? "\the [trans_dest]" : "\the [user.loc]"
|
||||||
|
user.visible_message("<span class='danger'>\The [user] begins to wring out [src] over [target_text].</span>", "<span class='notice'>You begin to wring out [src] over [target_text].</span>")
|
||||||
|
|
||||||
|
if(do_after(user, reagents.total_volume*5)) //50 for a fully soaked rag
|
||||||
|
if(trans_dest)
|
||||||
|
reagents.trans_to(trans_dest, reagents.total_volume)
|
||||||
|
else
|
||||||
|
reagents.splash(user.loc, reagents.total_volume)
|
||||||
|
user.visible_message("<span class='danger'>\The [user] wrings out [src] over [target_text].</span>", "<span class='notice'>You finish to wringing out [src].</span>")
|
||||||
|
update_name()
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/proc/wipe_down(atom/A, mob/user)
|
||||||
|
if(!reagents.total_volume)
|
||||||
|
user << "<span class='warning'>The [initial(name)] is dry!</span>"
|
||||||
|
else
|
||||||
|
user.visible_message("\The [user] starts to wipe down [A] with [src]!")
|
||||||
|
reagents.splash(A, 1) //get a small amount of liquid on the thing we're wiping.
|
||||||
|
update_name()
|
||||||
|
if(do_after(user,30))
|
||||||
|
user.visible_message("\The [user] finishes wiping off the [A]!")
|
||||||
|
A.clean_blood()
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag)
|
/obj/item/weapon/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag)
|
||||||
if(ismob(target) && target.reagents && reagents.total_volume)
|
if(isliving(target))
|
||||||
user.visible_message("\red \The [target] has been smothered with \the [src] by \the [user]!", "\red You smother \the [target] with \the [src]!", "You hear some struggling and muffled cries of surprise")
|
var/mob/living/M = target
|
||||||
reagents.trans_to_mob(target, reagents.total_volume, CHEM_INGEST)
|
if(on_fire)
|
||||||
|
user.visible_message("<span class='danger'>\The [user] hits [target] with [src]!</span>",)
|
||||||
|
user.do_attack_animation(src)
|
||||||
|
M.IgniteMob()
|
||||||
|
else if(reagents.total_volume)
|
||||||
|
if(user.zone_sel.selecting == "mouth")
|
||||||
|
user.do_attack_animation(src)
|
||||||
|
user.visible_message(
|
||||||
|
"<span class='danger'>\The [user] smothers [target] with [src]!</span>",
|
||||||
|
"<span class='warning'>You smother [target] with [src]!</span>",
|
||||||
|
"You hear some struggling and muffled cries of surprise"
|
||||||
|
)
|
||||||
|
|
||||||
|
//it's inhaled, so... maybe CHEM_BLOOD doesn't make a whole lot of sense but it's the best we can do for now
|
||||||
|
reagents.trans_to_mob(target, amount_per_transfer_from_this, CHEM_BLOOD)
|
||||||
|
update_name()
|
||||||
|
else
|
||||||
|
wipe_down(target, user)
|
||||||
return
|
return
|
||||||
else
|
|
||||||
..()
|
return ..()
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/glass/rag/afterattack(atom/A as obj|turf|area, mob/user as mob, proximity)
|
/obj/item/weapon/reagent_containers/glass/rag/afterattack(atom/A as obj|turf|area, mob/user as mob, proximity)
|
||||||
if(!proximity) return
|
if(!proximity)
|
||||||
if(istype(A) && src in user)
|
return
|
||||||
user.visible_message("[user] starts to wipe down [A] with [src]!")
|
|
||||||
if(do_after(user,30))
|
if(istype(A, /obj/structure/reagent_dispensers))
|
||||||
user.visible_message("[user] finishes wiping off the [A]!")
|
if(!reagents.get_free_space())
|
||||||
A.clean_blood()
|
user << "<span class='warning'>\The [src] is already soaked.</span>"
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if(A.reagents && A.reagents.trans_to_obj(src, reagents.maximum_volume))
|
||||||
|
user.visible_message("<span class='notice'>\The [user] soaks [src] using [A].</span>", "<span class='notice'>You soak [src] using [A].</span>")
|
||||||
|
update_name()
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!on_fire && istype(A) && (src in user))
|
||||||
|
if(A.is_open_container())
|
||||||
|
remove_contents(user, A)
|
||||||
|
else if(!ismob(A)) //mobs are handled in attack() - this prevents us from wiping down people while smothering them.
|
||||||
|
wipe_down(A, user)
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||||
|
if(exposed_temperature >= 50 + T0C)
|
||||||
|
ignite()
|
||||||
|
if(exposed_temperature >= 900 + T0C)
|
||||||
|
new /obj/effect/decal/cleanable/ash(get_turf(src))
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
//rag must have a minimum of 2 units welder fuel and at least 80% of the reagents must be welder fuel.
|
||||||
|
//maybe generalize flammable reagents someday
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/proc/can_ignite()
|
||||||
|
var/fuel = reagents.get_reagent_amount("fuel")
|
||||||
|
return (fuel >= 2 && fuel >= reagents.total_volume*0.8)
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/proc/ignite()
|
||||||
|
if(on_fire)
|
||||||
|
return
|
||||||
|
if(!can_ignite())
|
||||||
|
return
|
||||||
|
|
||||||
|
//also copied from matches
|
||||||
|
if(reagents.get_reagent_amount("phoron")) // the phoron explodes when exposed to fire
|
||||||
|
visible_message("<span class='danger'>\The [src] conflagrates violently!</span>")
|
||||||
|
var/datum/effect/effect/system/reagents_explosion/e = new()
|
||||||
|
e.set_up(round(reagents.get_reagent_amount("phoron") / 2.5, 1), get_turf(src), 0, 0)
|
||||||
|
e.start()
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
|
||||||
|
processing_objects += src
|
||||||
|
set_light(2, null, "#E38F46")
|
||||||
|
on_fire = 1
|
||||||
|
update_name()
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/proc/extinguish()
|
||||||
|
processing_objects -= src
|
||||||
|
set_light(0)
|
||||||
|
on_fire = 0
|
||||||
|
|
||||||
|
//rags sitting around with 1 second of burn time left is dumb.
|
||||||
|
//ensures players always have a few seconds of burn time left when they light their rag
|
||||||
|
if(burn_time <= 5)
|
||||||
|
visible_message("<span class='warning'>\The [src] falls apart!</span>")
|
||||||
|
new /obj/effect/decal/cleanable/ash(get_turf(src))
|
||||||
|
qdel(src)
|
||||||
|
update_name()
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/glass/rag/process()
|
||||||
|
if(!can_ignite())
|
||||||
|
visible_message("<span class='warning'>\The [src] burns out.</span>")
|
||||||
|
extinguish()
|
||||||
|
|
||||||
|
//copied from matches
|
||||||
|
if(isliving(loc))
|
||||||
|
var/mob/living/M = loc
|
||||||
|
M.IgniteMob()
|
||||||
|
var/turf/location = get_turf(src)
|
||||||
|
if(location)
|
||||||
|
location.hotspot_expose(700, 5)
|
||||||
|
|
||||||
|
if(burn_time <= 0)
|
||||||
|
processing_objects -= src
|
||||||
|
new /obj/effect/decal/cleanable/ash(location)
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
|
||||||
|
reagents.remove_reagent("fuel", reagents.maximum_volume/25)
|
||||||
|
update_name()
|
||||||
|
burn_time--
|
||||||
|
|||||||
@@ -46,6 +46,15 @@
|
|||||||
|
|
||||||
#define GEAR_EVA 15
|
#define GEAR_EVA 15
|
||||||
|
|
||||||
|
|
||||||
|
/var/list/economic_species_modifier = list(
|
||||||
|
/datum/species/human = 10,
|
||||||
|
/datum/species/skrell = 12,
|
||||||
|
/datum/species/tajaran = 7,
|
||||||
|
/datum/species/unathi = 7,
|
||||||
|
/datum/species/vox = 1
|
||||||
|
)
|
||||||
|
|
||||||
//---- The following corporations are friendly with NanoTrasen and loosely enable trade and travel:
|
//---- The following corporations are friendly with NanoTrasen and loosely enable trade and travel:
|
||||||
//Corporation NanoTrasen - Generalised / high tech research and phoron exploitation.
|
//Corporation NanoTrasen - Generalised / high tech research and phoron exploitation.
|
||||||
//Corporation Vessel Contracting - Ship and station construction, materials research.
|
//Corporation Vessel Contracting - Ship and station construction, materials research.
|
||||||
|
|||||||
@@ -36,6 +36,20 @@
|
|||||||
return
|
return
|
||||||
else
|
else
|
||||||
name = ("bookcase ([newname])")
|
name = ("bookcase ([newname])")
|
||||||
|
else if(istype(O,/obj/item/weapon/wrench))
|
||||||
|
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
|
||||||
|
user << (anchored ? "<span class='notice'>You unfasten \the [src] from the floor.</span>" : "<span class='notice'>You secure \the [src] to the floor.</span>")
|
||||||
|
anchored = !anchored
|
||||||
|
else if(istype(O,/obj/item/weapon/screwdriver))
|
||||||
|
playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
|
||||||
|
user << "<span class='notice'>You begin dismantling \the [src].</span>"
|
||||||
|
if(do_after(user,25))
|
||||||
|
user << "<span class='notice'>You dismantle \the [src].</span>"
|
||||||
|
new /obj/item/stack/material/wood(get_turf(src), amount = 3)
|
||||||
|
for(var/obj/item/weapon/book/b in contents)
|
||||||
|
b.loc = (get_turf(src))
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
else
|
else
|
||||||
..()
|
..()
|
||||||
|
|
||||||
@@ -81,6 +95,7 @@
|
|||||||
icon_state = "book-5"
|
icon_state = "book-5"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/bookcase/manuals/medical
|
/obj/structure/bookcase/manuals/medical
|
||||||
name = "Medical Manuals bookcase"
|
name = "Medical Manuals bookcase"
|
||||||
|
|
||||||
|
|||||||
@@ -122,6 +122,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
|
|||||||
density = 1
|
density = 1
|
||||||
var/arcanecheckout = 0
|
var/arcanecheckout = 0
|
||||||
var/screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book
|
var/screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book
|
||||||
|
var/sortby = "author"
|
||||||
var/buffer_book
|
var/buffer_book
|
||||||
var/buffer_mob
|
var/buffer_mob
|
||||||
var/upload_category = "Fiction"
|
var/upload_category = "Fiction"
|
||||||
@@ -195,9 +196,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
|
|||||||
else
|
else
|
||||||
dat += {"<A href='?src=\ref[src];orderbyid=1'>(Order book by SS<sup>13</sup>BN)</A><BR><BR>
|
dat += {"<A href='?src=\ref[src];orderbyid=1'>(Order book by SS<sup>13</sup>BN)</A><BR><BR>
|
||||||
<table>
|
<table>
|
||||||
<tr><td>AUTHOR</td><td>TITLE</td><td>CATEGORY</td><td></td></tr>"}
|
<tr><td><A href='?src=\ref[src];sort=author>AUTHOR</A></td><td><A href='?src=\ref[src];sort=title>TITLE</A></td><td><A href='?src=\ref[src];sort=category>CATEGORY</A></td><td></td></tr>"}
|
||||||
|
var/DBQuery/query = dbcon_old.NewQuery("SELECT id, author, title, category FROM library ORDER BY [sortby]")
|
||||||
var/DBQuery/query = dbcon_old.NewQuery("SELECT id, author, title, category FROM library")
|
|
||||||
query.Execute()
|
query.Execute()
|
||||||
|
|
||||||
while(query.NextRow())
|
while(query.NextRow())
|
||||||
@@ -236,7 +236,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
|
|||||||
//dat += "<A HREF='?src=\ref[user];mach_close=library'>Close</A><br><br>"
|
//dat += "<A HREF='?src=\ref[user];mach_close=library'>Close</A><br><br>"
|
||||||
user << browse(dat, "window=library")
|
user << browse(dat, "window=library")
|
||||||
onclose(user, "library")
|
onclose(user, "library")
|
||||||
|
|
||||||
/obj/machinery/librarycomp/emag_act(var/remaining_charges, var/mob/user)
|
/obj/machinery/librarycomp/emag_act(var/remaining_charges, var/mob/user)
|
||||||
if (src.density && !src.emagged)
|
if (src.density && !src.emagged)
|
||||||
src.emagged = 1
|
src.emagged = 1
|
||||||
@@ -389,6 +389,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
|
|||||||
if(isnum(orderid))
|
if(isnum(orderid))
|
||||||
var/nhref = "src=\ref[src];targetid=[orderid]"
|
var/nhref = "src=\ref[src];targetid=[orderid]"
|
||||||
spawn() src.Topic(nhref, params2list(nhref), src)
|
spawn() src.Topic(nhref, params2list(nhref), src)
|
||||||
|
if(href_list["sort"] in list("author", "title", "category"))
|
||||||
|
sortby = href_list["sort"]
|
||||||
src.add_fingerprint(usr)
|
src.add_fingerprint(usr)
|
||||||
src.updateUsrDialog()
|
src.updateUsrDialog()
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -21,6 +21,9 @@
|
|||||||
|
|
||||||
if(.) update_light()
|
if(.) update_light()
|
||||||
|
|
||||||
|
/atom/proc/copy_light(atom/A)
|
||||||
|
set_light(A.light_range, A.light_power, A.light_color)
|
||||||
|
|
||||||
/atom/proc/update_light()
|
/atom/proc/update_light()
|
||||||
if(!light_power || !light_range)
|
if(!light_power || !light_range)
|
||||||
if(light)
|
if(light)
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
recipes += new/datum/stack_recipe_list("office chairs",list( \
|
recipes += new/datum/stack_recipe_list("office chairs",list( \
|
||||||
new/datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1), \
|
new/datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1), \
|
||||||
new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1) \
|
new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1) \
|
||||||
), 5)
|
))
|
||||||
recipes += new/datum/stack_recipe_list("comfy chairs", list( \
|
recipes += new/datum/stack_recipe_list("comfy chairs", list( \
|
||||||
new/datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1), \
|
new/datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1), \
|
||||||
new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1), \
|
new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1), \
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1), \
|
new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1), \
|
||||||
new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1), \
|
new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1), \
|
||||||
new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1), \
|
new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1), \
|
||||||
), 2)
|
))
|
||||||
|
|
||||||
recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1)
|
recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1)
|
||||||
recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1)
|
recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1)
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1), \
|
new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||||
new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
|
new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||||
new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1), \
|
new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||||
), 4)
|
))
|
||||||
|
|
||||||
recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade)
|
recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade)
|
||||||
recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2)
|
recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2)
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
|
|
||||||
/material/sandstone/generate_recipes()
|
/material/sandstone/generate_recipes()
|
||||||
..()
|
..()
|
||||||
recipes += new/datum/stack_recipe("pile of dirt", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1)
|
recipes += new/datum/stack_recipe("planting bed", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1)
|
||||||
|
|
||||||
/material/plastic/generate_recipes()
|
/material/plastic/generate_recipes()
|
||||||
..()
|
..()
|
||||||
@@ -103,9 +103,10 @@
|
|||||||
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
|
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
|
||||||
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)
|
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)
|
||||||
recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0)
|
recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0)
|
||||||
recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1)
|
recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1)
|
||||||
recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4)
|
recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4)
|
||||||
recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1)
|
recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1)
|
||||||
|
recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1)
|
||||||
|
|
||||||
/material/cardboard/generate_recipes()
|
/material/cardboard/generate_recipes()
|
||||||
..()
|
..()
|
||||||
@@ -124,4 +125,4 @@
|
|||||||
new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red), \
|
new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red), \
|
||||||
new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white), \
|
new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white), \
|
||||||
new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow), \
|
new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow), \
|
||||||
), 3)
|
))
|
||||||
|
|||||||
@@ -359,7 +359,7 @@ var/list/name_to_material
|
|||||||
weight = 15
|
weight = 15
|
||||||
door_icon_base = "stone"
|
door_icon_base = "stone"
|
||||||
destruction_desc = "shatters"
|
destruction_desc = "shatters"
|
||||||
window_options = list("One Direction", "Full Window")
|
window_options = list("One Direction" = 1, "Full Window" = 4)
|
||||||
created_window = /obj/structure/window/basic
|
created_window = /obj/structure/window/basic
|
||||||
wire_product = /obj/item/stack/light_w
|
wire_product = /obj/item/stack/light_w
|
||||||
rod_product = /obj/item/stack/material/glass/reinforced
|
rod_product = /obj/item/stack/material/glass/reinforced
|
||||||
@@ -417,9 +417,8 @@ var/list/name_to_material
|
|||||||
return 1
|
return 1
|
||||||
|
|
||||||
var/build_path = /obj/structure/windoor_assembly
|
var/build_path = /obj/structure/windoor_assembly
|
||||||
var/sheets_needed = 4
|
var/sheets_needed = window_options[choice]
|
||||||
if(choice == "Windoor")
|
if(choice == "Windoor")
|
||||||
sheets_needed = 5
|
|
||||||
build_dir = user.dir
|
build_dir = user.dir
|
||||||
else
|
else
|
||||||
build_path = created_window
|
build_path = created_window
|
||||||
@@ -450,7 +449,7 @@ var/list/name_to_material
|
|||||||
weight = 30
|
weight = 30
|
||||||
stack_origin_tech = "materials=2"
|
stack_origin_tech = "materials=2"
|
||||||
composite_material = list(DEFAULT_WALL_MATERIAL = 1875,"glass" = 3750)
|
composite_material = list(DEFAULT_WALL_MATERIAL = 1875,"glass" = 3750)
|
||||||
window_options = list("One Direction", "Full Window", "Windoor")
|
window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 5)
|
||||||
created_window = /obj/structure/window/reinforced
|
created_window = /obj/structure/window/reinforced
|
||||||
wire_product = null
|
wire_product = null
|
||||||
rod_product = null
|
rod_product = null
|
||||||
|
|||||||
@@ -318,16 +318,56 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
|||||||
if(following && following == target)
|
if(following && following == target)
|
||||||
return
|
return
|
||||||
following = target
|
following = target
|
||||||
src << "\blue Now following [target]"
|
src << "<span class='notice'>Now following [target]</span>"
|
||||||
spawn(0)
|
if(ismob(target))
|
||||||
while(target && following == target && client)
|
loc = get_turf(target)
|
||||||
var/turf/T = get_turf(target)
|
var/mob/M = target
|
||||||
if(!T)
|
M.following_mobs += src
|
||||||
break
|
else
|
||||||
// To stop the ghost flickering.
|
spawn(0)
|
||||||
if(loc != T)
|
while(target && following == target && client)
|
||||||
loc = T
|
var/turf/T = get_turf(target)
|
||||||
sleep(15)
|
if(!T)
|
||||||
|
break
|
||||||
|
// To stop the ghost flickering.
|
||||||
|
if(loc != T)
|
||||||
|
loc = T
|
||||||
|
sleep(15)
|
||||||
|
|
||||||
|
/mob/proc/update_following()
|
||||||
|
. = get_turf(src)
|
||||||
|
for(var/mob/dead/observer/M in following_mobs)
|
||||||
|
if(M.following != src)
|
||||||
|
following_mobs -= M
|
||||||
|
else
|
||||||
|
if(M.loc != .)
|
||||||
|
M.loc = .
|
||||||
|
|
||||||
|
/mob
|
||||||
|
var/list/following_mobs = list()
|
||||||
|
|
||||||
|
/mob/Destroy()
|
||||||
|
for(var/mob/dead/observer/M in following_mobs)
|
||||||
|
M.following = null
|
||||||
|
following_mobs = null
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/mob/dead/observer/Destroy()
|
||||||
|
if(ismob(following))
|
||||||
|
var/mob/M = following
|
||||||
|
M.following_mobs -= src
|
||||||
|
following = null
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/mob/Move()
|
||||||
|
. = ..()
|
||||||
|
if(.)
|
||||||
|
update_following()
|
||||||
|
|
||||||
|
/mob/Life()
|
||||||
|
// to catch teleports etc which directly set loc
|
||||||
|
update_following()
|
||||||
|
return ..()
|
||||||
|
|
||||||
/mob/proc/check_holy(var/turf/T)
|
/mob/proc/check_holy(var/turf/T)
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
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'
|
icon = 'icons/obj/objects.dmi'
|
||||||
slot_flags = SLOT_HEAD
|
slot_flags = SLOT_HEAD
|
||||||
sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi')
|
sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi')
|
||||||
|
origin_tech = null
|
||||||
item_icons = list(
|
item_icons = list(
|
||||||
slot_l_hand_str = 'icons/mob/items/lefthand_holder.dmi',
|
slot_l_hand_str = 'icons/mob/items/lefthand_holder.dmi',
|
||||||
slot_r_hand_str = 'icons/mob/items/righthand_holder.dmi',
|
slot_r_hand_str = 'icons/mob/items/righthand_holder.dmi',
|
||||||
)
|
)
|
||||||
|
pixel_y = 8
|
||||||
|
|
||||||
/obj/item/weapon/holder/New()
|
/obj/item/weapon/holder/New()
|
||||||
..()
|
..()
|
||||||
@@ -31,6 +33,38 @@
|
|||||||
|
|
||||||
qdel(src)
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/item/weapon/holder/proc/sync(var/mob/living/M)
|
||||||
|
dir = 2
|
||||||
|
overlays.Cut()
|
||||||
|
icon = M.icon
|
||||||
|
icon_state = M.icon_state
|
||||||
|
color = M.color
|
||||||
|
name = M.name
|
||||||
|
desc = M.desc
|
||||||
|
overlays |= M.overlays
|
||||||
|
var/mob/living/carbon/human/H = loc
|
||||||
|
if(istype(H))
|
||||||
|
if(H.l_hand == src)
|
||||||
|
H.update_inv_l_hand()
|
||||||
|
else if(H.r_hand == src)
|
||||||
|
H.update_inv_r_hand()
|
||||||
|
else
|
||||||
|
H.regenerate_icons()
|
||||||
|
|
||||||
|
//Mob specific holders.
|
||||||
|
/obj/item/weapon/holder/diona
|
||||||
|
origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 5)
|
||||||
|
slot_flags = SLOT_HEAD | SLOT_OCLOTHING
|
||||||
|
|
||||||
|
/obj/item/weapon/holder/drone
|
||||||
|
origin_tech = list(TECH_MAGNET = 3, TECH_ENGINERING = 5)
|
||||||
|
|
||||||
|
/obj/item/weapon/holder/mouse
|
||||||
|
w_class = 1
|
||||||
|
|
||||||
|
/obj/item/weapon/holder/borer
|
||||||
|
origin_tech = list(TECH_BIO = 6)
|
||||||
|
|
||||||
/obj/item/weapon/holder/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
/obj/item/weapon/holder/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||||
for(var/mob/M in src.contents)
|
for(var/mob/M in src.contents)
|
||||||
M.attackby(W,user)
|
M.attackby(W,user)
|
||||||
@@ -50,72 +84,5 @@
|
|||||||
grabber << "You scoop up [src]."
|
grabber << "You scoop up [src]."
|
||||||
src << "[grabber] scoops you up."
|
src << "[grabber] scoops you up."
|
||||||
grabber.status_flags |= PASSEMOTES
|
grabber.status_flags |= PASSEMOTES
|
||||||
|
H.sync(src)
|
||||||
return H
|
return H
|
||||||
|
|
||||||
//Mob specific holders.
|
|
||||||
|
|
||||||
/obj/item/weapon/holder/diona
|
|
||||||
name = "diona nymph"
|
|
||||||
desc = "It's a tiny plant critter."
|
|
||||||
icon_state = "nymph"
|
|
||||||
origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 5)
|
|
||||||
slot_flags = SLOT_HEAD | SLOT_OCLOTHING
|
|
||||||
|
|
||||||
/obj/item/weapon/holder/drone
|
|
||||||
name = "maintenance drone"
|
|
||||||
desc = "It's a small maintenance robot."
|
|
||||||
icon_state = "drone"
|
|
||||||
origin_tech = list(TECH_MAGNET = 3, TECH_ENGINERING = 5)
|
|
||||||
|
|
||||||
/obj/item/weapon/holder/cat
|
|
||||||
name = "cat"
|
|
||||||
desc = "It's a cat. Meow."
|
|
||||||
icon_state = "cat"
|
|
||||||
origin_tech = null
|
|
||||||
|
|
||||||
/obj/item/weapon/holder/mouse
|
|
||||||
name = "mouse"
|
|
||||||
desc = "It's a small rodent."
|
|
||||||
icon_state = "mouse_gray"
|
|
||||||
origin_tech = null
|
|
||||||
w_class = 1
|
|
||||||
|
|
||||||
/obj/item/weapon/holder/mouse/gray
|
|
||||||
icon_state = "mouse_gray"
|
|
||||||
|
|
||||||
/obj/item/weapon/holder/mouse/white
|
|
||||||
icon_state = "mouse_white"
|
|
||||||
|
|
||||||
/obj/item/weapon/holder/mouse/brown
|
|
||||||
icon_state = "mouse_brown"
|
|
||||||
|
|
||||||
/obj/item/weapon/holder/borer
|
|
||||||
name = "cortical borer"
|
|
||||||
desc = "It's a slimy brain slug. Gross."
|
|
||||||
icon_state = "borer"
|
|
||||||
origin_tech = list(TECH_BIO = 6)
|
|
||||||
|
|
||||||
/obj/item/weapon/holder/monkey
|
|
||||||
name = "monkey"
|
|
||||||
desc = "It's a monkey. Ook."
|
|
||||||
icon_state = "monkey"
|
|
||||||
|
|
||||||
/obj/item/weapon/holder/monkey/farwa
|
|
||||||
name = "farwa"
|
|
||||||
desc = "It's a farwa."
|
|
||||||
icon_state = "farwa"
|
|
||||||
|
|
||||||
/obj/item/weapon/holder/monkey/stok
|
|
||||||
name = "stok"
|
|
||||||
desc = "It's a stok. stok."
|
|
||||||
icon_state = "stok"
|
|
||||||
|
|
||||||
/obj/item/weapon/holder/monkey/neaera
|
|
||||||
name = "neaera"
|
|
||||||
desc = "It's a neaera."
|
|
||||||
icon_state = "neara"
|
|
||||||
|
|
||||||
/obj/item/weapon/holder/pai
|
|
||||||
name = "pAI"
|
|
||||||
desc = "It's a little robot."
|
|
||||||
icon_state = "pai"
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
universal_understand = 1
|
universal_understand = 1
|
||||||
universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea.
|
universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea.
|
||||||
holder_type = /obj/item/weapon/holder/diona
|
holder_type = /obj/item/weapon/holder/diona
|
||||||
|
var/obj/item/hat
|
||||||
|
|
||||||
/mob/living/carbon/alien/diona/New()
|
/mob/living/carbon/alien/diona/New()
|
||||||
|
|
||||||
@@ -32,3 +33,10 @@
|
|||||||
/mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands.
|
/mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands.
|
||||||
W.loc = get_turf(src)
|
W.loc = get_turf(src)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
/mob/living/carbon/alien/diona/proc/wear_hat(var/obj/item/new_hat)
|
||||||
|
if(hat)
|
||||||
|
return
|
||||||
|
hat = new_hat
|
||||||
|
new_hat.loc = src
|
||||||
|
update_icons()
|
||||||
@@ -6,5 +6,22 @@
|
|||||||
return
|
return
|
||||||
get_scooped(H)
|
get_scooped(H)
|
||||||
return
|
return
|
||||||
|
else if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand))
|
||||||
|
hat.loc = get_turf(src)
|
||||||
|
H.put_in_hands(hat)
|
||||||
|
H.visible_message("<span class='danger'>\The [H] removes \the [src]'s [hat].</span>")
|
||||||
|
hat = null
|
||||||
|
update_icons()
|
||||||
else
|
else
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
|
/mob/living/carbon/alien/diona/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||||
|
if(user.a_intent == "help" && istype(W, /obj/item/clothing/head))
|
||||||
|
if(hat)
|
||||||
|
user << "<span class='warning'>\The [src] is already wearing \the [hat].</span>"
|
||||||
|
return
|
||||||
|
user.unEquip(W)
|
||||||
|
wear_hat(W)
|
||||||
|
user.visible_message("<span class='notice'>\The [user] puts \the [W] on \the [src].</span>")
|
||||||
|
return
|
||||||
|
return ..()
|
||||||
@@ -6,3 +6,7 @@
|
|||||||
icon_state = "[initial(icon_state)]_sleep"
|
icon_state = "[initial(icon_state)]_sleep"
|
||||||
else
|
else
|
||||||
icon_state = "[initial(icon_state)]"
|
icon_state = "[initial(icon_state)]"
|
||||||
|
|
||||||
|
overlays.Cut()
|
||||||
|
if(hat)
|
||||||
|
overlays |= get_hat_icon(hat, 0, -8)
|
||||||
@@ -17,6 +17,9 @@
|
|||||||
germ_level++
|
germ_level++
|
||||||
|
|
||||||
/mob/living/carbon/Destroy()
|
/mob/living/carbon/Destroy()
|
||||||
|
qdel(ingested)
|
||||||
|
qdel(touching)
|
||||||
|
// We don't qdel(bloodstr) because it's the same as qdel(reagents)
|
||||||
for(var/guts in internal_organs)
|
for(var/guts in internal_organs)
|
||||||
qdel(guts)
|
qdel(guts)
|
||||||
for(var/food in stomach_contents)
|
for(var/food in stomach_contents)
|
||||||
|
|||||||
@@ -24,46 +24,18 @@
|
|||||||
if(wear_mask)
|
if(wear_mask)
|
||||||
skipface |= wear_mask.flags_inv & HIDEFACE
|
skipface |= wear_mask.flags_inv & HIDEFACE
|
||||||
|
|
||||||
// crappy hacks because you can't do \his[src] etc. I'm sorry this proc is so unreadable, blame the text macros :<
|
|
||||||
var/t_He = "They" //capitalised for use at the start of each line.
|
|
||||||
var/t_he = "they"
|
|
||||||
var/t_his = "their"
|
|
||||||
var/t_him = "them"
|
|
||||||
var/t_has = "have"
|
|
||||||
var/t_is = "are"
|
|
||||||
var/t_does = "do"
|
|
||||||
|
|
||||||
var/msg = "<span class='info'>*---------*\nThis is "
|
var/msg = "<span class='info'>*---------*\nThis is "
|
||||||
|
|
||||||
//big suits/masks/helmets make it hard to tell their gender
|
var/datum/gender/T = gender_datums[gender]
|
||||||
if(!skipjumpsuit || !skipface)
|
if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender
|
||||||
|
T = gender_datums[PLURAL]
|
||||||
|
else
|
||||||
if(icon)
|
if(icon)
|
||||||
msg += "\icon[icon] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated
|
msg += "\icon[icon] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated
|
||||||
switch(gender)
|
|
||||||
if(MALE)
|
if(!T)
|
||||||
t_He = "He"
|
// Just in case someone VVs the gender to something strange. It'll runtime anyway when it hits usages, better to CRASH() now with a helpful message.
|
||||||
t_he = "he"
|
CRASH("Gender datum was null; key was '[(skipjumpsuit && skipface) ? PLURAL : gender]'")
|
||||||
t_his = "his"
|
|
||||||
t_him = "him"
|
|
||||||
t_has = "has"
|
|
||||||
t_is = "is"
|
|
||||||
t_does = "does"
|
|
||||||
if(FEMALE)
|
|
||||||
t_He = "She"
|
|
||||||
t_he = "she"
|
|
||||||
t_his = "her"
|
|
||||||
t_him = "her"
|
|
||||||
t_has = "has"
|
|
||||||
t_is = "is"
|
|
||||||
t_does = "does"
|
|
||||||
if(NEUTER)
|
|
||||||
t_He = "It"
|
|
||||||
t_he = "it"
|
|
||||||
t_his = "its"
|
|
||||||
t_him = "it"
|
|
||||||
t_has = "has"
|
|
||||||
t_is = "is"
|
|
||||||
t_does = "does"
|
|
||||||
|
|
||||||
msg += "<EM>[src.name]</EM>"
|
msg += "<EM>[src.name]</EM>"
|
||||||
if(species.name != "Human")
|
if(species.name != "Human")
|
||||||
@@ -80,111 +52,111 @@
|
|||||||
tie_msg += ". Attached to it is [lowertext(english_list(U.accessories))]"
|
tie_msg += ". Attached to it is [lowertext(english_list(U.accessories))]"
|
||||||
|
|
||||||
if(w_uniform.blood_DNA)
|
if(w_uniform.blood_DNA)
|
||||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != "#030303") ? "blood" : "oil"]-stained [w_uniform.name][tie_msg]!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != "#030303") ? "blood" : "oil"]-stained [w_uniform.name][tie_msg]!</span>\n"
|
||||||
else
|
else
|
||||||
msg += "[t_He] [t_is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].\n"
|
msg += "[T.He] [T.is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].\n"
|
||||||
|
|
||||||
//head
|
//head
|
||||||
if(head)
|
if(head)
|
||||||
if(head.blood_DNA)
|
if(head.blood_DNA)
|
||||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] [(head.blood_color != "#030303") ? "blood" : "oil"]-stained [head.name] on [t_his] head!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] [(head.blood_color != "#030303") ? "blood" : "oil"]-stained [head.name] on [T.his] head!</span>\n"
|
||||||
else
|
else
|
||||||
msg += "[t_He] [t_is] wearing \icon[head] \a [head] on [t_his] head.\n"
|
msg += "[T.He] [T.is] wearing \icon[head] \a [head] on [T.his] head.\n"
|
||||||
|
|
||||||
//suit/armour
|
//suit/armour
|
||||||
if(wear_suit)
|
if(wear_suit)
|
||||||
if(wear_suit.blood_DNA)
|
if(wear_suit.blood_DNA)
|
||||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_suit.name]!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_suit.name]!</span>\n"
|
||||||
else
|
else
|
||||||
msg += "[t_He] [t_is] wearing \icon[wear_suit] \a [wear_suit].\n"
|
msg += "[T.He] [T.is] wearing \icon[wear_suit] \a [wear_suit].\n"
|
||||||
|
|
||||||
//suit/armour storage
|
//suit/armour storage
|
||||||
if(s_store && !skipsuitstorage)
|
if(s_store && !skipsuitstorage)
|
||||||
if(s_store.blood_DNA)
|
if(s_store.blood_DNA)
|
||||||
msg += "<span class='warning'>[t_He] [t_is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != "#030303") ? "blood" : "oil"]-stained [s_store.name] on [t_his] [wear_suit.name]!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != "#030303") ? "blood" : "oil"]-stained [s_store.name] on [T.his] [wear_suit.name]!</span>\n"
|
||||||
else
|
else
|
||||||
msg += "[t_He] [t_is] carrying \icon[s_store] \a [s_store] on [t_his] [wear_suit.name].\n"
|
msg += "[T.He] [T.is] carrying \icon[s_store] \a [s_store] on [T.his] [wear_suit.name].\n"
|
||||||
|
|
||||||
//back
|
//back
|
||||||
if(back)
|
if(back)
|
||||||
if(back.blood_DNA)
|
if(back.blood_DNA)
|
||||||
msg += "<span class='warning'>[t_He] [t_has] \icon[back] [back.gender==PLURAL?"some":"a"] [(back.blood_color != "#030303") ? "blood" : "oil"]-stained [back] on [t_his] back.</span>\n"
|
msg += "<span class='warning'>[T.He] [T.has] \icon[back] [back.gender==PLURAL?"some":"a"] [(back.blood_color != "#030303") ? "blood" : "oil"]-stained [back] on [T.his] back.</span>\n"
|
||||||
else
|
else
|
||||||
msg += "[t_He] [t_has] \icon[back] \a [back] on [t_his] back.\n"
|
msg += "[T.He] [T.has] \icon[back] \a [back] on [T.his] back.\n"
|
||||||
|
|
||||||
//left hand
|
//left hand
|
||||||
if(l_hand)
|
if(l_hand)
|
||||||
if(l_hand.blood_DNA)
|
if(l_hand.blood_DNA)
|
||||||
msg += "<span class='warning'>[t_He] [t_is] holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [l_hand.name] in [t_his] left hand!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is] holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [l_hand.name] in [T.his] left hand!</span>\n"
|
||||||
else
|
else
|
||||||
msg += "[t_He] [t_is] holding \icon[l_hand] \a [l_hand] in [t_his] left hand.\n"
|
msg += "[T.He] [T.is] holding \icon[l_hand] \a [l_hand] in [T.his] left hand.\n"
|
||||||
|
|
||||||
//right hand
|
//right hand
|
||||||
if(r_hand)
|
if(r_hand)
|
||||||
if(r_hand.blood_DNA)
|
if(r_hand.blood_DNA)
|
||||||
msg += "<span class='warning'>[t_He] [t_is] holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [r_hand.name] in [t_his] right hand!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is] holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [r_hand.name] in [T.his] right hand!</span>\n"
|
||||||
else
|
else
|
||||||
msg += "[t_He] [t_is] holding \icon[r_hand] \a [r_hand] in [t_his] right hand.\n"
|
msg += "[T.He] [T.is] holding \icon[r_hand] \a [r_hand] in [T.his] right hand.\n"
|
||||||
|
|
||||||
//gloves
|
//gloves
|
||||||
if(gloves && !skipgloves)
|
if(gloves && !skipgloves)
|
||||||
if(gloves.blood_DNA)
|
if(gloves.blood_DNA)
|
||||||
msg += "<span class='warning'>[t_He] [t_has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained [gloves.name] on [t_his] hands!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands!</span>\n"
|
||||||
else
|
else
|
||||||
msg += "[t_He] [t_has] \icon[gloves] \a [gloves] on [t_his] hands.\n"
|
msg += "[T.He] [T.has] \icon[gloves] \a [gloves] on [T.his] hands.\n"
|
||||||
else if(blood_DNA)
|
else if(blood_DNA)
|
||||||
msg += "<span class='warning'>[t_He] [t_has] [(hand_blood_color != "#030303") ? "blood" : "oil"]-stained hands!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.has] [(hand_blood_color != "#030303") ? "blood" : "oil"]-stained hands!</span>\n"
|
||||||
|
|
||||||
//handcuffed?
|
//handcuffed?
|
||||||
|
|
||||||
//handcuffed?
|
//handcuffed?
|
||||||
if(handcuffed)
|
if(handcuffed)
|
||||||
if(istype(handcuffed, /obj/item/weapon/handcuffs/cable))
|
if(istype(handcuffed, /obj/item/weapon/handcuffs/cable))
|
||||||
msg += "<span class='warning'>[t_He] [t_is] \icon[handcuffed] restrained with cable!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is] \icon[handcuffed] restrained with cable!</span>\n"
|
||||||
else
|
else
|
||||||
msg += "<span class='warning'>[t_He] [t_is] \icon[handcuffed] handcuffed!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is] \icon[handcuffed] handcuffed!</span>\n"
|
||||||
|
|
||||||
//buckled
|
//buckled
|
||||||
if(buckled)
|
if(buckled)
|
||||||
msg += "<span class='warning'>[t_He] [t_is] \icon[buckled] buckled to [buckled]!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is] \icon[buckled] buckled to [buckled]!</span>\n"
|
||||||
|
|
||||||
//belt
|
//belt
|
||||||
if(belt)
|
if(belt)
|
||||||
if(belt.blood_DNA)
|
if(belt.blood_DNA)
|
||||||
msg += "<span class='warning'>[t_He] [t_has] \icon[belt] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != "#030303") ? "blood" : "oil"]-stained [belt.name] about [t_his] waist!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.has] \icon[belt] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != "#030303") ? "blood" : "oil"]-stained [belt.name] about [T.his] waist!</span>\n"
|
||||||
else
|
else
|
||||||
msg += "[t_He] [t_has] \icon[belt] \a [belt] about [t_his] waist.\n"
|
msg += "[T.He] [T.has] \icon[belt] \a [belt] about [T.his] waist.\n"
|
||||||
|
|
||||||
//shoes
|
//shoes
|
||||||
if(shoes && !skipshoes)
|
if(shoes && !skipshoes)
|
||||||
if(shoes.blood_DNA)
|
if(shoes.blood_DNA)
|
||||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != "#030303") ? "blood" : "oil"]-stained [shoes.name] on [t_his] feet!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != "#030303") ? "blood" : "oil"]-stained [shoes.name] on [T.his] feet!</span>\n"
|
||||||
else
|
else
|
||||||
msg += "[t_He] [t_is] wearing \icon[shoes] \a [shoes] on [t_his] feet.\n"
|
msg += "[T.He] [T.is] wearing \icon[shoes] \a [shoes] on [T.his] feet.\n"
|
||||||
else if(feet_blood_DNA)
|
else if(feet_blood_DNA)
|
||||||
msg += "<span class='warning'>[t_He] [t_has] [(feet_blood_color != "#030303") ? "blood" : "oil"]-stained feet!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.has] [(feet_blood_color != "#030303") ? "blood" : "oil"]-stained feet!</span>\n"
|
||||||
|
|
||||||
//mask
|
//mask
|
||||||
if(wear_mask && !skipmask)
|
if(wear_mask && !skipmask)
|
||||||
if(wear_mask.blood_DNA)
|
if(wear_mask.blood_DNA)
|
||||||
msg += "<span class='warning'>[t_He] [t_has] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_mask.name] on [t_his] face!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.has] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_mask.name] on [T.his] face!</span>\n"
|
||||||
else
|
else
|
||||||
msg += "[t_He] [t_has] \icon[wear_mask] \a [wear_mask] on [t_his] face.\n"
|
msg += "[T.He] [T.has] \icon[wear_mask] \a [wear_mask] on [T.his] face.\n"
|
||||||
|
|
||||||
//eyes
|
//eyes
|
||||||
if(glasses && !skipeyes)
|
if(glasses && !skipeyes)
|
||||||
if(glasses.blood_DNA)
|
if(glasses.blood_DNA)
|
||||||
msg += "<span class='warning'>[t_He] [t_has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != "#030303") ? "blood" : "oil"]-stained [glasses] covering [t_his] eyes!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != "#030303") ? "blood" : "oil"]-stained [glasses] covering [T.his] eyes!</span>\n"
|
||||||
else
|
else
|
||||||
msg += "[t_He] [t_has] \icon[glasses] \a [glasses] covering [t_his] eyes.\n"
|
msg += "[T.He] [T.has] \icon[glasses] \a [glasses] covering [T.his] eyes.\n"
|
||||||
|
|
||||||
//left ear
|
//left ear
|
||||||
if(l_ear && !skipears)
|
if(l_ear && !skipears)
|
||||||
msg += "[t_He] [t_has] \icon[l_ear] \a [l_ear] on [t_his] left ear.\n"
|
msg += "[T.He] [T.has] \icon[l_ear] \a [l_ear] on [T.his] left ear.\n"
|
||||||
|
|
||||||
//right ear
|
//right ear
|
||||||
if(r_ear && !skipears)
|
if(r_ear && !skipears)
|
||||||
msg += "[t_He] [t_has] \icon[r_ear] \a [r_ear] on [t_his] right ear.\n"
|
msg += "[T.He] [T.has] \icon[r_ear] \a [r_ear] on [T.his] right ear.\n"
|
||||||
|
|
||||||
//ID
|
//ID
|
||||||
if(wear_id)
|
if(wear_id)
|
||||||
@@ -196,70 +168,71 @@
|
|||||||
var/obj/item/weapon/card/id/idcard = wear_id
|
var/obj/item/weapon/card/id/idcard = wear_id
|
||||||
id = idcard.registered_name
|
id = idcard.registered_name
|
||||||
if(id && (id != real_name) && (get_dist(src, usr) <= 1) && prob(10))
|
if(id && (id != real_name) && (get_dist(src, usr) <= 1) && prob(10))
|
||||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[wear_id] \a [wear_id] yet something doesn't seem right...</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[wear_id] \a [wear_id] yet something doesn't seem right...</span>\n"
|
||||||
else*/
|
else*/
|
||||||
msg += "[t_He] [t_is] wearing \icon[wear_id] \a [wear_id].\n"
|
msg += "[T.He] [T.is] wearing \icon[wear_id] \a [wear_id].\n"
|
||||||
|
|
||||||
//Jitters
|
//Jitters
|
||||||
if(is_jittery)
|
if(is_jittery)
|
||||||
if(jitteriness >= 300)
|
if(jitteriness >= 300)
|
||||||
msg += "<span class='warning'><B>[t_He] [t_is] convulsing violently!</B></span>\n"
|
msg += "<span class='warning'><B>[T.He] [T.is] convulsing violently!</B></span>\n"
|
||||||
else if(jitteriness >= 200)
|
else if(jitteriness >= 200)
|
||||||
msg += "<span class='warning'>[t_He] [t_is] extremely jittery.</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is] extremely jittery.</span>\n"
|
||||||
else if(jitteriness >= 100)
|
else if(jitteriness >= 100)
|
||||||
msg += "<span class='warning'>[t_He] [t_is] twitching ever so slightly.</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is] twitching ever so slightly.</span>\n"
|
||||||
|
|
||||||
//splints
|
//splints
|
||||||
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
|
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
|
||||||
var/obj/item/organ/external/o = get_organ(organ)
|
var/obj/item/organ/external/o = get_organ(organ)
|
||||||
if(o && o.status & ORGAN_SPLINTED)
|
if(o && o.status & ORGAN_SPLINTED)
|
||||||
msg += "<span class='warning'>[t_He] [t_has] a splint on [t_his] [o.name]!</span>\n"
|
msg += "<span class='warning'>[T.He] [T.has] a splint on [T.his] [o.name]!</span>\n"
|
||||||
|
|
||||||
if(suiciding)
|
if(suiciding)
|
||||||
msg += "<span class='warning'>[t_He] appears to have commited suicide... there is no hope of recovery.</span>\n"
|
msg += "<span class='warning'>[T.He] appears to have commited suicide... there is no hope of recovery.</span>\n"
|
||||||
|
|
||||||
if(mSmallsize in mutations)
|
if(mSmallsize in mutations)
|
||||||
msg += "[t_He] [t_is] small halfling!\n"
|
msg += "[T.He] [T.is] small halfling!\n"
|
||||||
|
|
||||||
var/distance = get_dist(usr,src)
|
var/distance = get_dist(usr,src)
|
||||||
if(istype(usr, /mob/dead/observer) || usr.stat == 2) // ghosts can see anything
|
if(istype(usr, /mob/dead/observer) || usr.stat == 2) // ghosts can see anything
|
||||||
distance = 1
|
distance = 1
|
||||||
if (src.stat)
|
if (src.stat)
|
||||||
msg += "<span class='warning'>[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is]n't responding to anything around [T.him] and seems to be asleep.</span>\n"
|
||||||
if((stat == 2 || src.losebreath) && distance <= 3)
|
if((stat == 2 || src.losebreath) && distance <= 3)
|
||||||
msg += "<span class='warning'>[t_He] [t_does] not appear to be breathing.</span>\n"
|
msg += "<span class='warning'>[T.He] [T.does] not appear to be breathing.</span>\n"
|
||||||
if(istype(usr, /mob/living/carbon/human) && !usr.stat && Adjacent(usr))
|
if(istype(usr, /mob/living/carbon/human) && !usr.stat && Adjacent(usr))
|
||||||
usr.visible_message("<b>[usr]</b> checks [src]'s pulse.", "You check [src]'s pulse.")
|
usr.visible_message("<b>[usr]</b> checks [src]'s pulse.", "You check [src]'s pulse.")
|
||||||
spawn(15)
|
spawn(15)
|
||||||
if(distance <= 1 && usr.stat != 1)
|
if(distance <= 1 && usr.stat != 1)
|
||||||
if(pulse == PULSE_NONE)
|
if(pulse == PULSE_NONE)
|
||||||
usr << "<span class='deadsay'>[t_He] [t_has] no pulse[src.client ? "" : " and [t_his] soul has departed"]...</span>"
|
usr << "<span class='deadsay'>[T.He] [T.has] no pulse[src.client ? "" : " and [T.his] soul has departed"]...</span>"
|
||||||
else
|
else
|
||||||
usr << "<span class='deadsay'>[t_He] [t_has] a pulse!</span>"
|
usr << "<span class='deadsay'>[T.He] [T.has] a pulse!</span>"
|
||||||
|
|
||||||
if(fire_stacks)
|
if(fire_stacks)
|
||||||
msg += "[t_He] [t_is] covered in some liquid.\n"
|
msg += "[T.He] [T.is] covered in some liquid.\n"
|
||||||
if(on_fire)
|
if(on_fire)
|
||||||
msg += "<span class='warning'>[t_He] [t_is] on fire!.</span>\n"
|
msg += "<span class='warning'>[T.He] [T.is] on fire!.</span>\n"
|
||||||
msg += "<span class='warning'>"
|
msg += "<span class='warning'>"
|
||||||
|
|
||||||
if(nutrition < 100)
|
if(nutrition < 100)
|
||||||
msg += "[t_He] [t_is] severely malnourished.\n"
|
msg += "[T.He] [T.is] severely malnourished.\n"
|
||||||
else if(nutrition >= 500)
|
else if(nutrition >= 500)
|
||||||
/*if(usr.nutrition < 100)
|
/*if(usr.nutrition < 100)
|
||||||
msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
|
msg += "[T.He] [T.is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
|
||||||
else*/
|
else*/
|
||||||
msg += "[t_He] [t_is] quite chubby.\n"
|
msg += "[T.He] [T.is] quite chubby.\n"
|
||||||
|
|
||||||
msg += "</span>"
|
msg += "</span>"
|
||||||
|
|
||||||
if(getBrainLoss() >= 60)
|
if(getBrainLoss() >= 60)
|
||||||
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
|
msg += "[T.He] [T.has] a stupid expression on [T.his] face.\n"
|
||||||
|
|
||||||
if(species.show_ssd && (!species.has_organ["brain"] || has_brain()) && stat != DEAD)
|
if(species.show_ssd && (!species.has_organ["brain"] || has_brain()) && stat != DEAD)
|
||||||
if(!key)
|
if(!key)
|
||||||
msg += "<span class='deadsay'>[t_He] [t_is] fast asleep. It doesn't look like [t_he] [t_is] waking up anytime soon.</span>\n"
|
msg += "<span class='deadsay'>[T.He] [T.is] [species.show_ssd]. It doesn't look like [T.he] [T.is] waking up anytime soon.</span>\n"
|
||||||
else if(!client)
|
else if(!client)
|
||||||
msg += "<span class='deadsay'>[t_He] [t_is] [species.show_ssd].</span>\n"
|
msg += "<span class='deadsay'>[T.He] [T.is] [species.show_ssd].</span>\n"
|
||||||
|
|
||||||
var/list/wound_flavor_text = list()
|
var/list/wound_flavor_text = list()
|
||||||
var/list/is_destroyed = list()
|
var/list/is_destroyed = list()
|
||||||
@@ -273,9 +246,9 @@
|
|||||||
|
|
||||||
var/obj/item/organ/external/E = organs_by_name[organ_tag]
|
var/obj/item/organ/external/E = organs_by_name[organ_tag]
|
||||||
if(!E)
|
if(!E)
|
||||||
wound_flavor_text["[organ_descriptor]"] = "<span class='warning'><b>[t_He] is missing [t_his] [organ_descriptor].</b></span>\n"
|
wound_flavor_text["[organ_descriptor]"] = "<span class='warning'><b>[T.He] [T.is] missing [T.his] [organ_descriptor].</b></span>\n"
|
||||||
else if(E.is_stump())
|
else if(E.is_stump())
|
||||||
wound_flavor_text["[organ_descriptor]"] = "<span class='warning'><b>[t_He] has a stump where [t_his] [organ_descriptor] should be.</b></span>\n"
|
wound_flavor_text["[organ_descriptor]"] = "<span class='warning'><b>[T.He] [T.has] a stump where [T.his] [organ_descriptor] should be.</b></span>\n"
|
||||||
else
|
else
|
||||||
is_destroyed["organ_descriptor"] = 0
|
is_destroyed["organ_descriptor"] = 0
|
||||||
continue
|
continue
|
||||||
@@ -284,24 +257,24 @@
|
|||||||
if(temp)
|
if(temp)
|
||||||
if(temp.status & ORGAN_DESTROYED)
|
if(temp.status & ORGAN_DESTROYED)
|
||||||
is_destroyed["[temp.name]"] = 1
|
is_destroyed["[temp.name]"] = 1
|
||||||
wound_flavor_text["[temp.name]"] = "<span class='warning'><b>[t_He] [t_is] missing [t_his] [temp.name].</b></span>\n"
|
wound_flavor_text["[temp.name]"] = "<span class='warning'><b>[T.He] [T.is] missing [T.his] [temp.name].</b></span>\n"
|
||||||
continue
|
continue
|
||||||
if(temp.status & ORGAN_ROBOT)
|
if(temp.status & ORGAN_ROBOT)
|
||||||
if(!(temp.brute_dam + temp.burn_dam))
|
if(!(temp.brute_dam + temp.burn_dam))
|
||||||
wound_flavor_text["[temp.name]"] = "<span class='warning'>[t_He] has a robot [temp.name]!</span>\n"
|
wound_flavor_text["[temp.name]"] = "<span class='warning'>[T.He] [T.has] a robot [temp.name]!</span>\n"
|
||||||
continue
|
continue
|
||||||
else
|
else
|
||||||
wound_flavor_text["[temp.name]"] = "<span class='warning'>[t_He] has a robot [temp.name]. It has[temp.get_wounds_desc()]!</span>\n"
|
wound_flavor_text["[temp.name]"] = "<span class='warning'>[T.He] [T.has] a robot [temp.name]. It has[temp.get_wounds_desc()]!</span>\n"
|
||||||
else if(temp.wounds.len > 0 || temp.open)
|
else if(temp.wounds.len > 0 || temp.open)
|
||||||
wound_flavor_text["[temp.name]"] = "<span class='warning'>[t_He] has [temp.get_wounds_desc()] on [t_his] [temp.name].</span><br>"
|
wound_flavor_text["[temp.name]"] = "<span class='warning'>[T.He] [T.has] [temp.get_wounds_desc()] on [T.his] [temp.name].</span><br>"
|
||||||
if(temp.status & ORGAN_BLEEDING)
|
if(temp.status & ORGAN_BLEEDING)
|
||||||
is_bleeding["[temp.name]"] = "<span class='danger'>[capitalize(t_his)] [temp.name] is bleeding!</span><br>"
|
is_bleeding["[temp.name]"] = "<span class='danger'>[T.His] [temp.name] is bleeding!</span><br>"
|
||||||
else
|
else
|
||||||
wound_flavor_text["[temp.name]"] = ""
|
wound_flavor_text["[temp.name]"] = ""
|
||||||
if(temp.dislocated == 2)
|
if(temp.dislocated == 2)
|
||||||
wound_flavor_text["[temp.name]"] += "<span class='warning'>[capitalize(t_his)] [temp.joint] is dislocated!</span><br>"
|
wound_flavor_text["[temp.name]"] += "<span class='warning'>[T.His] [temp.joint] is dislocated!</span><br>"
|
||||||
if(((temp.status & ORGAN_BROKEN) && temp.brute_dam > temp.min_broken_damage) || (temp.status & ORGAN_MUTATED))
|
if(((temp.status & ORGAN_BROKEN) && temp.brute_dam > temp.min_broken_damage) || (temp.status & ORGAN_MUTATED))
|
||||||
wound_flavor_text["[temp.name]"] += "<span class='warning'>[capitalize(t_his)] [temp.name] is dented and swollen!</span><br>"
|
wound_flavor_text["[temp.name]"] += "<span class='warning'>[T.His] [temp.name] is dented and swollen!</span><br>"
|
||||||
|
|
||||||
//Handles the text strings being added to the actual description.
|
//Handles the text strings being added to the actual description.
|
||||||
//If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.
|
//If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.
|
||||||
@@ -318,7 +291,7 @@
|
|||||||
if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas)))))
|
if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas)))))
|
||||||
msg += wound_flavor_text["head"]
|
msg += wound_flavor_text["head"]
|
||||||
else if(is_bleeding["head"])
|
else if(is_bleeding["head"])
|
||||||
msg += "<span class='warning'>[src] [t_has] blood running down [t_his] face!</span>\n"
|
msg += "<span class='warning'>[src] [T.has] blood running down [T.his] face!</span>\n"
|
||||||
|
|
||||||
if(wound_flavor_text["upper body"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you.
|
if(wound_flavor_text["upper body"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you.
|
||||||
msg += wound_flavor_text["upper body"]
|
msg += wound_flavor_text["upper body"]
|
||||||
@@ -369,11 +342,11 @@
|
|||||||
display_shoes = 1
|
display_shoes = 1
|
||||||
|
|
||||||
if(display_chest)
|
if(display_chest)
|
||||||
msg += "<span class='danger'>[src] [t_has] blood soaking through from under [t_his] clothing!</span>\n"
|
msg += "<span class='danger'>[src] [T.has] blood soaking through from under [T.his] clothing!</span>\n"
|
||||||
if(display_shoes)
|
if(display_shoes)
|
||||||
msg += "<span class='danger'>[src] [t_has] blood running from [t_his] shoes!</span>\n"
|
msg += "<span class='danger'>[src] [T.has] blood running from [T.his] shoes!</span>\n"
|
||||||
if(display_gloves)
|
if(display_gloves)
|
||||||
msg += "<span class='danger'>[src] [t_has] blood running from under [t_his] gloves!</span>\n"
|
msg += "<span class='danger'>[src] [T.has] blood running from under [T.his] gloves!</span>\n"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for(var/limb in wound_flavor_text)
|
for(var/limb in wound_flavor_text)
|
||||||
@@ -382,9 +355,9 @@
|
|||||||
for(var/limb in is_bleeding)
|
for(var/limb in is_bleeding)
|
||||||
msg += is_bleeding[limb]
|
msg += is_bleeding[limb]
|
||||||
for(var/implant in get_visible_implants(0))
|
for(var/implant in get_visible_implants(0))
|
||||||
msg += "<span class='danger'>[src] [t_has] \a [implant] sticking out of [t_his] flesh!</span>\n"
|
msg += "<span class='danger'>[src] [T.has] \a [implant] sticking out of [T.his] flesh!</span>\n"
|
||||||
if(digitalcamo)
|
if(digitalcamo)
|
||||||
msg += "[t_He] [t_is] repulsively uncanny!\n"
|
msg += "[T.He] [T.is] repulsively uncanny!\n"
|
||||||
|
|
||||||
if(hasHUD(usr,"security"))
|
if(hasHUD(usr,"security"))
|
||||||
var/perpname = "wot"
|
var/perpname = "wot"
|
||||||
@@ -438,7 +411,7 @@
|
|||||||
if (pose)
|
if (pose)
|
||||||
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
|
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
|
||||||
pose = addtext(pose,".") //Makes sure all emotes end with a period.
|
pose = addtext(pose,".") //Makes sure all emotes end with a period.
|
||||||
msg += "\n[t_He] [t_is] [pose]"
|
msg += "\n[T.He] [T.is] [pose]"
|
||||||
|
|
||||||
user << msg
|
user << msg
|
||||||
|
|
||||||
|
|||||||
@@ -207,8 +207,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/mob/living/carbon/human/show_inv(mob/user as mob)
|
/mob/living/carbon/human/show_inv(mob/user as mob)
|
||||||
// TODO : Change to incapacitated() on merge.
|
if(user.incapacitated())
|
||||||
if(user.stat || user.lying || user.resting || user.buckled)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
var/obj/item/clothing/under/suit = null
|
var/obj/item/clothing/under/suit = null
|
||||||
@@ -1023,23 +1022,29 @@
|
|||||||
|
|
||||||
return(visible_implants)
|
return(visible_implants)
|
||||||
|
|
||||||
|
/mob/living/carbon/human/embedded_needs_process()
|
||||||
|
for(var/obj/item/organ/external/organ in src.organs)
|
||||||
|
for(var/obj/item/O in organ.implants)
|
||||||
|
if(!istype(O, /obj/item/weapon/implant)) //implant type items do not cause embedding effects, see handle_embedded_objects()
|
||||||
|
return 1
|
||||||
|
return 0
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/handle_embedded_objects()
|
/mob/living/carbon/human/proc/handle_embedded_objects()
|
||||||
|
|
||||||
for(var/obj/item/organ/external/organ in src.organs)
|
for(var/obj/item/organ/external/organ in src.organs)
|
||||||
if(organ.status & ORGAN_SPLINTED) //Splints prevent movement.
|
if(organ.status & ORGAN_SPLINTED) //Splints prevent movement.
|
||||||
continue
|
continue
|
||||||
for(var/obj/item/weapon/O in organ.implants)
|
for(var/obj/item/O in organ.implants)
|
||||||
if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad.
|
if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad.
|
||||||
// All kinds of embedded objects cause bleeding.
|
// All kinds of embedded objects cause bleeding.
|
||||||
var/msg = null
|
if(species.flags & NO_PAIN)
|
||||||
switch(rand(1,3))
|
src << "<span class='warning'>You feel [O] moving inside your [organ.name].</span>"
|
||||||
if(1)
|
else
|
||||||
msg ="<span class='warning'>A spike of pain jolts your [organ.name] as you bump [O] inside.</span>"
|
var/msg = pick( \
|
||||||
if(2)
|
"<span class='warning'>A spike of pain jolts your [organ.name] as you bump [O] inside.</span>", \
|
||||||
msg ="<span class='warning'>Your movement jostles [O] in your [organ.name] painfully.</span>"
|
"<span class='warning'>Your movement jostles [O] in your [organ.name] painfully.</span>", \
|
||||||
if(3)
|
"<span class='warning'>Your movement jostles [O] in your [organ.name] painfully.</span>")
|
||||||
msg ="<span class='warning'>[O] in your [organ.name] twists painfully as you move.</span>"
|
src << msg
|
||||||
src << msg
|
|
||||||
|
|
||||||
organ.take_damage(rand(1,3), 0, 0)
|
organ.take_damage(rand(1,3), 0, 0)
|
||||||
if(!(organ.status & ORGAN_ROBOT) && !(species.flags & NO_BLOOD)) //There is no blood in protheses.
|
if(!(organ.status & ORGAN_ROBOT) && !(species.flags & NO_BLOOD)) //There is no blood in protheses.
|
||||||
|
|||||||
@@ -134,28 +134,29 @@
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
if(E.is_broken() || E.is_dislocated())
|
if(E.is_broken() || E.is_dislocated())
|
||||||
if(E.body_part == HAND_LEFT)
|
switch(E.body_part)
|
||||||
if(!l_hand)
|
if(HAND_LEFT, ARM_LEFT)
|
||||||
continue
|
if(!l_hand)
|
||||||
drop_from_inventory(l_hand)
|
continue
|
||||||
else
|
drop_from_inventory(l_hand)
|
||||||
if(!r_hand)
|
if(HAND_RIGHT, ARM_RIGHT)
|
||||||
continue
|
if(!r_hand)
|
||||||
drop_from_inventory(r_hand)
|
continue
|
||||||
|
drop_from_inventory(r_hand)
|
||||||
|
|
||||||
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
|
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
|
||||||
emote("me", 1, "[(species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
|
emote("me", 1, "[(species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
|
||||||
|
|
||||||
else if(E.is_malfunctioning())
|
else if(E.is_malfunctioning())
|
||||||
|
switch(E.body_part)
|
||||||
if(E.body_part == HAND_LEFT)
|
if(HAND_LEFT, ARM_LEFT)
|
||||||
if(!l_hand)
|
if(!l_hand)
|
||||||
continue
|
continue
|
||||||
drop_from_inventory(l_hand)
|
drop_from_inventory(l_hand)
|
||||||
else
|
if(HAND_RIGHT, ARM_RIGHT)
|
||||||
if(!r_hand)
|
if(!r_hand)
|
||||||
continue
|
continue
|
||||||
drop_from_inventory(r_hand)
|
drop_from_inventory(r_hand)
|
||||||
|
|
||||||
emote("me", 1, "drops what they were holding, their [E.name] malfunctioning!")
|
emote("me", 1, "drops what they were holding, their [E.name] malfunctioning!")
|
||||||
|
|
||||||
@@ -176,4 +177,4 @@
|
|||||||
/mob/living/carbon/human/proc/sync_organ_dna()
|
/mob/living/carbon/human/proc/sync_organ_dna()
|
||||||
var/list/all_bits = internal_organs|organs
|
var/list/all_bits = internal_organs|organs
|
||||||
for(var/obj/item/organ/O in all_bits)
|
for(var/obj/item/organ/O in all_bits)
|
||||||
O.set_dna(dna)
|
O.set_dna(dna)
|
||||||
|
|||||||
@@ -1015,6 +1015,10 @@
|
|||||||
|
|
||||||
// Check everything else.
|
// Check everything else.
|
||||||
|
|
||||||
|
//Periodically double-check embedded_flag
|
||||||
|
if(embedded_flag && !(life_tick % 10))
|
||||||
|
if(!embedded_needs_process())
|
||||||
|
embedded_flag = 0
|
||||||
//Vision
|
//Vision
|
||||||
var/obj/item/organ/vision
|
var/obj/item/organ/vision
|
||||||
if(species.vision_organ)
|
if(species.vision_organ)
|
||||||
|
|||||||
@@ -37,7 +37,6 @@
|
|||||||
bump_flag = MONKEY
|
bump_flag = MONKEY
|
||||||
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
|
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
|
||||||
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL|ALIEN
|
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL|ALIEN
|
||||||
var/holder_type = /obj/item/weapon/holder/monkey
|
|
||||||
|
|
||||||
/datum/species/monkey/handle_npc(var/mob/living/carbon/human/H)
|
/datum/species/monkey/handle_npc(var/mob/living/carbon/human/H)
|
||||||
if(H.stat != CONSCIOUS)
|
if(H.stat != CONSCIOUS)
|
||||||
@@ -47,10 +46,6 @@
|
|||||||
if(prob(1))
|
if(prob(1))
|
||||||
H.emote(pick("scratch","jump","roll","tail"))
|
H.emote(pick("scratch","jump","roll","tail"))
|
||||||
|
|
||||||
/datum/species/monkey/handle_post_spawn(var/mob/living/carbon/human/H)
|
|
||||||
..()
|
|
||||||
H.holder_type = holder_type
|
|
||||||
|
|
||||||
/datum/species/monkey/get_random_name()
|
/datum/species/monkey/get_random_name()
|
||||||
return "[lowertext(name)] ([rand(100,999)])"
|
return "[lowertext(name)] ([rand(100,999)])"
|
||||||
|
|
||||||
@@ -66,7 +61,6 @@
|
|||||||
flesh_color = "#AFA59E"
|
flesh_color = "#AFA59E"
|
||||||
base_color = "#333333"
|
base_color = "#333333"
|
||||||
tail = "farwatail"
|
tail = "farwatail"
|
||||||
holder_type = /obj/item/weapon/holder/monkey/farwa
|
|
||||||
|
|
||||||
/datum/species/monkey/skrell
|
/datum/species/monkey/skrell
|
||||||
name = "Neara"
|
name = "Neara"
|
||||||
@@ -81,7 +75,6 @@
|
|||||||
blood_color = "#1D2CBF"
|
blood_color = "#1D2CBF"
|
||||||
reagent_tag = IS_SKRELL
|
reagent_tag = IS_SKRELL
|
||||||
tail = null
|
tail = null
|
||||||
holder_type = /obj/item/weapon/holder/monkey/neaera
|
|
||||||
|
|
||||||
/datum/species/monkey/unathi
|
/datum/species/monkey/unathi
|
||||||
name = "Stok"
|
name = "Stok"
|
||||||
@@ -96,4 +89,3 @@
|
|||||||
flesh_color = "#34AF10"
|
flesh_color = "#34AF10"
|
||||||
base_color = "#066000"
|
base_color = "#066000"
|
||||||
reagent_tag = IS_UNATHI
|
reagent_tag = IS_UNATHI
|
||||||
holder_type = /obj/item/weapon/holder/monkey/stok
|
|
||||||
|
|||||||
@@ -3,8 +3,7 @@
|
|||||||
if(!slot_to_strip || !istype(user))
|
if(!slot_to_strip || !istype(user))
|
||||||
return
|
return
|
||||||
|
|
||||||
// TODO : Change to incapacitated() on merge.
|
if(user.incapacitated())
|
||||||
if(user.stat || user.lying || user.resting || user.buckled)
|
|
||||||
user << browse(null, text("window=mob[src.name]"))
|
user << browse(null, text("window=mob[src.name]"))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
set invisibility = 0
|
set invisibility = 0
|
||||||
set background = BACKGROUND_ENABLED
|
set background = BACKGROUND_ENABLED
|
||||||
|
|
||||||
|
..()
|
||||||
|
|
||||||
if (transforming)
|
if (transforming)
|
||||||
return
|
return
|
||||||
if(!loc)
|
if(!loc)
|
||||||
@@ -125,7 +127,8 @@
|
|||||||
|
|
||||||
//this handles hud updates. Calls update_vision() and handle_hud_icons()
|
//this handles hud updates. Calls update_vision() and handle_hud_icons()
|
||||||
/mob/living/handle_regular_hud_updates()
|
/mob/living/handle_regular_hud_updates()
|
||||||
if(!client) return 0
|
if(!client)
|
||||||
|
return 0
|
||||||
..()
|
..()
|
||||||
|
|
||||||
handle_vision()
|
handle_vision()
|
||||||
|
|||||||
@@ -378,7 +378,3 @@
|
|||||||
src.attack_log += "\[[time_stamp()]\]<font color='orange'> Got knifed by [user.name] ([user.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])</font>"
|
src.attack_log += "\[[time_stamp()]\]<font color='orange'> Got knifed by [user.name] ([user.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])</font>"
|
||||||
msg_admin_attack("[key_name(user)] knifed [key_name(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" )
|
msg_admin_attack("[key_name(user)] knifed [key_name(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" )
|
||||||
return
|
return
|
||||||
|
|
||||||
/mob/living/incapacitated()
|
|
||||||
if(stat || paralysis || stunned || weakened || restrained())
|
|
||||||
return 1
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person)
|
emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person)
|
||||||
small = 1
|
small = 1
|
||||||
pass_flags = 1
|
pass_flags = 1
|
||||||
holder_type = /obj/item/weapon/holder/pai
|
|
||||||
|
|
||||||
var/network = "SS13"
|
var/network = "SS13"
|
||||||
var/obj/machinery/camera/current = null
|
var/obj/machinery/camera/current = null
|
||||||
@@ -430,4 +429,4 @@
|
|||||||
get_scooped(H)
|
get_scooped(H)
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
return ..()
|
return ..()
|
||||||
|
|||||||
@@ -1,3 +1,23 @@
|
|||||||
|
var/list/mob_hat_cache = list()
|
||||||
|
/proc/get_hat_icon(var/obj/item/hat, var/offset_x = 0, var/offset_y = 0)
|
||||||
|
var/t_state = hat.icon_state
|
||||||
|
if(hat.item_state_slots && hat.item_state_slots[slot_head_str])
|
||||||
|
t_state = hat.item_state_slots[slot_head_str]
|
||||||
|
else if(hat.item_state)
|
||||||
|
t_state = hat.item_state
|
||||||
|
var/key = "[t_state]_[offset_x]_[offset_y]"
|
||||||
|
if(!mob_hat_cache[key]) // Not ideal as there's no guarantee all hat icon_states
|
||||||
|
var/t_icon = INV_HEAD_DEF_ICON // are unique across multiple dmis, but whatever.
|
||||||
|
if(hat.icon_override)
|
||||||
|
t_icon = hat.icon_override
|
||||||
|
else if(hat.item_icons && (slot_head_str in hat.item_icons))
|
||||||
|
t_icon = hat.item_icons[slot_head_str]
|
||||||
|
var/image/I = image(icon = t_icon, icon_state = t_state)
|
||||||
|
I.pixel_x = offset_x
|
||||||
|
I.pixel_y = offset_y
|
||||||
|
mob_hat_cache[key] = I
|
||||||
|
return mob_hat_cache[key]
|
||||||
|
|
||||||
/mob/living/silicon/robot/drone
|
/mob/living/silicon/robot/drone
|
||||||
name = "drone"
|
name = "drone"
|
||||||
real_name = "drone"
|
real_name = "drone"
|
||||||
@@ -29,9 +49,26 @@
|
|||||||
var/module_type = /obj/item/weapon/robot_module/drone
|
var/module_type = /obj/item/weapon/robot_module/drone
|
||||||
var/can_pull_size = 2
|
var/can_pull_size = 2
|
||||||
var/can_pull_mobs
|
var/can_pull_mobs
|
||||||
|
var/obj/item/hat
|
||||||
|
var/hat_x_offset = 0
|
||||||
|
var/hat_y_offset = -13
|
||||||
|
|
||||||
holder_type = /obj/item/weapon/holder/drone
|
holder_type = /obj/item/weapon/holder/drone
|
||||||
|
|
||||||
|
/mob/living/silicon/robot/drone/Destroy()
|
||||||
|
if(hat)
|
||||||
|
hat.loc = get_turf(src)
|
||||||
|
..()
|
||||||
|
|
||||||
|
/mob/living/silicon/robot/drone/construction
|
||||||
|
icon_state = "constructiondrone"
|
||||||
|
law_type = /datum/ai_laws/construction_drone
|
||||||
|
module_type = /obj/item/weapon/robot_module/drone/construction
|
||||||
|
can_pull_size = 5
|
||||||
|
can_pull_mobs = 1
|
||||||
|
hat_x_offset = 1
|
||||||
|
hat_y_offset = -12
|
||||||
|
|
||||||
/mob/living/silicon/robot/drone/New()
|
/mob/living/silicon/robot/drone/New()
|
||||||
|
|
||||||
..()
|
..()
|
||||||
@@ -82,6 +119,8 @@
|
|||||||
overlays += "eyes-[icon_state]"
|
overlays += "eyes-[icon_state]"
|
||||||
else
|
else
|
||||||
overlays -= "eyes"
|
overlays -= "eyes"
|
||||||
|
if(hat) // Let the drones wear hats.
|
||||||
|
overlays |= get_hat_icon(hat, hat_x_offset, hat_y_offset)
|
||||||
|
|
||||||
/mob/living/silicon/robot/drone/choose_icon()
|
/mob/living/silicon/robot/drone/choose_icon()
|
||||||
return
|
return
|
||||||
@@ -89,10 +128,25 @@
|
|||||||
/mob/living/silicon/robot/drone/pick_module()
|
/mob/living/silicon/robot/drone/pick_module()
|
||||||
return
|
return
|
||||||
|
|
||||||
//Drones cannot be upgraded with borg modules so we need to catch some items before they get used in ..().
|
/mob/living/silicon/robot/drone/proc/wear_hat(var/obj/item/new_hat)
|
||||||
/mob/living/silicon/robot/drone/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
if(hat)
|
||||||
|
return
|
||||||
|
hat = new_hat
|
||||||
|
new_hat.loc = src
|
||||||
|
updateicon()
|
||||||
|
|
||||||
if(istype(W, /obj/item/borg/upgrade/))
|
//Drones cannot be upgraded with borg modules so we need to catch some items before they get used in ..().
|
||||||
|
/mob/living/silicon/robot/drone/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||||
|
|
||||||
|
if(user.a_intent == "help" && istype(W, /obj/item/clothing/head))
|
||||||
|
if(hat)
|
||||||
|
user << "<span class='warning'>\The [src] is already wearing \the [hat].</span>"
|
||||||
|
return
|
||||||
|
user.unEquip(W)
|
||||||
|
wear_hat(W)
|
||||||
|
user.visible_message("<span class='notice'>\The [user] puts \the [W] on \the [src].</span>")
|
||||||
|
return
|
||||||
|
else if(istype(W, /obj/item/borg/upgrade/))
|
||||||
user << "<span class='danger'>\The [src] is not compatible with \the [W].</span>"
|
user << "<span class='danger'>\The [src] is not compatible with \the [W].</span>"
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -135,7 +189,7 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/mob/living/silicon/robot/drone/emag_act(var/remaining_charges, var/mob/user)
|
/mob/living/silicon/robot/drone/emag_act(var/remaining_charges, var/mob/user)
|
||||||
if(!client || stat == 2)
|
if(!client || stat == 2)
|
||||||
user << "<span class='danger'>There's not much point subverting this heap of junk.</span>"
|
user << "<span class='danger'>There's not much point subverting this heap of junk.</span>"
|
||||||
@@ -279,13 +333,6 @@
|
|||||||
/mob/living/silicon/robot/drone/remove_robot_verbs()
|
/mob/living/silicon/robot/drone/remove_robot_verbs()
|
||||||
src.verbs -= silicon_subsystems
|
src.verbs -= silicon_subsystems
|
||||||
|
|
||||||
/mob/living/silicon/robot/drone/construction
|
|
||||||
icon_state = "constructiondrone"
|
|
||||||
law_type = /datum/ai_laws/construction_drone
|
|
||||||
module_type = /obj/item/weapon/robot_module/drone/construction
|
|
||||||
can_pull_size = 5
|
|
||||||
can_pull_mobs = 1
|
|
||||||
|
|
||||||
/mob/living/silicon/robot/drone/construction/welcome_drone()
|
/mob/living/silicon/robot/drone/construction/welcome_drone()
|
||||||
src << "<b>You are a construction drone, an autonomous engineering and fabrication system.</b>."
|
src << "<b>You are a construction drone, an autonomous engineering and fabrication system.</b>."
|
||||||
src << "You are assigned to a Sol Central construction project. The name is irrelevant. Your task is to complete construction and subsystem integration as soon as possible."
|
src << "You are assigned to a Sol Central construction project. The name is irrelevant. Your task is to complete construction and subsystem integration as soon as possible."
|
||||||
|
|||||||
@@ -10,13 +10,13 @@
|
|||||||
mail_destination = ""
|
mail_destination = ""
|
||||||
return
|
return
|
||||||
|
|
||||||
src << "\blue You configure your internal beacon, tagging yourself for delivery to '[new_tag]'."
|
src << "<span class='notice'>You configure your internal beacon, tagging yourself for delivery to '[new_tag]'.</span>"
|
||||||
mail_destination = new_tag
|
mail_destination = new_tag
|
||||||
|
|
||||||
//Auto flush if we use this verb inside a disposal chute.
|
//Auto flush if we use this verb inside a disposal chute.
|
||||||
var/obj/machinery/disposal/D = src.loc
|
var/obj/machinery/disposal/D = src.loc
|
||||||
if(istype(D))
|
if(istype(D))
|
||||||
src << "\blue \The [D] acknowledges your signal."
|
src << "<span class='notice'>\The [D] acknowledges your signal.</span>"
|
||||||
D.flush_count = D.flush_every_ticks
|
D.flush_count = D.flush_every_ticks
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -27,5 +27,11 @@
|
|||||||
if(H.a_intent == "help")
|
if(H.a_intent == "help")
|
||||||
get_scooped(H)
|
get_scooped(H)
|
||||||
return
|
return
|
||||||
|
else if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand))
|
||||||
|
hat.loc = get_turf(src)
|
||||||
|
H.put_in_hands(hat)
|
||||||
|
H.visible_message("<span class='danger'>\The [H] removes \the [src]'s [hat].</span>")
|
||||||
|
hat = null
|
||||||
|
updateicon()
|
||||||
else
|
else
|
||||||
return ..()
|
return ..()
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
/obj/item/weapon/firealarm_electronics,
|
/obj/item/weapon/firealarm_electronics,
|
||||||
/obj/item/weapon/airalarm_electronics,
|
/obj/item/weapon/airalarm_electronics,
|
||||||
/obj/item/weapon/airlock_electronics,
|
/obj/item/weapon/airlock_electronics,
|
||||||
|
/obj/item/weapon/tracker_electronics,
|
||||||
/obj/item/weapon/module/power_control,
|
/obj/item/weapon/module/power_control,
|
||||||
/obj/item/weapon/stock_parts,
|
/obj/item/weapon/stock_parts,
|
||||||
/obj/item/frame,
|
/obj/item/frame,
|
||||||
|
|||||||
@@ -78,7 +78,8 @@
|
|||||||
flick("h_lathe_leave",src)
|
flick("h_lathe_leave",src)
|
||||||
|
|
||||||
time_last_drone = world.time
|
time_last_drone = world.time
|
||||||
var/mob/living/silicon/robot/drone/new_drone = new drone_type(get_turf(src))
|
if(player.mob && player.mob.mind) player.mob.mind.reset()
|
||||||
|
var/mob/living/silicon/robot/drone/new_drone = PoolOrNew(drone_type, get_turf(src))
|
||||||
new_drone.transfer_personality(player)
|
new_drone.transfer_personality(player)
|
||||||
new_drone.master_fabricator = src
|
new_drone.master_fabricator = src
|
||||||
|
|
||||||
@@ -90,7 +91,6 @@
|
|||||||
set name = "Join As Drone"
|
set name = "Join As Drone"
|
||||||
set desc = "If there is a powered, enabled fabricator in the game world with a prepared chassis, join as a maintenance drone."
|
set desc = "If there is a powered, enabled fabricator in the game world with a prepared chassis, join as a maintenance drone."
|
||||||
|
|
||||||
|
|
||||||
if(ticker.current_state < GAME_STATE_PLAYING)
|
if(ticker.current_state < GAME_STATE_PLAYING)
|
||||||
src << "<span class='danger'>The game hasn't started yet!</span>"
|
src << "<span class='danger'>The game hasn't started yet!</span>"
|
||||||
return
|
return
|
||||||
@@ -108,17 +108,11 @@
|
|||||||
if(jobban_isbanned(src,"Cyborg"))
|
if(jobban_isbanned(src,"Cyborg"))
|
||||||
usr << "<span class='danger'>You are banned from playing synthetics and cannot spawn as a drone.</span>"
|
usr << "<span class='danger'>You are banned from playing synthetics and cannot spawn as a drone.</span>"
|
||||||
return
|
return
|
||||||
|
|
||||||
if(!MayRespawn(1))
|
if(!MayRespawn(1))
|
||||||
return
|
return
|
||||||
|
|
||||||
var/deathtime = world.time - src.timeofdeath
|
var/deathtime = world.time - src.timeofdeath
|
||||||
if(istype(src,/mob/dead/observer))
|
|
||||||
var/mob/dead/observer/G = src
|
|
||||||
if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
|
|
||||||
usr << "<span class='notice'>Upon using the antagHUD you forfeighted the ability to join the round.</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/deathtimeminutes = round(deathtime / 600)
|
var/deathtimeminutes = round(deathtime / 600)
|
||||||
var/pluralcheck = "minute"
|
var/pluralcheck = "minute"
|
||||||
if(deathtimeminutes == 0)
|
if(deathtimeminutes == 0)
|
||||||
|
|||||||
@@ -996,7 +996,7 @@
|
|||||||
if(ROBOT_NOTIFICATION_NEW_MODULE) //New Module
|
if(ROBOT_NOTIFICATION_NEW_MODULE) //New Module
|
||||||
connected_ai << "<br><br><span class='notice'>NOTICE - [braintype] module change detected: [name] has loaded the [first_arg].</span><br>"
|
connected_ai << "<br><br><span class='notice'>NOTICE - [braintype] module change detected: [name] has loaded the [first_arg].</span><br>"
|
||||||
if(ROBOT_NOTIFICATION_MODULE_RESET)
|
if(ROBOT_NOTIFICATION_MODULE_RESET)
|
||||||
connected_ai << "<br><br><span class='notice'>NOTICE - [braintype] module reset detected: [name] has unladed the [first_arg].</span><br>"
|
connected_ai << "<br><br><span class='notice'>NOTICE - [braintype] module reset detected: [name] has unloaded the [first_arg].</span><br>"
|
||||||
if(ROBOT_NOTIFICATION_NEW_NAME) //New Name
|
if(ROBOT_NOTIFICATION_NEW_NAME) //New Name
|
||||||
if(first_arg != second_arg)
|
if(first_arg != second_arg)
|
||||||
connected_ai << "<br><br><span class='notice'>NOTICE - [braintype] reclassification detected: [first_arg] is now designated as [second_arg].</span><br>"
|
connected_ai << "<br><br><span class='notice'>NOTICE - [braintype] reclassification detected: [first_arg] is now designated as [second_arg].</span><br>"
|
||||||
|
|||||||
@@ -507,7 +507,7 @@ var/global/list/robot_modules = list(
|
|||||||
|
|
||||||
src.modules += new /obj/item/weapon/tray/robotray(src)
|
src.modules += new /obj/item/weapon/tray/robotray(src)
|
||||||
src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src)
|
src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src)
|
||||||
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
|
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src)
|
||||||
|
|
||||||
var/datum/reagents/R = new/datum/reagents(50)
|
var/datum/reagents/R = new/datum/reagents(50)
|
||||||
src.emag.reagents = R
|
src.emag.reagents = R
|
||||||
@@ -540,7 +540,7 @@ var/global/list/robot_modules = list(
|
|||||||
var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules
|
var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules
|
||||||
E.reagents.add_reagent("enzyme", 2 * amount)
|
E.reagents.add_reagent("enzyme", 2 * amount)
|
||||||
if(src.emag)
|
if(src.emag)
|
||||||
var/obj/item/weapon/reagent_containers/food/drinks/cans/beer/B = src.emag
|
var/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer/B = src.emag
|
||||||
B.reagents.add_reagent("beer2", 2 * amount)
|
B.reagents.add_reagent("beer2", 2 * amount)
|
||||||
|
|
||||||
/obj/item/weapon/robot_module/miner
|
/obj/item/weapon/robot_module/miner
|
||||||
|
|||||||
@@ -59,8 +59,13 @@
|
|||||||
var/mob/dead/observer/spook = locate() in range(src,5)
|
var/mob/dead/observer/spook = locate() in range(src,5)
|
||||||
if(spook)
|
if(spook)
|
||||||
var/turf/T = spook.loc
|
var/turf/T = spook.loc
|
||||||
var/obj/O = pick(T.contents)
|
var/list/visible = list()
|
||||||
visible_emote("suddenly stops and stares at something unseen[istype(O) ? " near [O]":""].")
|
for(var/obj/O in T.contents)
|
||||||
|
if(!O.invisibility && O.name)
|
||||||
|
visible += O
|
||||||
|
if(visible.len)
|
||||||
|
var/atom/A = pick(visible)
|
||||||
|
visible_emote("suddenly stops and stares at something unseen[istype(A) ? " near [A]":""].")
|
||||||
|
|
||||||
/mob/living/simple_animal/cat/proc/handle_movement_target()
|
/mob/living/simple_animal/cat/proc/handle_movement_target()
|
||||||
//if our target is neither inside a turf or inside a human(???), stop
|
//if our target is neither inside a turf or inside a human(???), stop
|
||||||
|
|||||||
@@ -63,13 +63,6 @@
|
|||||||
|
|
||||||
if(!body_color)
|
if(!body_color)
|
||||||
body_color = pick( list("brown","gray","white") )
|
body_color = pick( list("brown","gray","white") )
|
||||||
switch(body_color)
|
|
||||||
if("brown")
|
|
||||||
holder_type = /obj/item/weapon/holder/mouse/brown
|
|
||||||
if("gray")
|
|
||||||
holder_type = /obj/item/weapon/holder/mouse/gray
|
|
||||||
if("white")
|
|
||||||
holder_type = /obj/item/weapon/holder/mouse/white
|
|
||||||
icon_state = "mouse_[body_color]"
|
icon_state = "mouse_[body_color]"
|
||||||
icon_living = "mouse_[body_color]"
|
icon_living = "mouse_[body_color]"
|
||||||
icon_dead = "mouse_[body_color]_dead"
|
icon_dead = "mouse_[body_color]_dead"
|
||||||
@@ -125,17 +118,14 @@
|
|||||||
/mob/living/simple_animal/mouse/white
|
/mob/living/simple_animal/mouse/white
|
||||||
body_color = "white"
|
body_color = "white"
|
||||||
icon_state = "mouse_white"
|
icon_state = "mouse_white"
|
||||||
holder_type = /obj/item/weapon/holder/mouse/white
|
|
||||||
|
|
||||||
/mob/living/simple_animal/mouse/gray
|
/mob/living/simple_animal/mouse/gray
|
||||||
body_color = "gray"
|
body_color = "gray"
|
||||||
icon_state = "mouse_gray"
|
icon_state = "mouse_gray"
|
||||||
holder_type = /obj/item/weapon/holder/mouse/gray
|
|
||||||
|
|
||||||
/mob/living/simple_animal/mouse/brown
|
/mob/living/simple_animal/mouse/brown
|
||||||
body_color = "brown"
|
body_color = "brown"
|
||||||
icon_state = "mouse_brown"
|
icon_state = "mouse_brown"
|
||||||
holder_type = /obj/item/weapon/holder/mouse/brown
|
|
||||||
|
|
||||||
//TOM IS ALIVE! SQUEEEEEEEE~K :)
|
//TOM IS ALIVE! SQUEEEEEEEE~K :)
|
||||||
/mob/living/simple_animal/mouse/brown/Tom
|
/mob/living/simple_animal/mouse/brown/Tom
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
rapid = 1
|
rapid = 1
|
||||||
icon_state = "syndicateranged"
|
icon_state = "syndicateranged"
|
||||||
icon_living = "syndicateranged"
|
icon_living = "syndicateranged"
|
||||||
casingtype = /obj/item/ammo_casing/a12mm
|
casingtype = /obj/item/ammo_casing/a10mm
|
||||||
projectilesound = 'sound/weapons/Gunshot_light.ogg'
|
projectilesound = 'sound/weapons/Gunshot_light.ogg'
|
||||||
projectiletype = /obj/item/projectile/bullet/pistol/medium
|
projectiletype = /obj/item/projectile/bullet/pistol/medium
|
||||||
|
|
||||||
|
|||||||
@@ -153,7 +153,7 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
/mob/proc/incapacitated()
|
/mob/proc/incapacitated()
|
||||||
return
|
return (stat || paralysis || stunned || weakened || restrained())
|
||||||
|
|
||||||
/mob/proc/restrained()
|
/mob/proc/restrained()
|
||||||
return
|
return
|
||||||
@@ -872,6 +872,9 @@
|
|||||||
visible_implants += O
|
visible_implants += O
|
||||||
return visible_implants
|
return visible_implants
|
||||||
|
|
||||||
|
/mob/proc/embedded_needs_process()
|
||||||
|
return (embedded.len > 0)
|
||||||
|
|
||||||
mob/proc/yank_out_object()
|
mob/proc/yank_out_object()
|
||||||
set category = "Object"
|
set category = "Object"
|
||||||
set name = "Yank out object"
|
set name = "Yank out object"
|
||||||
|
|||||||
@@ -53,7 +53,7 @@
|
|||||||
var/joint = "joint" // Descriptive string used in dislocation.
|
var/joint = "joint" // Descriptive string used in dislocation.
|
||||||
var/amputation_point // Descriptive string used in amputation.
|
var/amputation_point // Descriptive string used in amputation.
|
||||||
var/dislocated = 0 // If you target a joint, you can dislocate the limb, causing temporary damage to the organ.
|
var/dislocated = 0 // If you target a joint, you can dislocate the limb, causing temporary damage to the organ.
|
||||||
var/can_grasp
|
var/can_grasp //It would be more appropriate if these two were named "affects_grasp" and "affects_stand" at this point
|
||||||
var/can_stand
|
var/can_stand
|
||||||
|
|
||||||
/obj/item/organ/external/Destroy()
|
/obj/item/organ/external/Destroy()
|
||||||
|
|||||||
@@ -107,6 +107,15 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
/obj/item/weapon/paper/attack_self(mob/living/user as mob)
|
/obj/item/weapon/paper/attack_self(mob/living/user as mob)
|
||||||
|
if(user.a_intent == I_HURT)
|
||||||
|
if(icon_state == "scrap")
|
||||||
|
user.show_message("<span class='warning'>\The [src] is already crumpled.</span>")
|
||||||
|
return
|
||||||
|
//crumple dat paper
|
||||||
|
info = stars(info,85)
|
||||||
|
user.visible_message("\The [user] crumples \the [src] into a ball!")
|
||||||
|
icon_state = "scrap"
|
||||||
|
return
|
||||||
user.examinate(src)
|
user.examinate(src)
|
||||||
if(rigged && (Holiday == "April Fool's Day"))
|
if(rigged && (Holiday == "April Fool's Day"))
|
||||||
if(spam_flag == 0)
|
if(spam_flag == 0)
|
||||||
@@ -442,6 +451,10 @@
|
|||||||
B.update_icon()
|
B.update_icon()
|
||||||
|
|
||||||
else if(istype(P, /obj/item/weapon/pen))
|
else if(istype(P, /obj/item/weapon/pen))
|
||||||
|
if(icon_state == "scrap")
|
||||||
|
usr << "<span class='warning'>\The [src] is too crumpled to write on.</span>"
|
||||||
|
return
|
||||||
|
|
||||||
var/obj/item/weapon/pen/robopen/RP = P
|
var/obj/item/weapon/pen/robopen/RP = P
|
||||||
if ( istype(RP) && RP.mode == 2 )
|
if ( istype(RP) && RP.mode == 2 )
|
||||||
RP.RenamePaper(user,src)
|
RP.RenamePaper(user,src)
|
||||||
|
|||||||
@@ -17,7 +17,17 @@
|
|||||||
if((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr))))))
|
if((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr))))))
|
||||||
if(!istype(usr, /mob/living/carbon/slime) && !istype(usr, /mob/living/simple_animal))
|
if(!istype(usr, /mob/living/carbon/slime) && !istype(usr, /mob/living/simple_animal))
|
||||||
if( !usr.get_active_hand() ) //if active hand is empty
|
if( !usr.get_active_hand() ) //if active hand is empty
|
||||||
attack_hand(usr, 1, 1)
|
var/mob/living/carbon/human/H = user
|
||||||
|
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
|
||||||
|
|
||||||
|
if (H.hand)
|
||||||
|
temp = H.organs_by_name["l_hand"]
|
||||||
|
if(temp && !temp.is_usable())
|
||||||
|
user << "<span class='notice'>You try to move your [temp.name], but cannot!</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
user << "<span class='notice'>You pick up the [src].</span>"
|
||||||
|
user.put_in_hands(src)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -110,18 +110,18 @@
|
|||||||
/obj/item/ammo_magazine/c9mm/empty
|
/obj/item/ammo_magazine/c9mm/empty
|
||||||
initial_ammo = 0
|
initial_ammo = 0
|
||||||
|
|
||||||
/obj/item/ammo_magazine/a12mm
|
/obj/item/ammo_magazine/a10mm
|
||||||
name = "magazine (12mm)"
|
name = "magazine (10mm)"
|
||||||
icon_state = "12mm"
|
icon_state = "12mm"
|
||||||
origin_tech = list(TECH_COMBAT = 2)
|
origin_tech = list(TECH_COMBAT = 2)
|
||||||
mag_type = MAGAZINE
|
mag_type = MAGAZINE
|
||||||
caliber = "12mm"
|
caliber = "10mm"
|
||||||
matter = list(DEFAULT_WALL_MATERIAL = 1500)
|
matter = list(DEFAULT_WALL_MATERIAL = 1500)
|
||||||
ammo_type = "/obj/item/ammo_casing/a12mm"
|
ammo_type = /obj/item/ammo_casing/a10mm
|
||||||
max_ammo = 20
|
max_ammo = 20
|
||||||
multiple_sprites = 1
|
multiple_sprites = 1
|
||||||
|
|
||||||
/obj/item/ammo_magazine/a12mm/empty
|
/obj/item/ammo_magazine/a10mm/empty
|
||||||
initial_ammo = 0
|
initial_ammo = 0
|
||||||
|
|
||||||
/obj/item/ammo_magazine/a556
|
/obj/item/ammo_magazine/a556
|
||||||
|
|||||||
@@ -64,9 +64,9 @@
|
|||||||
caliber = ".45"
|
caliber = ".45"
|
||||||
projectile_type = /obj/item/projectile/energy/flash
|
projectile_type = /obj/item/projectile/energy/flash
|
||||||
|
|
||||||
/obj/item/ammo_casing/a12mm
|
/obj/item/ammo_casing/a10mm
|
||||||
desc = "A 12mm bullet casing."
|
desc = "A 10mm bullet casing."
|
||||||
caliber = "12mm"
|
caliber = "10mm"
|
||||||
projectile_type = /obj/item/projectile/bullet/pistol/medium
|
projectile_type = /obj/item/projectile/bullet/pistol/medium
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
/obj/item/weapon/gun/energy/laser
|
/obj/item/weapon/gun/energy/laser
|
||||||
name = "laser carbine"
|
name = "laser carbine"
|
||||||
desc = "A common laser weapon, designed to kill with concentrated energy blasts."
|
desc = "An Hesphaistos Industries G40E carbine, designed to kill with concentrated energy blasts."
|
||||||
icon_state = "laser"
|
icon_state = "laser"
|
||||||
item_state = "laser"
|
item_state = "laser"
|
||||||
fire_sound = 'sound/weapons/Laser.ogg'
|
fire_sound = 'sound/weapons/Laser.ogg'
|
||||||
slot_flags = SLOT_BELT|SLOT_BACK
|
slot_flags = SLOT_BELT|SLOT_BACK
|
||||||
w_class = 3
|
w_class = 3
|
||||||
force = 10
|
force = 10
|
||||||
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
|
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
|
||||||
matter = list(DEFAULT_WALL_MATERIAL = 2000)
|
matter = list(DEFAULT_WALL_MATERIAL = 2000)
|
||||||
projectile_type = /obj/item/projectile/beam
|
projectile_type = /obj/item/projectile/beam
|
||||||
fire_delay = 1 //rapid fire
|
fire_delay = 1 //rapid fire
|
||||||
|
|
||||||
@@ -17,15 +17,15 @@
|
|||||||
use_external_power = 1
|
use_external_power = 1
|
||||||
|
|
||||||
/obj/item/weapon/gun/energy/laser/practice
|
/obj/item/weapon/gun/energy/laser/practice
|
||||||
name = "practice laser gun"
|
name = "practice laser carbine"
|
||||||
desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice."
|
desc = "A modified version of the HI G40E, this one fires less concentrated energy bolts designed for target practice."
|
||||||
projectile_type = /obj/item/projectile/beam/practice
|
projectile_type = /obj/item/projectile/beam/practice
|
||||||
|
|
||||||
obj/item/weapon/gun/energy/retro
|
obj/item/weapon/gun/energy/retro
|
||||||
name = "retro laser"
|
name = "retro laser"
|
||||||
icon_state = "retro"
|
icon_state = "retro"
|
||||||
item_state = "retro"
|
item_state = "retro"
|
||||||
desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws."
|
desc = "An older model of the basic lasergun. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws."
|
||||||
fire_sound = 'sound/weapons/Laser.ogg'
|
fire_sound = 'sound/weapons/Laser.ogg'
|
||||||
slot_flags = SLOT_BELT
|
slot_flags = SLOT_BELT
|
||||||
w_class = 3
|
w_class = 3
|
||||||
@@ -36,7 +36,7 @@ obj/item/weapon/gun/energy/retro
|
|||||||
name = "antique laser gun"
|
name = "antique laser gun"
|
||||||
icon_state = "caplaser"
|
icon_state = "caplaser"
|
||||||
item_state = "caplaser"
|
item_state = "caplaser"
|
||||||
desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. The object menaces with spikes of energy. On the item is an image of Space Station 13. The station is exploding."
|
desc = "A rare weapon, handcrafted by a now defunct specialty manufacturer on Luna for a small fortune. It's certainly aged well"
|
||||||
force = 5
|
force = 5
|
||||||
fire_sound = 'sound/weapons/Laser.ogg'
|
fire_sound = 'sound/weapons/Laser.ogg'
|
||||||
slot_flags = SLOT_BELT
|
slot_flags = SLOT_BELT
|
||||||
@@ -78,8 +78,8 @@ obj/item/weapon/gun/energy/retro
|
|||||||
fire_delay = 1
|
fire_delay = 1
|
||||||
|
|
||||||
/obj/item/weapon/gun/energy/sniperrifle
|
/obj/item/weapon/gun/energy/sniperrifle
|
||||||
name = "\improper L.W.A.P. sniper rifle"
|
name = "marksman energy rifle"
|
||||||
desc = "A high-power laser rifle fitted with a SMART aiming-system scope."
|
desc = "The HI DMR 9E is an older design of Hesphaistos Industries. A designated marksman rifle capable of shooting powerful ionized beams, this is a weapon to kill from a distance."
|
||||||
icon_state = "sniper"
|
icon_state = "sniper"
|
||||||
item_state = "laser"
|
item_state = "laser"
|
||||||
fire_sound = 'sound/weapons/marauder.ogg'
|
fire_sound = 'sound/weapons/marauder.ogg'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/obj/item/weapon/gun/energy/gun
|
/obj/item/weapon/gun/energy/gun
|
||||||
name = "energy gun"
|
name = "energy gun"
|
||||||
desc = "An energy-based gun with two settings: Stun and kill."
|
desc = "Another bestseller of Lawson Arms and the FTU, the LAEP90 Perun is a versatile energy based sidearm, capable of switching between low and high capacity projectile settings. In other words: Stun or Kill."
|
||||||
icon_state = "energystun100"
|
icon_state = "energystun100"
|
||||||
item_state = null //so the human update icon uses the icon_state instead.
|
item_state = null //so the human update icon uses the icon_state instead.
|
||||||
fire_sound = 'sound/weapons/Taser.ogg'
|
fire_sound = 'sound/weapons/Taser.ogg'
|
||||||
@@ -24,9 +24,9 @@
|
|||||||
name = "advanced energy gun"
|
name = "advanced energy gun"
|
||||||
desc = "An energy gun with an experimental miniaturized reactor."
|
desc = "An energy gun with an experimental miniaturized reactor."
|
||||||
icon_state = "nucgun"
|
icon_state = "nucgun"
|
||||||
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3)
|
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3)
|
||||||
slot_flags = SLOT_BELT
|
slot_flags = SLOT_BELT
|
||||||
force = 8 //looks heavier than a pistol
|
force = 8 //looks heavier than a pistol
|
||||||
self_recharge = 1
|
self_recharge = 1
|
||||||
modifystate = null
|
modifystate = null
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
list(name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg'),
|
list(name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg'),
|
||||||
list(name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg'),
|
list(name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg'),
|
||||||
)
|
)
|
||||||
|
|
||||||
var/lightfail = 0
|
var/lightfail = 0
|
||||||
|
|
||||||
//override for failcheck behaviour
|
//override for failcheck behaviour
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/obj/item/weapon/gun/energy/ionrifle
|
/obj/item/weapon/gun/energy/ionrifle
|
||||||
name = "ion rifle"
|
name = "ion rifle"
|
||||||
desc = "A man portable anti-armor weapon designed to disable mechanical threats"
|
desc = "The NT Mk60 EW Halicon is a man portable anti-armor weapon designed to disable mechanical threats, produced by NT. Not the best of its type."
|
||||||
icon_state = "ionrifle"
|
icon_state = "ionrifle"
|
||||||
item_state = "ionrifle"
|
item_state = "ionrifle"
|
||||||
fire_sound = 'sound/weapons/Laser.ogg'
|
fire_sound = 'sound/weapons/Laser.ogg'
|
||||||
@@ -28,9 +28,9 @@
|
|||||||
desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
|
desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
|
||||||
icon_state = "decloner"
|
icon_state = "decloner"
|
||||||
item_state = "decloner"
|
item_state = "decloner"
|
||||||
fire_sound = 'sound/weapons/pulse3.ogg'
|
fire_sound = 'sound/weapons/pulse3.ogg'
|
||||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_POWER = 3)
|
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_POWER = 3)
|
||||||
max_shots = 10
|
max_shots = 10
|
||||||
projectile_type = /obj/item/projectile/energy/declone
|
projectile_type = /obj/item/projectile/energy/declone
|
||||||
|
|
||||||
/obj/item/weapon/gun/energy/floragun
|
/obj/item/weapon/gun/energy/floragun
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/obj/item/weapon/gun/energy/taser
|
/obj/item/weapon/gun/energy/taser
|
||||||
name = "taser gun"
|
name = "taser gun"
|
||||||
desc = "A small, low capacity gun used for non-lethal takedowns."
|
desc = "The NT Mk30 NL is a small, low capacity gun used for non-lethal takedowns. Produced by NT, it's actually a licensed version of a W-T design."
|
||||||
icon_state = "taser"
|
icon_state = "taser"
|
||||||
item_state = null //so the human update icon uses the icon_state instead.
|
item_state = null //so the human update icon uses the icon_state instead.
|
||||||
fire_sound = 'sound/weapons/Taser.ogg'
|
fire_sound = 'sound/weapons/Taser.ogg'
|
||||||
@@ -20,11 +20,11 @@
|
|||||||
|
|
||||||
/obj/item/weapon/gun/energy/stunrevolver
|
/obj/item/weapon/gun/energy/stunrevolver
|
||||||
name = "stun revolver"
|
name = "stun revolver"
|
||||||
desc = "A high-tech revolver that fires stun cartridges. The stun cartridges can be recharged using a conventional energy weapon recharger."
|
desc = "A LAEP20 Zeus. Designed by Lawson Arms and produced under the wing of the FTU, several TSCs have been trying to get a hold of the blueprints for half a decade."
|
||||||
icon_state = "stunrevolver"
|
icon_state = "stunrevolver"
|
||||||
item_state = "stunrevolver"
|
item_state = "stunrevolver"
|
||||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||||
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
|
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
|
||||||
projectile_type = /obj/item/projectile/energy/electrode
|
projectile_type = /obj/item/projectile/energy/electrode
|
||||||
max_shots = 8
|
max_shots = 8
|
||||||
|
|
||||||
@@ -35,8 +35,8 @@
|
|||||||
icon_state = "crossbow"
|
icon_state = "crossbow"
|
||||||
w_class = 2.0
|
w_class = 2.0
|
||||||
item_state = "crossbow"
|
item_state = "crossbow"
|
||||||
origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2, TECH_ILLEGAL = 5)
|
origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2, TECH_ILLEGAL = 5)
|
||||||
matter = list(DEFAULT_WALL_MATERIAL = 2000)
|
matter = list(DEFAULT_WALL_MATERIAL = 2000)
|
||||||
slot_flags = SLOT_BELT
|
slot_flags = SLOT_BELT
|
||||||
silenced = 1
|
silenced = 1
|
||||||
fire_sound = 'sound/weapons/Genhit.ogg'
|
fire_sound = 'sound/weapons/Genhit.ogg'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/obj/item/weapon/gun/projectile/automatic //Hopefully someone will find a way to make these fire in bursts or something. --Superxpdude
|
/obj/item/weapon/gun/projectile/automatic //Hopefully someone will find a way to make these fire in bursts or something. --Superxpdude
|
||||||
name = "submachine gun"
|
name = "prototype SMG"
|
||||||
desc = "A lightweight, fast firing gun. Uses 9mm rounds."
|
desc = "A protoype lightweight, fast firing gun. Uses 9mm rounds."
|
||||||
icon_state = "saber" //ugly
|
icon_state = "saber" //ugly
|
||||||
w_class = 3
|
w_class = 3
|
||||||
load_method = SPEEDLOADER //yup. until someone sprites a magazine for it.
|
load_method = SPEEDLOADER //yup. until someone sprites a magazine for it.
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
/obj/item/weapon/gun/projectile/automatic/mini_uzi
|
/obj/item/weapon/gun/projectile/automatic/mini_uzi
|
||||||
name = "\improper Uzi"
|
name = "\improper Uzi"
|
||||||
desc = "A lightweight, fast firing gun, for when you want someone dead. Uses .45 rounds."
|
desc = "The UZI is a lightweight, fast firing gun. For when you want someone dead. Uses .45 rounds."
|
||||||
icon_state = "mini-uzi"
|
icon_state = "mini-uzi"
|
||||||
w_class = 3
|
w_class = 3
|
||||||
load_method = SPEEDLOADER //yup. until someone sprites a magazine for it.
|
load_method = SPEEDLOADER //yup. until someone sprites a magazine for it.
|
||||||
@@ -30,18 +30,18 @@
|
|||||||
ammo_type = /obj/item/ammo_casing/c45
|
ammo_type = /obj/item/ammo_casing/c45
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/automatic/c20r
|
/obj/item/weapon/gun/projectile/automatic/c20r
|
||||||
name = "\improper C-20r SMG"
|
name = "submachine gun"
|
||||||
desc = "A lightweight, fast firing gun, for when you REALLY need someone dead. Uses 12mm pistol rounds. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp"
|
desc = "The C-20r is a lightweight and rapid firing SMG, for when you REALLY need someone dead. Uses 10mm rounds. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp."
|
||||||
icon_state = "c20r"
|
icon_state = "c20r"
|
||||||
item_state = "c20r"
|
item_state = "c20r"
|
||||||
w_class = 3
|
w_class = 3
|
||||||
force = 10
|
force = 10
|
||||||
caliber = "12mm"
|
caliber = "10mm"
|
||||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
|
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
|
||||||
slot_flags = SLOT_BELT|SLOT_BACK
|
slot_flags = SLOT_BELT|SLOT_BACK
|
||||||
fire_sound = 'sound/weapons/Gunshot_light.ogg'
|
fire_sound = 'sound/weapons/Gunshot_light.ogg'
|
||||||
load_method = MAGAZINE
|
load_method = MAGAZINE
|
||||||
magazine_type = /obj/item/ammo_magazine/a12mm
|
magazine_type = /obj/item/ammo_magazine/a10mm
|
||||||
auto_eject = 1
|
auto_eject = 1
|
||||||
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
|
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
|
||||||
|
|
||||||
@@ -54,8 +54,8 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/automatic/sts35
|
/obj/item/weapon/gun/projectile/automatic/sts35
|
||||||
name = "\improper STS-35 automatic rifle"
|
name = "assault rifle"
|
||||||
desc = "A durable, rugged looking automatic weapon of a make popular on the frontier worlds. Uses 7.62mm rounds. It is unmarked."
|
desc = "The rugged STS-35 is a durable automatic weapon of a make popular on the frontier worlds. Uses 7.62mm rounds. This one is unmarked."
|
||||||
icon_state = "arifle"
|
icon_state = "arifle"
|
||||||
item_state = null
|
item_state = null
|
||||||
w_class = 4
|
w_class = 4
|
||||||
@@ -78,8 +78,8 @@
|
|||||||
update_held_icon()
|
update_held_icon()
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/automatic/wt550
|
/obj/item/weapon/gun/projectile/automatic/wt550
|
||||||
name = "\improper W-T 550 Saber"
|
name = "machine pistol"
|
||||||
desc = "A cheap, mass produced Ward-Takahashi PDW. Uses 9mm rounds."
|
desc = "The W-T 550 Saber is a cheap self-defense weapon, mass-produced by Ward-Takahashi for paramilitary and private use. Uses 9mm rounds."
|
||||||
icon_state = "wt550"
|
icon_state = "wt550"
|
||||||
item_state = "wt550"
|
item_state = "wt550"
|
||||||
w_class = 3
|
w_class = 3
|
||||||
@@ -100,8 +100,8 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/automatic/z8
|
/obj/item/weapon/gun/projectile/automatic/z8
|
||||||
name = "\improper Z8 Bulldog"
|
name = "bullpup assault rifle"
|
||||||
desc = "An older model bullpup carbine, made by the now defunct Zendai Foundries. Uses armor piercing 5.56mm rounds. Makes you feel like a space marine when you hold it."
|
desc = "The Z8 Bulldog is an older model bullpup carbine, made by the now defunct Zendai Foundries. Uses armor piercing 5.56mm rounds. Makes you feel like a space marine when you hold it."
|
||||||
icon_state = "carbine"
|
icon_state = "carbine"
|
||||||
item_state = "z8carbine"
|
item_state = "z8carbine"
|
||||||
w_class = 4
|
w_class = 4
|
||||||
@@ -166,8 +166,8 @@
|
|||||||
user << "\The [launcher] is empty."
|
user << "\The [launcher] is empty."
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/automatic/l6_saw
|
/obj/item/weapon/gun/projectile/automatic/l6_saw
|
||||||
name = "\improper L6 SAW"
|
name = "light machine gun"
|
||||||
desc = "A rather traditionally made light machine gun with a pleasantly lacquered wooden pistol grip. Has 'Aussec Armoury- 2531' engraved on the reciever"
|
desc = "A rather traditionally made L6 SAW with a pleasantly lacquered wooden pistol grip. Has 'Aussec Armoury- 2531' engraved on the reciever"
|
||||||
icon_state = "l6closed100"
|
icon_state = "l6closed100"
|
||||||
item_state = "l6closedmag"
|
item_state = "l6closedmag"
|
||||||
w_class = 4
|
w_class = 4
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
|
|
||||||
/obj/item/weapon/gun/projectile/dartgun
|
/obj/item/weapon/gun/projectile/dartgun
|
||||||
name = "dart gun"
|
name = "dart gun"
|
||||||
desc = "A small gas-powered dartgun, capable of delivering chemical cocktails swiftly across short distances."
|
desc = "Zeng-Hu Pharmaceutical's entry into the arms market, the Z-H P Artemis is a gas-powered dart gun capable of delivering chemical cocktails swiftly across short distances."
|
||||||
icon_state = "dartgun-empty"
|
icon_state = "dartgun-empty"
|
||||||
item_state = null
|
item_state = null
|
||||||
|
|
||||||
@@ -203,4 +203,4 @@
|
|||||||
starting_chems = list("kelotane","bicaridine","anti_toxin")
|
starting_chems = list("kelotane","bicaridine","anti_toxin")
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/dartgun/vox/raider
|
/obj/item/weapon/gun/projectile/dartgun/vox/raider
|
||||||
starting_chems = list("space_drugs","stoxin","impedrezene")
|
starting_chems = list("space_drugs","stoxin","impedrezene")
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/obj/item/weapon/gun/projectile/colt
|
/obj/item/weapon/gun/projectile/colt
|
||||||
name = "\improper Colt M1911"
|
name = "vintage .45 pistol"
|
||||||
desc = "A cheap Martian knock-off of a Colt M1911."
|
desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds."
|
||||||
magazine_type = /obj/item/ammo_magazine/c45m
|
magazine_type = /obj/item/ammo_magazine/c45m
|
||||||
icon_state = "colt"
|
icon_state = "colt"
|
||||||
caliber = ".45"
|
caliber = ".45"
|
||||||
@@ -9,7 +9,6 @@
|
|||||||
load_method = MAGAZINE
|
load_method = MAGAZINE
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/colt/detective
|
/obj/item/weapon/gun/projectile/colt/detective
|
||||||
desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds."
|
|
||||||
magazine_type = /obj/item/ammo_magazine/c45m/rubber
|
magazine_type = /obj/item/ammo_magazine/c45m/rubber
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun()
|
/obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun()
|
||||||
@@ -31,8 +30,8 @@
|
|||||||
return 1
|
return 1
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/sec
|
/obj/item/weapon/gun/projectile/sec
|
||||||
desc = "A NanoTrasen designed sidearm, found pretty much everywhere humans are. Uses .45 rounds."
|
name = ".45 pistol"
|
||||||
name = "\improper NT Mk58"
|
desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a Nanotrasen subsidiary. Found pretty much everywhere humans are. Uses .45 rounds."
|
||||||
icon_state = "secguncomp"
|
icon_state = "secguncomp"
|
||||||
magazine_type = /obj/item/ammo_magazine/c45m/rubber
|
magazine_type = /obj/item/ammo_magazine/c45m/rubber
|
||||||
caliber = ".45"
|
caliber = ".45"
|
||||||
@@ -41,12 +40,12 @@
|
|||||||
load_method = MAGAZINE
|
load_method = MAGAZINE
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/sec/flash
|
/obj/item/weapon/gun/projectile/sec/flash
|
||||||
name = "\improper NT Mk58 signal pistol"
|
name = ".45 signal pistol"
|
||||||
magazine_type = /obj/item/ammo_magazine/c45m/flash
|
magazine_type = /obj/item/ammo_magazine/c45m/flash
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/sec/wood
|
/obj/item/weapon/gun/projectile/sec/wood
|
||||||
desc = "A Nanotrasen designed sidearm, this one has a sweet wooden grip. Uses .45 rounds."
|
desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a Nanotrasen subsidiary. This one has a sweet wooden grip. Uses .45 rounds."
|
||||||
name = "\improper Custom NT Mk58"
|
name = "custom .45 Pistol"
|
||||||
icon_state = "secgundark"
|
icon_state = "secgundark"
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/silenced
|
/obj/item/weapon/gun/projectile/silenced
|
||||||
@@ -106,8 +105,8 @@
|
|||||||
icon_state = "gyropistol"
|
icon_state = "gyropistol"
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/pistol
|
/obj/item/weapon/gun/projectile/pistol
|
||||||
name = "\improper Stechtkin pistol"
|
name = "holdout pistol"
|
||||||
desc = "A small, easily concealable gun. Uses 9mm rounds."
|
desc = "The Lumoco Arms P3 Whisper. A small, easily concealable gun. Uses 9mm rounds."
|
||||||
icon_state = "pistol"
|
icon_state = "pistol"
|
||||||
item_state = null
|
item_state = null
|
||||||
w_class = 2
|
w_class = 2
|
||||||
@@ -119,8 +118,7 @@
|
|||||||
magazine_type = /obj/item/ammo_magazine/mc9mm
|
magazine_type = /obj/item/ammo_magazine/mc9mm
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/pistol/flash
|
/obj/item/weapon/gun/projectile/pistol/flash
|
||||||
name = "\improper Stechtkin signal pistol"
|
name = "holdout signal pistol"
|
||||||
desc = "A small, easily concealable gun. Uses 9mm rounds."
|
|
||||||
magazine_type = /obj/item/ammo_magazine/mc9mm/flash
|
magazine_type = /obj/item/ammo_magazine/mc9mm/flash
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/pistol/attack_hand(mob/user as mob)
|
/obj/item/weapon/gun/projectile/pistol/attack_hand(mob/user as mob)
|
||||||
@@ -166,19 +164,19 @@
|
|||||||
w_class = 2
|
w_class = 2
|
||||||
|
|
||||||
/obj/item/weapon/gun/projectile/pirate
|
/obj/item/weapon/gun/projectile/pirate
|
||||||
name = "zipgun"
|
name = "zip gun"
|
||||||
desc = "Little more than a barrel, handle, and firing mechanism, cheap makeshift firearms like this one are not uncommon in frontier systems."
|
desc = "Little more than a barrel, handle, and firing mechanism, cheap makeshift firearms like this one are not uncommon in frontier systems."
|
||||||
icon_state = "sawnshotgun"
|
icon_state = "sawnshotgun"
|
||||||
item_state = "sawnshotgun"
|
item_state = "sawnshotgun"
|
||||||
handle_casings = CYCLE_CASINGS //player has to take the old casing out manually before reloading
|
handle_casings = CYCLE_CASINGS //player has to take the old casing out manually before reloading
|
||||||
load_method = SINGLE_CASING
|
load_method = SINGLE_CASING
|
||||||
max_shells = 1 //literally just a barrel
|
max_shells = 1 //literally just a barrel
|
||||||
|
|
||||||
var/global/list/ammo_types = list(
|
var/global/list/ammo_types = list(
|
||||||
/obj/item/ammo_casing/a357 = ".357",
|
/obj/item/ammo_casing/a357 = ".357",
|
||||||
/obj/item/ammo_casing/c9mmf = "9mm",
|
/obj/item/ammo_casing/c9mmf = "9mm",
|
||||||
/obj/item/ammo_casing/c45f = ".45",
|
/obj/item/ammo_casing/c45f = ".45",
|
||||||
/obj/item/ammo_casing/a12mm = "12mm",
|
/obj/item/ammo_casing/a10mm = "10mm",
|
||||||
/obj/item/ammo_casing/shotgun = "12 gauge",
|
/obj/item/ammo_casing/shotgun = "12 gauge",
|
||||||
/obj/item/ammo_casing/shotgun = "12 gauge",
|
/obj/item/ammo_casing/shotgun = "12 gauge",
|
||||||
/obj/item/ammo_casing/shotgun/pellet = "12 gauge",
|
/obj/item/ammo_casing/shotgun/pellet = "12 gauge",
|
||||||
@@ -194,7 +192,7 @@
|
|||||||
/obj/item/weapon/gun/projectile/pirate/New()
|
/obj/item/weapon/gun/projectile/pirate/New()
|
||||||
ammo_type = pick(ammo_types)
|
ammo_type = pick(ammo_types)
|
||||||
desc += " Uses [ammo_types[ammo_type]] rounds."
|
desc += " Uses [ammo_types[ammo_type]] rounds."
|
||||||
|
|
||||||
var/obj/item/ammo_casing/ammo = ammo_type
|
var/obj/item/ammo_casing/ammo = ammo_type
|
||||||
caliber = initial(ammo.caliber)
|
caliber = initial(ammo.caliber)
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/obj/item/weapon/gun/projectile/revolver
|
/obj/item/weapon/gun/projectile/revolver
|
||||||
name = "revolver"
|
name = "revolver"
|
||||||
desc = "A classic revolver. Uses .357 ammo"
|
desc = "The Lumoco Arms HE Colt is a choice revolver for when you absolutely, positively need to put a hole in the other guy. Uses .357 ammo."
|
||||||
icon_state = "revolver"
|
icon_state = "revolver"
|
||||||
item_state = "revolver"
|
item_state = "revolver"
|
||||||
caliber = "357"
|
caliber = "357"
|
||||||
@@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
/obj/item/weapon/gun/projectile/revolver/mateba
|
/obj/item/weapon/gun/projectile/revolver/mateba
|
||||||
name = "mateba"
|
name = "mateba"
|
||||||
desc = "When you absolutely, positively need a 10mm hole in the other guy. Uses .357 ammo." //>10mm hole >.357
|
|
||||||
icon_state = "mateba"
|
icon_state = "mateba"
|
||||||
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
|
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/obj/item/weapon/gun/projectile/shotgun/pump
|
/obj/item/weapon/gun/projectile/shotgun/pump
|
||||||
name = "shotgun"
|
name = "shotgun"
|
||||||
desc = "Useful for sweeping alleys."
|
desc = "The mass-produced W-T Remmington 29x shotgun is a favourite of police and security forces on many worlds. Useful for sweeping alleys."
|
||||||
icon_state = "shotgun"
|
icon_state = "shotgun"
|
||||||
item_state = "shotgun"
|
item_state = "shotgun"
|
||||||
max_shells = 4
|
max_shells = 4
|
||||||
@@ -41,6 +41,7 @@
|
|||||||
|
|
||||||
/obj/item/weapon/gun/projectile/shotgun/pump/combat
|
/obj/item/weapon/gun/projectile/shotgun/pump/combat
|
||||||
name = "combat shotgun"
|
name = "combat shotgun"
|
||||||
|
desc = "Built for close quarters combat, the Hesphaistos Industries KS-40 is widely regarded as a weapon of choice for repelling boarders."
|
||||||
icon_state = "cshotgun"
|
icon_state = "cshotgun"
|
||||||
item_state = "cshotgun"
|
item_state = "cshotgun"
|
||||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2)
|
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/obj/item/weapon/gun/projectile/heavysniper
|
/obj/item/weapon/gun/projectile/heavysniper
|
||||||
name = "\improper PTR-7 rifle"
|
name = "anti-materiel rifle"
|
||||||
desc = "A portable anti-armour rifle fitted with a scope. Originally designed to used against armoured exosuits, it is capable of punching through windows and non-reinforced walls with ease. Fires armor piercing 14.5mm shells."
|
desc = "A portable anti-armour rifle fitted with a scope, the HI PTR-7 Rifle was originally designed to used against armoured exosuits. It is capable of punching through windows and non-reinforced walls with ease. Fires armor piercing 14.5mm shells."
|
||||||
icon_state = "heavysniper"
|
icon_state = "heavysniper"
|
||||||
item_state = "l6closednomag" //placeholder
|
item_state = "l6closednomag" //placeholder
|
||||||
w_class = 4
|
w_class = 4
|
||||||
|
|||||||
@@ -292,9 +292,15 @@
|
|||||||
return trans_to_obj(target, amount, multiplier, copy)
|
return trans_to_obj(target, amount, multiplier, copy)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
//Using this in case we want to differentiate splashing an atom from transferring reagents to it later down the road.
|
//Splashing reagents is messier than trans_to, the target's loc gets some of the reagents as well.
|
||||||
//For now it just calls trans_to.
|
/datum/reagents/proc/splash(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/min_spill=0, var/max_spill=60)
|
||||||
/datum/reagents/proc/splash(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0)
|
var/spill = 0
|
||||||
|
if(!isturf(target) && target.loc)
|
||||||
|
spill = amount*(rand(min_spill, max_spill)/100)
|
||||||
|
amount -= spill
|
||||||
|
if(spill)
|
||||||
|
splash(target.loc, spill, multiplier, copy, min_spill, max_spill)
|
||||||
|
|
||||||
trans_to(target, amount, multiplier, copy)
|
trans_to(target, amount, multiplier, copy)
|
||||||
|
|
||||||
/datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1)
|
/datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1)
|
||||||
|
|||||||
@@ -112,6 +112,19 @@
|
|||||||
M.resistances += data
|
M.resistances += data
|
||||||
return
|
return
|
||||||
|
|
||||||
|
// pure concentrated antibodies
|
||||||
|
/datum/reagent/antibodies
|
||||||
|
data = list("antibodies"=list())
|
||||||
|
name = "Antibodies"
|
||||||
|
id = "antibodies"
|
||||||
|
reagent_state = LIQUID
|
||||||
|
color = "#0050F0"
|
||||||
|
|
||||||
|
/datum/reagent/antibodies/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||||
|
if(src.data)
|
||||||
|
M.antibodies |= src.data["antibodies"]
|
||||||
|
..()
|
||||||
|
|
||||||
#define WATER_LATENT_HEAT 19000 // How much heat is removed when applied to a hot turf, in J/unit (19000 makes 120 u of water roughly equivalent to 4L)
|
#define WATER_LATENT_HEAT 19000 // How much heat is removed when applied to a hot turf, in J/unit (19000 makes 120 u of water roughly equivalent to 4L)
|
||||||
/datum/reagent/water
|
/datum/reagent/water
|
||||||
name = "Water"
|
name = "Water"
|
||||||
@@ -145,7 +158,7 @@
|
|||||||
environment.add_thermal_energy(-removed_heat)
|
environment.add_thermal_energy(-removed_heat)
|
||||||
if (prob(5))
|
if (prob(5))
|
||||||
T.visible_message("<span class='warning'>The water sizzles as it lands on \the [T]!</span>")
|
T.visible_message("<span class='warning'>The water sizzles as it lands on \the [T]!</span>")
|
||||||
|
|
||||||
else if(volume >= 10)
|
else if(volume >= 10)
|
||||||
if(T.wet >= 1)
|
if(T.wet >= 1)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -65,7 +65,7 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
else
|
else
|
||||||
trans = reagents.splash(target, amount_per_transfer_from_this) //sprinkling reagents on generic non-mobs
|
trans = reagents.trans_to(target, amount_per_transfer_from_this) //sprinkling reagents on generic non-mobs
|
||||||
user << "<span class='notice'>You transfer [trans] units of the solution.</span>"
|
user << "<span class='notice'>You transfer [trans] units of the solution.</span>"
|
||||||
|
|
||||||
else // Taking from something
|
else // Taking from something
|
||||||
|
|||||||
@@ -1,43 +1,12 @@
|
|||||||
/obj/item/weapon/reagent_containers/food/drinks/cans
|
/obj/item/weapon/reagent_containers/food/drinks/cans
|
||||||
|
volume = 40 //just over one and a half cups
|
||||||
amount_per_transfer_from_this = 5
|
amount_per_transfer_from_this = 5
|
||||||
flags = 0
|
flags = 0 //starts closed
|
||||||
|
|
||||||
attack_self(mob/user as mob)
|
|
||||||
if (!is_open_container())
|
|
||||||
playsound(loc,'sound/effects/canopen.ogg', rand(10,50), 1)
|
|
||||||
user << "<span class='notice'>You open the drink with an audible pop!</span>"
|
|
||||||
flags |= OPENCONTAINER
|
|
||||||
else
|
|
||||||
return
|
|
||||||
|
|
||||||
attack(mob/M as mob, mob/user as mob, def_zone)
|
|
||||||
if(!is_open_container())
|
|
||||||
user << "<span class='notice'>You need to open the drink!</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
|
|
||||||
afterattack(obj/target, mob/user, proximity)
|
|
||||||
if(!proximity) return
|
|
||||||
|
|
||||||
if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
|
|
||||||
if(!is_open_container())
|
|
||||||
user << "<span class='notice'>You need to open the drink!</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
else if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it.
|
|
||||||
if(!is_open_container())
|
|
||||||
user << "<span class='notice'>You need to open the drink!</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
//DRINKS
|
//DRINKS
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/cola
|
/obj/item/weapon/reagent_containers/food/drinks/cans/cola
|
||||||
name = "Space Cola"
|
name = "\improper Space Cola"
|
||||||
desc = "Cola. in space."
|
desc = "Cola. in space."
|
||||||
icon_state = "cola"
|
icon_state = "cola"
|
||||||
center_of_mass = list("x"=16, "y"=10)
|
center_of_mass = list("x"=16, "y"=10)
|
||||||
@@ -46,7 +15,7 @@
|
|||||||
reagents.add_reagent("cola", 30)
|
reagents.add_reagent("cola", 30)
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle
|
/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle
|
||||||
name = "Bottled Water"
|
name = "bottled water"
|
||||||
desc = "Introduced to the vending machines by Skrellian request, this water comes straight from the Martian poles."
|
desc = "Introduced to the vending machines by Skrellian request, this water comes straight from the Martian poles."
|
||||||
icon_state = "waterbottle"
|
icon_state = "waterbottle"
|
||||||
center_of_mass = list("x"=15, "y"=8)
|
center_of_mass = list("x"=15, "y"=8)
|
||||||
@@ -54,28 +23,8 @@
|
|||||||
..()
|
..()
|
||||||
reagents.add_reagent("water", 30)
|
reagents.add_reagent("water", 30)
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/beer
|
|
||||||
name = "Space Beer"
|
|
||||||
desc = "Contains only water, malt and hops."
|
|
||||||
icon_state = "beer"
|
|
||||||
center_of_mass = list("x"=16, "y"=12)
|
|
||||||
New()
|
|
||||||
..()
|
|
||||||
reagents.add_reagent("beer", 30)
|
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/ale
|
|
||||||
name = "Magm-Ale"
|
|
||||||
desc = "A true dorf's drink of choice."
|
|
||||||
icon_state = "alebottle"
|
|
||||||
item_state = "beer"
|
|
||||||
center_of_mass = list("x"=16, "y"=10)
|
|
||||||
New()
|
|
||||||
..()
|
|
||||||
reagents.add_reagent("ale", 30)
|
|
||||||
|
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind
|
/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind
|
||||||
name = "Space Mountain Wind"
|
name = "\improper Space Mountain Wind"
|
||||||
desc = "Blows right through you like a space wind."
|
desc = "Blows right through you like a space wind."
|
||||||
icon_state = "space_mountain_wind"
|
icon_state = "space_mountain_wind"
|
||||||
center_of_mass = list("x"=16, "y"=10)
|
center_of_mass = list("x"=16, "y"=10)
|
||||||
@@ -84,7 +33,7 @@
|
|||||||
reagents.add_reagent("spacemountainwind", 30)
|
reagents.add_reagent("spacemountainwind", 30)
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko
|
/obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko
|
||||||
name = "Thirteen Loko"
|
name = "\improper Thirteen Loko"
|
||||||
desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkeness, or even death. Please Drink Responsibly."
|
desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkeness, or even death. Please Drink Responsibly."
|
||||||
icon_state = "thirteen_loko"
|
icon_state = "thirteen_loko"
|
||||||
center_of_mass = list("x"=16, "y"=8)
|
center_of_mass = list("x"=16, "y"=8)
|
||||||
@@ -93,7 +42,7 @@
|
|||||||
reagents.add_reagent("thirteenloko", 30)
|
reagents.add_reagent("thirteenloko", 30)
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb
|
/obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb
|
||||||
name = "Dr. Gibb"
|
name = "\improper Dr. Gibb"
|
||||||
desc = "A delicious mixture of 42 different flavors."
|
desc = "A delicious mixture of 42 different flavors."
|
||||||
icon_state = "dr_gibb"
|
icon_state = "dr_gibb"
|
||||||
center_of_mass = list("x"=16, "y"=10)
|
center_of_mass = list("x"=16, "y"=10)
|
||||||
@@ -102,7 +51,7 @@
|
|||||||
reagents.add_reagent("dr_gibb", 30)
|
reagents.add_reagent("dr_gibb", 30)
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/starkist
|
/obj/item/weapon/reagent_containers/food/drinks/cans/starkist
|
||||||
name = "Star-kist"
|
name = "\improper Star-kist"
|
||||||
desc = "The taste of a star in liquid form. And, a bit of tuna...?"
|
desc = "The taste of a star in liquid form. And, a bit of tuna...?"
|
||||||
icon_state = "starkist"
|
icon_state = "starkist"
|
||||||
center_of_mass = list("x"=16, "y"=10)
|
center_of_mass = list("x"=16, "y"=10)
|
||||||
@@ -111,7 +60,7 @@
|
|||||||
reagents.add_reagent("brownstar", 30)
|
reagents.add_reagent("brownstar", 30)
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/space_up
|
/obj/item/weapon/reagent_containers/food/drinks/cans/space_up
|
||||||
name = "Space-Up"
|
name = "\improper Space-Up"
|
||||||
desc = "Tastes like a hull breach in your mouth."
|
desc = "Tastes like a hull breach in your mouth."
|
||||||
icon_state = "space-up"
|
icon_state = "space-up"
|
||||||
center_of_mass = list("x"=16, "y"=10)
|
center_of_mass = list("x"=16, "y"=10)
|
||||||
@@ -120,7 +69,7 @@
|
|||||||
reagents.add_reagent("space_up", 30)
|
reagents.add_reagent("space_up", 30)
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/lemon_lime
|
/obj/item/weapon/reagent_containers/food/drinks/cans/lemon_lime
|
||||||
name = "Lemon-Lime"
|
name = "\improper Lemon-Lime"
|
||||||
desc = "You wanted ORANGE. It gave you Lemon Lime."
|
desc = "You wanted ORANGE. It gave you Lemon Lime."
|
||||||
icon_state = "lemon-lime"
|
icon_state = "lemon-lime"
|
||||||
center_of_mass = list("x"=16, "y"=10)
|
center_of_mass = list("x"=16, "y"=10)
|
||||||
@@ -129,7 +78,7 @@
|
|||||||
reagents.add_reagent("lemon_lime", 30)
|
reagents.add_reagent("lemon_lime", 30)
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea
|
/obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea
|
||||||
name = "Vrisk Serket Iced Tea"
|
name = "\improper Vrisk Serket Iced Tea"
|
||||||
desc = "That sweet, refreshing southern earthy flavor. That's where it's from, right? South Earth?"
|
desc = "That sweet, refreshing southern earthy flavor. That's where it's from, right? South Earth?"
|
||||||
icon_state = "ice_tea_can"
|
icon_state = "ice_tea_can"
|
||||||
center_of_mass = list("x"=16, "y"=10)
|
center_of_mass = list("x"=16, "y"=10)
|
||||||
@@ -138,7 +87,7 @@
|
|||||||
reagents.add_reagent("icetea", 30)
|
reagents.add_reagent("icetea", 30)
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice
|
/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice
|
||||||
name = "Grapel Juice"
|
name = "\improper Grapel Juice"
|
||||||
desc = "500 pages of rules of how to appropriately enter into a combat with this juice!"
|
desc = "500 pages of rules of how to appropriately enter into a combat with this juice!"
|
||||||
icon_state = "purple_can"
|
icon_state = "purple_can"
|
||||||
center_of_mass = list("x"=16, "y"=10)
|
center_of_mass = list("x"=16, "y"=10)
|
||||||
@@ -147,7 +96,7 @@
|
|||||||
reagents.add_reagent("grapejuice", 30)
|
reagents.add_reagent("grapejuice", 30)
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/tonic
|
/obj/item/weapon/reagent_containers/food/drinks/cans/tonic
|
||||||
name = "T-Borg's Tonic Water"
|
name = "\improper T-Borg's Tonic Water"
|
||||||
desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
|
desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
|
||||||
icon_state = "tonic"
|
icon_state = "tonic"
|
||||||
center_of_mass = list("x"=16, "y"=10)
|
center_of_mass = list("x"=16, "y"=10)
|
||||||
@@ -156,7 +105,7 @@
|
|||||||
reagents.add_reagent("tonic", 50)
|
reagents.add_reagent("tonic", 50)
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/cans/sodawater
|
/obj/item/weapon/reagent_containers/food/drinks/cans/sodawater
|
||||||
name = "Soda Water"
|
name = "soda water"
|
||||||
desc = "A can of soda water. Still water's more refreshing cousin."
|
desc = "A can of soda water. Still water's more refreshing cousin."
|
||||||
icon_state = "sodawater"
|
icon_state = "sodawater"
|
||||||
center_of_mass = list("x"=16, "y"=10)
|
center_of_mass = list("x"=16, "y"=10)
|
||||||
|
|||||||
@@ -14,12 +14,18 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
attack_self(mob/user as mob)
|
attack_self(mob/user as mob)
|
||||||
return
|
if(!is_open_container())
|
||||||
|
open(user)
|
||||||
|
|
||||||
attack(mob/M as mob, mob/user as mob, def_zone)
|
proc/open(mob/user)
|
||||||
if(standard_feed_mob(user, M))
|
playsound(loc,'sound/effects/canopen.ogg', rand(10,50), 1)
|
||||||
|
user << "<span class='notice'>You open [src] with an audible pop!</span>"
|
||||||
|
flags |= OPENCONTAINER
|
||||||
|
|
||||||
|
attack(mob/M as mob, mob/user as mob, def_zone)
|
||||||
|
if(standard_feed_mob(user, M))
|
||||||
return
|
return
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
afterattack(obj/target, mob/user, proximity)
|
afterattack(obj/target, mob/user, proximity)
|
||||||
@@ -29,7 +35,24 @@
|
|||||||
return
|
return
|
||||||
if(standard_pour_into(user, target))
|
if(standard_pour_into(user, target))
|
||||||
return
|
return
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
standard_feed_mob(var/mob/user, var/mob/target)
|
||||||
|
if(!is_open_container())
|
||||||
|
user << "<span class='notice'>You need to open [src]!</span>"
|
||||||
|
return 1
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target)
|
||||||
|
if(!is_open_container())
|
||||||
|
user << "<span class='notice'>You need to open [src]!</span>"
|
||||||
|
return 1
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
standard_pour_into(var/mob/user, var/atom/target)
|
||||||
|
if(!is_open_container())
|
||||||
|
user << "<span class='notice'>You need to open [src]!</span>"
|
||||||
|
return 1
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
self_feed_message(var/mob/user)
|
self_feed_message(var/mob/user)
|
||||||
|
|||||||
@@ -4,19 +4,51 @@
|
|||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/bottle
|
/obj/item/weapon/reagent_containers/food/drinks/bottle
|
||||||
amount_per_transfer_from_this = 10
|
amount_per_transfer_from_this = 10
|
||||||
volume = 120
|
volume = 100
|
||||||
item_state = "broken_beer" //Generic held-item sprite until unique ones are made.
|
item_state = "broken_beer" //Generic held-item sprite until unique ones are made.
|
||||||
var/const/duration = 13 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets)
|
force = 5
|
||||||
|
var/smash_duration = 5 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets)
|
||||||
var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it
|
var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it
|
||||||
|
|
||||||
|
var/obj/item/weapon/reagent_containers/glass/rag/rag = null
|
||||||
|
var/rag_underlay = "rag"
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target as mob, mob/living/user as mob)
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/Destroy()
|
||||||
|
rag = null
|
||||||
|
..()
|
||||||
|
|
||||||
|
//when thrown on impact, bottles smash and spill their contents
|
||||||
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/throw_impact(atom/hit_atom, var/speed)
|
||||||
|
..()
|
||||||
|
|
||||||
|
var/mob/M = thrower
|
||||||
|
if(isGlass && istype(M) && M.a_intent == I_HURT)
|
||||||
|
var/throw_dist = get_dist(throw_source, loc)
|
||||||
|
if(speed >= throw_speed && smash_check(throw_dist)) //not as reliable as smashing directly
|
||||||
|
if(reagents)
|
||||||
|
hit_atom.visible_message("<span class='notice'>The contents of the [src] splash all over [hit_atom]!</span>")
|
||||||
|
reagents.splash(hit_atom, reagents.total_volume)
|
||||||
|
src.smash(loc, hit_atom)
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash_check(var/distance)
|
||||||
|
if(!isGlass || !smash_duration)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
var/list/chance_table = list(90, 90, 85, 85, 60, 35, 15) //starting from distance 0
|
||||||
|
var/idx = max(distance + 1, 1) //since list indices start at 1
|
||||||
|
if(idx > chance_table.len)
|
||||||
|
return 0
|
||||||
|
return prob(chance_table[idx])
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(var/newloc, atom/against = null)
|
||||||
|
if(ismob(loc))
|
||||||
|
var/mob/M = loc
|
||||||
|
M.drop_from_inventory(src)
|
||||||
|
|
||||||
//Creates a shattering noise and replaces the bottle with a broken_bottle
|
//Creates a shattering noise and replaces the bottle with a broken_bottle
|
||||||
user.drop_item()
|
var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(newloc)
|
||||||
var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(user.loc)
|
|
||||||
user.put_in_active_hand(B)
|
|
||||||
if(prob(33))
|
if(prob(33))
|
||||||
new/obj/item/weapon/material/shard(target.loc) // Create a glass shard at the target's location!
|
new/obj/item/weapon/material/shard(newloc) // Create a glass shard at the target's location!
|
||||||
B.icon_state = src.icon_state
|
B.icon_state = src.icon_state
|
||||||
|
|
||||||
var/icon/I = new('icons/obj/drinks.dmi', src.icon_state)
|
var/icon/I = new('icons/obj/drinks.dmi', src.icon_state)
|
||||||
@@ -24,23 +56,68 @@
|
|||||||
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
|
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
|
||||||
B.icon = I
|
B.icon = I
|
||||||
|
|
||||||
|
if(rag && rag.on_fire && isliving(against))
|
||||||
|
rag.forceMove(loc)
|
||||||
|
var/mob/living/L = against
|
||||||
|
L.IgniteMob()
|
||||||
|
|
||||||
playsound(src, "shatter", 70, 1)
|
playsound(src, "shatter", 70, 1)
|
||||||
user.put_in_active_hand(B)
|
|
||||||
src.transfer_fingerprints_to(B)
|
src.transfer_fingerprints_to(B)
|
||||||
|
|
||||||
qdel(src)
|
qdel(src)
|
||||||
|
return B
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/attackby(obj/item/W, mob/user)
|
||||||
|
if(!rag && istype(W, /obj/item/weapon/reagent_containers/glass/rag))
|
||||||
|
insert_rag(W, user)
|
||||||
|
return
|
||||||
|
if(rag && istype(W, /obj/item/weapon/flame))
|
||||||
|
rag.attackby(W, user)
|
||||||
|
return
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/attack_self(mob/user)
|
||||||
|
if(rag)
|
||||||
|
remove_rag(user)
|
||||||
|
else
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/insert_rag(obj/item/weapon/reagent_containers/glass/rag/R, mob/user)
|
||||||
|
if(!isGlass || rag) return
|
||||||
|
if(user.unEquip(R))
|
||||||
|
user << "<span class='notice'>You stuff [R] into [src].</span>"
|
||||||
|
rag = R
|
||||||
|
rag.forceMove(src)
|
||||||
|
flags &= ~OPENCONTAINER
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/remove_rag(mob/user)
|
||||||
|
if(!rag) return
|
||||||
|
user.put_in_hands(rag)
|
||||||
|
rag = null
|
||||||
|
flags |= (initial(flags) & OPENCONTAINER)
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/open(mob/user)
|
||||||
|
if(rag) return
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/update_icon()
|
||||||
|
underlays.Cut()
|
||||||
|
if(rag)
|
||||||
|
var/underlay_image = image(icon='icons/obj/drinks.dmi', icon_state=rag.on_fire? "[rag_underlay]_lit" : rag_underlay)
|
||||||
|
underlays += underlay_image
|
||||||
|
copy_light(rag)
|
||||||
|
else
|
||||||
|
set_light(0)
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/attack(mob/living/target as mob, mob/living/user as mob)
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/attack(mob/living/target as mob, mob/living/user as mob)
|
||||||
|
|
||||||
if(!target)
|
if(!target)
|
||||||
return
|
return
|
||||||
|
|
||||||
if(user.a_intent != I_HURT || !isGlass)
|
if(user.a_intent != I_HURT || !isGlass)
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
|
|
||||||
force = 15 //Smashing bottles over someoen's head hurts.
|
|
||||||
|
|
||||||
var/obj/item/organ/external/affecting = user.zone_sel.selecting //Find what the player is aiming at
|
var/obj/item/organ/external/affecting = user.zone_sel.selecting //Find what the player is aiming at
|
||||||
|
|
||||||
var/armor_block = 0 //Get the target's armour values for normal attack damage.
|
var/armor_block = 0 //Get the target's armour values for normal attack damage.
|
||||||
@@ -48,13 +125,16 @@
|
|||||||
|
|
||||||
//Calculating duration and calculating damage.
|
//Calculating duration and calculating damage.
|
||||||
armor_block = target.run_armor_check(affecting, "melee")
|
armor_block = target.run_armor_check(affecting, "melee")
|
||||||
armor_duration = duration + force - target.getarmor(affecting, "melee")
|
|
||||||
|
//force will counteract armour, but will never increase duration
|
||||||
|
armor_duration = smash_duration + min(0, force - target.getarmor(affecting, "melee") + 10)
|
||||||
|
|
||||||
//Apply the damage!
|
//Apply the damage!
|
||||||
target.apply_damage(force, BRUTE, affecting, armor_block, sharp=0)
|
target.apply_damage(force, BRUTE, affecting, armor_block, sharp=0)
|
||||||
|
|
||||||
// You are going to knock someone out for longer if they are not wearing a helmet.
|
// You are going to knock someone out for longer if they are not wearing a helmet.
|
||||||
if(affecting == "head" && istype(target, /mob/living/carbon/))
|
var/do_smash = smash_check(1) //won't always break on the first hit
|
||||||
|
if(affecting == "head" && istype(target, /mob/living/carbon/) && do_smash)
|
||||||
|
|
||||||
//Display an attack message.
|
//Display an attack message.
|
||||||
for(var/mob/O in viewers(user, null))
|
for(var/mob/O in viewers(user, null))
|
||||||
@@ -62,8 +142,7 @@
|
|||||||
else O.show_message(text("\red <B>[target] hit \himself with a bottle of [src.name] on the head!</B>"), 1)
|
else O.show_message(text("\red <B>[target] hit \himself with a bottle of [src.name] on the head!</B>"), 1)
|
||||||
//Weaken the target for the duration that we calculated and divide it by 5.
|
//Weaken the target for the duration that we calculated and divide it by 5.
|
||||||
if(armor_duration)
|
if(armor_duration)
|
||||||
target.apply_effect(min(armor_duration, 10) , WEAKEN, armor_block) // Never weaken more than a flash!
|
target.apply_effect(min(armor_duration, 5) , WEAKEN, armor_block) // Never weaken more than a flash!
|
||||||
|
|
||||||
else
|
else
|
||||||
//Default attack message and don't weaken the target.
|
//Default attack message and don't weaken the target.
|
||||||
for(var/mob/O in viewers(user, null))
|
for(var/mob/O in viewers(user, null))
|
||||||
@@ -75,13 +154,15 @@
|
|||||||
target.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been smashed with a bottle by [user.name] ([user.ckey])</font>")
|
target.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been smashed with a bottle by [user.name] ([user.ckey])</font>")
|
||||||
msg_admin_attack("[user.name] ([user.ckey]) attacked [target.name] ([target.ckey]) with a bottle. (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
msg_admin_attack("[user.name] ([user.ckey]) attacked [target.name] ([target.ckey]) with a bottle. (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||||
|
|
||||||
//The reagents in the bottle splash all over the target, thanks for the idea Nodrak
|
if(do_smash)
|
||||||
if(reagents)
|
//The reagents in the bottle splash all over the target, thanks for the idea Nodrak
|
||||||
user.visible_message("<span class='notice'>The contents of the [src] splash all over [target]!</span>")
|
if(reagents)
|
||||||
reagents.splash(target, reagents.total_volume)
|
user.visible_message("<span class='notice'>The contents of the [src] splash all over [target]!</span>")
|
||||||
|
reagents.splash(target, reagents.total_volume)
|
||||||
|
|
||||||
//Finally, smash the bottle. This kills (qdel) the bottle.
|
//Finally, smash the bottle. This kills (qdel) the bottle.
|
||||||
src.smash(target, user)
|
var/obj/item/weapon/broken_bottle/B = src.smash(target.loc, target)
|
||||||
|
user.put_in_active_hand(B)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -92,8 +173,8 @@
|
|||||||
desc = "A bottle with a sharp broken bottom."
|
desc = "A bottle with a sharp broken bottom."
|
||||||
icon = 'icons/obj/drinks.dmi'
|
icon = 'icons/obj/drinks.dmi'
|
||||||
icon_state = "broken_bottle"
|
icon_state = "broken_bottle"
|
||||||
force = 9.0
|
force = 9
|
||||||
throwforce = 5.0
|
throwforce = 5
|
||||||
throw_speed = 3
|
throw_speed = 3
|
||||||
throw_range = 5
|
throw_range = 5
|
||||||
item_state = "beer"
|
item_state = "beer"
|
||||||
@@ -314,3 +395,31 @@
|
|||||||
New()
|
New()
|
||||||
..()
|
..()
|
||||||
reagents.add_reagent("limejuice", 100)
|
reagents.add_reagent("limejuice", 100)
|
||||||
|
|
||||||
|
//Small bottles
|
||||||
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/small
|
||||||
|
volume = 50
|
||||||
|
smash_duration = 1
|
||||||
|
flags = 0 //starts closed
|
||||||
|
rag_underlay = "rag_small"
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer
|
||||||
|
name = "space beer"
|
||||||
|
desc = "Contains only water, malt and hops."
|
||||||
|
icon_state = "beer"
|
||||||
|
center_of_mass = list("x"=16, "y"=12)
|
||||||
|
New()
|
||||||
|
..()
|
||||||
|
reagents.add_reagent("beer", 30)
|
||||||
|
|
||||||
|
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale
|
||||||
|
name = "\improper Magm-Ale"
|
||||||
|
desc = "A true dorf's drink of choice."
|
||||||
|
icon_state = "alebottle"
|
||||||
|
item_state = "beer"
|
||||||
|
center_of_mass = list("x"=16, "y"=10)
|
||||||
|
New()
|
||||||
|
..()
|
||||||
|
reagents.add_reagent("ale", 30)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -463,6 +463,7 @@
|
|||||||
desc = "An egg!"
|
desc = "An egg!"
|
||||||
icon_state = "egg"
|
icon_state = "egg"
|
||||||
filling_color = "#FDFFD1"
|
filling_color = "#FDFFD1"
|
||||||
|
volume = 10
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/snacks/egg/New()
|
/obj/item/weapon/reagent_containers/food/snacks/egg/New()
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -58,8 +58,6 @@
|
|||||||
<I>This spell opens nearby doors and does not require wizard garb.</I><BR>
|
<I>This spell opens nearby doors and does not require wizard garb.</I><BR>
|
||||||
<A href='byond://?src=\ref[src];spell_choice=horseman'>Curse of the Horseman</A> (15)<BR>
|
<A href='byond://?src=\ref[src];spell_choice=horseman'>Curse of the Horseman</A> (15)<BR>
|
||||||
<I>This spell will curse a person to wear an unremovable horse mask (it has glue on the inside) and speak like a horse. It does not require wizard garb.</I><BR>
|
<I>This spell will curse a person to wear an unremovable horse mask (it has glue on the inside) and speak like a horse. It does not require wizard garb.</I><BR>
|
||||||
<A href='byond://?src=\ref[src];spell_choice=fleshtostone'>Flesh to Stone</A> (60)<BR>
|
|
||||||
<I>This spell will curse a person to immediately turn into an unmoving statue. The effect will eventually wear off if the statue is not destroyed.</I><BR>
|
|
||||||
<A href='byond://?src=\ref[src];spell_choice=noclothes'>Remove Clothes Requirement</A> <b>Warning: this takes away 2 spell choices.</b><BR>
|
<A href='byond://?src=\ref[src];spell_choice=noclothes'>Remove Clothes Requirement</A> <b>Warning: this takes away 2 spell choices.</b><BR>
|
||||||
<HR>
|
<HR>
|
||||||
<B>Artefacts:</B><BR>
|
<B>Artefacts:</B><BR>
|
||||||
@@ -123,7 +121,7 @@
|
|||||||
uses--
|
uses--
|
||||||
/*
|
/*
|
||||||
*/
|
*/
|
||||||
var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", subjugation = "Subjugation", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", staffchange = "Staff of Change", mentalfocus = "Mental Focus", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", noclothes = "No Clothes",fleshtostone = "Flesh to Stone")
|
var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", subjugation = "Subjugation", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", staffchange = "Staff of Change", mentalfocus = "Mental Focus", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", noclothes = "No Clothes")
|
||||||
var/already_knows = 0
|
var/already_knows = 0
|
||||||
for(var/spell/aspell in H.spell_list)
|
for(var/spell/aspell in H.spell_list)
|
||||||
if(available_spells[href_list["spell_choice"]] == initial(aspell.name))
|
if(available_spells[href_list["spell_choice"]] == initial(aspell.name))
|
||||||
|
|||||||
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