mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-27 22:18:27 +01:00
Merge branch 'master' into hanner
This commit is contained in:
@@ -293,7 +293,7 @@ GLOBAL_LIST_EMPTY(mannequins)
|
||||
|
||||
// Custom species icon bases
|
||||
var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //VOREStation Edit
|
||||
var/list/whitelisted_icons = list(SPECIES_FENNEC,SPECIES_XENOHYBRID) //VOREStation Edit
|
||||
var/list/whitelisted_icons = list(SPECIES_FENNEC,SPECIES_XENOHYBRID,SPECIES_TESHARI,SPECIES_VOX) //VOREStation Edit
|
||||
for(var/species_name in GLOB.playable_species)
|
||||
if(species_name in blacklisted_icons)
|
||||
continue
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
var/global/const/base_law_type = /datum/ai_laws/nanotrasen
|
||||
// var/global/const/base_law_type = /datum/ai_laws/nanotrasen //VOREstation edit: unused
|
||||
|
||||
/datum/ai_law
|
||||
var/law = ""
|
||||
|
||||
@@ -108,6 +108,16 @@
|
||||
if("set_matrix_color")
|
||||
color_matrix_last[params["color"]] = params["value"]
|
||||
return TRUE
|
||||
if("set_matrix_string")
|
||||
if(params["value"])
|
||||
var/list/colours = splittext(params["value"], ",")
|
||||
if(colours.len > 12)
|
||||
colours.Cut(13)
|
||||
for(var/i = 1, i <= colours.len, i++)
|
||||
var/number = text2num(colours[i])
|
||||
if(isnum(number))
|
||||
color_matrix_last[i] = clamp(number, -10, 10)
|
||||
return TRUE
|
||||
if("set_hue")
|
||||
build_hue = clamp(text2num(params["buildhue"]), 0, 360)
|
||||
return TRUE
|
||||
|
||||
@@ -334,6 +334,7 @@
|
||||
|
||||
occupantData["blind"] = (H.sdisabilities & BLIND)
|
||||
occupantData["nearsighted"] = (H.disabilities & NEARSIGHTED)
|
||||
occupantData["husked"] = (HUSK in H.mutations) // VOREstation edit
|
||||
occupantData = attempt_vr(src, "get_occupant_data_vr", list(occupantData, H)) //VOREStation Insert
|
||||
data["occupant"] = occupantData
|
||||
|
||||
@@ -537,6 +538,8 @@
|
||||
dat += "<font color='red'>Cataracts detected.</font><BR>"
|
||||
if(occupant.disabilities & NEARSIGHTED)
|
||||
dat += "<font color='red'>Retinal misalignment detected.</font><BR>"
|
||||
if(HUSK in occupant.mutations) // VOREstation edit
|
||||
dat += "<font color='red'>Anatomical structure lost, resuscitation not possible!</font><BR>"
|
||||
else
|
||||
dat += "\The [src] is empty."
|
||||
|
||||
|
||||
@@ -10,6 +10,12 @@
|
||||
var/obj/item/weapon/circuitboard/circuit = null
|
||||
var/obj/item/device/mmi/brain = null
|
||||
|
||||
// VOREstation edit: Respect map config's default
|
||||
/obj/structure/AIcore/Initialize(var/mapload)
|
||||
. = ..()
|
||||
if(mapload)
|
||||
laws = new global.using_map.default_law_type
|
||||
// VOREstation edit end
|
||||
|
||||
/obj/structure/AIcore/attackby(obj/item/P as obj, mob/user as mob)
|
||||
|
||||
|
||||
@@ -1013,8 +1013,15 @@ About the new airlock wires panel:
|
||||
flick("door_deny", src)
|
||||
playsound(src, knock_hammer_sound, 50, 0, 3)
|
||||
else if(arePowerSystemsOn() && user.a_intent == I_HELP)
|
||||
src.visible_message("[user] presses the door bell on \the [src].", "\The [src]'s bell rings.")
|
||||
src.add_fingerprint(user)
|
||||
if(isElectrified())
|
||||
src.visible_message("[user] presses the door bell on \the [src], making it violently spark!", "\The [src] sparks!")
|
||||
src.add_fingerprint(user)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
else
|
||||
src.visible_message("[user] presses the door bell on \the [src].", "\The [src]'s bell rings.")
|
||||
src.add_fingerprint(user)
|
||||
if(icon_state == "door_closed")
|
||||
flick("door_deny", src)
|
||||
playsound(src, knock_sound, 50, 0, 3)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#define RADIATION_DAMAGE 0x20
|
||||
#define TOXIN_DAMAGE 0x40
|
||||
#define OXY_DAMAGE 0x80
|
||||
#define HUSKED_BODY 0x100
|
||||
|
||||
/obj/machinery/medical_kiosk
|
||||
name = "medical kiosk"
|
||||
@@ -76,14 +77,14 @@
|
||||
if(!choice || choice == "Cancel" || !Adjacent(user) || inoperable() || panel_open)
|
||||
suspend()
|
||||
return
|
||||
|
||||
|
||||
// Service begins, delay
|
||||
visible_message("<b>\The [src]</b> scans [user] thoroughly!")
|
||||
flick("kiosk_active", src)
|
||||
if(!do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) || inoperable())
|
||||
suspend()
|
||||
return
|
||||
|
||||
|
||||
// Service completes
|
||||
switch(choice)
|
||||
if("Health Scan")
|
||||
@@ -95,7 +96,7 @@
|
||||
else
|
||||
var/scan_report = do_backup_scan(user)
|
||||
to_chat(user, "<span class='notice'><b>Backup scan results:</b></span>"+scan_report)
|
||||
|
||||
|
||||
// Standby
|
||||
suspend()
|
||||
|
||||
@@ -104,7 +105,7 @@
|
||||
return "<br><span class='warning'>Unable to perform diagnosis on this type of life form.</span>"
|
||||
if(user.isSynthetic())
|
||||
return "<br><span class='warning'>Unable to perform diagnosis on synthetic life forms.</span>"
|
||||
|
||||
|
||||
var/problems = 0
|
||||
for(var/obj/item/organ/external/E in user)
|
||||
if(E.status & ORGAN_BROKEN)
|
||||
@@ -119,13 +120,16 @@
|
||||
problems |= INTERNAL_BLEEDING
|
||||
else
|
||||
problems |= EXTERNAL_BLEEDING
|
||||
|
||||
|
||||
for(var/obj/item/organ/internal/I in user)
|
||||
if(I.status & (ORGAN_BROKEN|ORGAN_DEAD|ORGAN_DESTROYED))
|
||||
problems |= SERIOUS_INTERNAL_DAMAGE
|
||||
if(I.status & ORGAN_BLEEDING)
|
||||
problems |= INTERNAL_BLEEDING
|
||||
|
||||
|
||||
if(HUSK in user.mutations)
|
||||
problems |= HUSKED_BODY
|
||||
|
||||
if(user.getToxLoss() > 0)
|
||||
problems |= TOXIN_DAMAGE
|
||||
if(user.getOxyLoss() > 0)
|
||||
@@ -134,13 +138,13 @@
|
||||
problems |= RADIATION_DAMAGE
|
||||
if(user.getFireLoss() > 40 || user.getBruteLoss() > 40)
|
||||
problems |= SERIOUS_EXTERNAL_DAMAGE
|
||||
|
||||
|
||||
if(!problems)
|
||||
if(user.getHalLoss() > 0)
|
||||
return "<br><span class='warning'>Mild concussion detected - advising bed rest until patient feels well. No other anatomical issues detected.</span>"
|
||||
else
|
||||
return "<br><span class='notice'>No anatomical issues detected.</span>"
|
||||
|
||||
|
||||
var/problem_text = ""
|
||||
if(problems & BROKEN_BONES)
|
||||
problem_text += "<br><span class='warning'>Broken bones detected - see a medical professional and move as little as possible.</span>"
|
||||
@@ -158,6 +162,8 @@
|
||||
problem_text += "<br><span class='warning'>Exposure to toxic materials detected - induce vomiting if you have consumed anything recently.</span>"
|
||||
if(problems & OXY_DAMAGE)
|
||||
problem_text += "<br><span class='warning'>Blood/air perfusion level is below acceptable norms - use concentrated oxygen if necessary.</span>"
|
||||
if(problems & HUSKED_BODY)
|
||||
problem_text += "<br><span class='danger'>Anatomical structure lost, resuscitation not possible!</span>"
|
||||
|
||||
return problem_text
|
||||
|
||||
@@ -166,11 +172,11 @@
|
||||
return "<br><span class='warning'>Unable to perform full scan. Please see a medical professional.</span>"
|
||||
if(!user.mind)
|
||||
return "<br><span class='warning'>Unable to perform full scan. Please see a medical professional.</span>"
|
||||
|
||||
|
||||
var/nif = user.nif
|
||||
if(nif)
|
||||
persist_nif_data(user)
|
||||
|
||||
|
||||
our_db.m_backup(user.mind,nif,one_time = TRUE)
|
||||
var/datum/transhuman/body_record/BR = new()
|
||||
BR.init_from_mob(user, TRUE, TRUE, database_key = db_key)
|
||||
@@ -184,4 +190,5 @@
|
||||
#undef SERIOUS_INTERNAL_DAMAGE
|
||||
#undef RADIATION_DAMAGE
|
||||
#undef TOXIN_DAMAGE
|
||||
#undef OXY_DAMAGE
|
||||
#undef OXY_DAMAGE
|
||||
#undef HUSKED_BODY
|
||||
|
||||
@@ -189,6 +189,16 @@
|
||||
if("set_matrix_color")
|
||||
color_matrix_last[params["color"]] = params["value"]
|
||||
return TRUE
|
||||
if("set_matrix_string")
|
||||
if(params["value"])
|
||||
var/list/colours = splittext(params["value"], ",")
|
||||
if(colours.len > 12)
|
||||
colours.Cut(13)
|
||||
for(var/i = 1, i <= colours.len, i++)
|
||||
var/number = text2num(colours[i])
|
||||
if(isnum(number))
|
||||
color_matrix_last[i] = clamp(number, -10, 10)
|
||||
return TRUE
|
||||
if("set_hue")
|
||||
build_hue = clamp(text2num(params["buildhue"]), 0, 360)
|
||||
return TRUE
|
||||
|
||||
@@ -244,6 +244,8 @@
|
||||
severity = "Mild"
|
||||
if(severity)
|
||||
dat += "<span class='warning'>[severity] inflammation detected in subject [a.name].</span><br>"
|
||||
if(HUSK in H.mutations)
|
||||
dat += "<span class='danger'>Anatomical structure lost, resuscitation not possible!</span><br>"
|
||||
// Infections, fractures, and IB
|
||||
var/basic_fracture = 0 // If it's a basic scanner
|
||||
var/basic_ib = 0 // If it's a basic scanner
|
||||
|
||||
@@ -269,6 +269,11 @@ AI MODULES
|
||||
desc = "A 'reset' AI module: 'Clears all, except the inherent, laws.'"
|
||||
origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4)
|
||||
|
||||
// VOREstation edit: use map default laws
|
||||
/obj/item/weapon/aiModule/reset/Initialize()
|
||||
. = ..()
|
||||
laws = new global.using_map.default_law_type // Pull from loaded map
|
||||
|
||||
/obj/item/weapon/aiModule/reset/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
|
||||
log_law_changes(target, sender)
|
||||
|
||||
|
||||
@@ -244,7 +244,11 @@
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/cell/device,
|
||||
/obj/item/weapon/extinguisher/mini,
|
||||
/obj/item/weapon/storage/quickdraw/syringe_case
|
||||
/obj/item/device/antibody_scanner, // VOREstation edit start
|
||||
/obj/item/device/sleevemate,
|
||||
/obj/item/device/mass_spectrometer,
|
||||
/obj/item/weapon/surgical,
|
||||
/obj/item/clothing/mask/chewable/candy/lolli // VOREstation edit end
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/belt/medical/emt
|
||||
|
||||
@@ -69,6 +69,14 @@
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
/obj/structure/closet/crate/MouseDrop_T(mob/target, mob/user)
|
||||
// Adds climbing from drag, You can't put yourself in crates with a drag anyway... Nore anyone else actually.
|
||||
var/mob/living/H = user
|
||||
if(istype(H) && can_climb(H) && target == user)
|
||||
do_climb(target)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/crate/verb/rotate_clockwise()
|
||||
set name = "Rotate Crate Clockwise"
|
||||
set category = "Object"
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
/datum/preferences
|
||||
var/resleeve_lock = 0 // Whether movs should have OOC reslieving protection. Default false.
|
||||
var/resleeve_scan = 1 // Whether mob should start with a pre-spawn body scan. Default true.
|
||||
var/mind_scan = 1 // Whether mob should start with a pre-spawn mind scan. Default true.
|
||||
|
||||
// Definition of the stuff for Sizing
|
||||
/datum/category_item/player_setup_item/vore/resleeve
|
||||
@@ -11,15 +12,18 @@
|
||||
/datum/category_item/player_setup_item/vore/resleeve/load_character(var/savefile/S)
|
||||
S["resleeve_lock"] >> pref.resleeve_lock
|
||||
S["resleeve_scan"] >> pref.resleeve_scan
|
||||
S["mind_scan"] >> pref.mind_scan
|
||||
|
||||
|
||||
/datum/category_item/player_setup_item/vore/resleeve/save_character(var/savefile/S)
|
||||
S["resleeve_lock"] << pref.resleeve_lock
|
||||
S["resleeve_scan"] << pref.resleeve_scan
|
||||
S["mind_scan"] << pref.mind_scan
|
||||
|
||||
/datum/category_item/player_setup_item/vore/resleeve/sanitize_character()
|
||||
pref.resleeve_lock = sanitize_integer(pref.resleeve_lock, 0, 1, initial(pref.resleeve_lock))
|
||||
pref.resleeve_scan = sanitize_integer(pref.resleeve_scan, 0, 1, initial(pref.resleeve_scan))
|
||||
pref.mind_scan = sanitize_integer(pref.mind_scan, 0, 1, initial(pref.mind_scan))
|
||||
|
||||
/datum/category_item/player_setup_item/vore/resleeve/copy_to_mob(var/mob/living/carbon/human/character)
|
||||
if(character && !istype(character,/mob/living/carbon/human/dummy))
|
||||
@@ -29,6 +33,10 @@
|
||||
if(pref.resleeve_scan)
|
||||
var/datum/transhuman/body_record/BR = new()
|
||||
BR.init_from_mob(character, pref.resleeve_scan, pref.resleeve_lock)
|
||||
if(pref.mind_scan)
|
||||
var/datum/transcore_db/our_db = SStranscore.db_by_key(null)
|
||||
if(our_db)
|
||||
our_db.m_backup(character.mind,character.nif,one_time = TRUE)
|
||||
if(pref.resleeve_lock)
|
||||
character.resleeve_lock = character.ckey
|
||||
character.original_player = character.ckey
|
||||
@@ -36,6 +44,7 @@
|
||||
/datum/category_item/player_setup_item/vore/resleeve/content(var/mob/user)
|
||||
. += "<br>"
|
||||
. += "<b>Start With Body Scan:</b> <a [pref.resleeve_scan ? "class='linkOn'" : ""] href='?src=\ref[src];toggle_resleeve_scan=1'><b>[pref.resleeve_scan ? "Yes" : "No"]</b></a><br>"
|
||||
. += "<b>Start With Mind Scan:</b> <a [pref.mind_scan ? "class='linkOn'" : ""] href='?src=\ref[src];toggle_mind_scan=1'><b>[pref.mind_scan ? "Yes" : "No"]</b></a><br>"
|
||||
. += "<b>Prevent Body Impersonation:</b> <a [pref.resleeve_lock ? "class='linkOn'" : ""] href='?src=\ref[src];toggle_resleeve_lock=1'><b>[pref.resleeve_lock ? "Yes" : "No"]</b></a><br>"
|
||||
|
||||
/datum/category_item/player_setup_item/vore/resleeve/OnTopic(var/href, var/list/href_list, var/mob/user)
|
||||
@@ -45,4 +54,7 @@
|
||||
else if(href_list["toggle_resleeve_scan"])
|
||||
pref.resleeve_scan = pref.resleeve_scan ? 0 : 1;
|
||||
return TOPIC_REFRESH
|
||||
else if(href_list["toggle_mind_scan"])
|
||||
pref.mind_scan = pref.mind_scan ? 0 : 1;
|
||||
return TOPIC_REFRESH
|
||||
return ..();
|
||||
|
||||
@@ -1334,6 +1334,11 @@
|
||||
/mob/living/verb/mob_sleep()
|
||||
set name = "Sleep"
|
||||
set category = "IC"
|
||||
|
||||
if(istype(src, /mob/living/simple_mob))
|
||||
to_chat(src, SPAN_NOTICE("Sleeping is currently disabled on simple mobs due to a bug."))
|
||||
return
|
||||
|
||||
if(!toggled_sleeping && alert(src, "Are you sure you wish to go to sleep? You will snooze until you use the Sleep verb again.", "Sleepy Time", "No", "Yes") == "No")
|
||||
return
|
||||
toggled_sleeping = !toggled_sleeping
|
||||
|
||||
@@ -236,7 +236,7 @@
|
||||
|
||||
/mob/living/silicon/robot/proc/init()
|
||||
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
|
||||
laws = new /datum/ai_laws/nanotrasen()
|
||||
laws = new global.using_map.default_law_type // VOREstation edit: use map's default
|
||||
additional_law_channels["Binary"] = "#b"
|
||||
var/new_ai = select_active_ai_with_fewest_borgs()
|
||||
if(new_ai)
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
B.desc = "The moment the wolf gets its jaws around you, it scoops you right up off of the ground, and greedily scarfs you down with a few swift gulps. Your small frame alone is hardly enough to make him look somewhat plump as you slop wetly into that dark, hot chamber, although the dense squish is rather comfortable. The thick, humid air is tinged with the smell of digested meat, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder."
|
||||
B.vore_sound = "Tauric Swallow"
|
||||
B.release_sound = "Pred Escape"
|
||||
B.mode_flags = list(DM_FLAG_NUMBING, DM_FLAG_THICKBELLY, DM_FLAG_AFFECTWORN)
|
||||
B.mode_flags = DM_FLAG_NUMBING | DM_FLAG_THICKBELLY | DM_FLAG_AFFECTWORN
|
||||
B.fancy_vore = 1
|
||||
B.vore_verb = "slurp"
|
||||
B.contamination_color = "grey"
|
||||
|
||||
@@ -3730,3 +3730,9 @@ shaved
|
||||
icon_state = "Voxscales"
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
body_parts = list(BP_R_ARM,BP_L_ARM,BP_R_HAND,BP_L_HAND,BP_R_LEG,BP_L_LEG,BP_R_FOOT,BP_L_FOOT)
|
||||
|
||||
/datum/sprite_accessory/marking/vox/dinomuzzle
|
||||
name = "Vox Dinosaur Muzzle"
|
||||
icon_state = "vox_muzzle"
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
body_parts = list(BP_HEAD)
|
||||
|
||||
@@ -491,7 +491,7 @@
|
||||
name = "Shaved"
|
||||
icon_state = "bald"
|
||||
gender = NEUTER
|
||||
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL, SPECIES_HANNER) //This needed to be manually defined, apparantly.
|
||||
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_VOX, SPECIES_LLEILL, SPECIES_HANNER) //This needed to be manually defined, apparantly.
|
||||
|
||||
/datum/sprite_accessory/facial_hair/neck_fluff
|
||||
name = "Neck Fluff"
|
||||
|
||||
@@ -377,6 +377,16 @@
|
||||
extra_overlay = "shadow_tricolor-1"
|
||||
extra_overlay2 = "shadow_tricolor-2"
|
||||
|
||||
/datum/sprite_accessory/wing/speckled_tricolor
|
||||
name = "large speckled leather wings, tricolor, sparkling"
|
||||
desc = ""
|
||||
// not ckey locked, just couldn't think of a better icon state name
|
||||
icon_state = "shadow_tricolor"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "shadow_tricolor-1"
|
||||
extra_overlay2 = "shadow_tricolor-2-sparkle"
|
||||
|
||||
// dino wings
|
||||
/datum/sprite_accessory/wing/pterodactyl_wings
|
||||
name = "pterodactyl wings"
|
||||
|
||||
@@ -456,6 +456,9 @@
|
||||
var/turf/simulated/S = T
|
||||
S.dirt = 0
|
||||
T.clean_blood()
|
||||
for(var/obj/effect/O in T)
|
||||
if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay))
|
||||
qdel(O)
|
||||
|
||||
for(var/mob/living/simple_mob/slime/M in T)
|
||||
M.adjustToxLoss(rand(5, 10))
|
||||
|
||||
@@ -156,6 +156,9 @@
|
||||
verbs += /obj/vehicle/train/engine/verb/stop_engine
|
||||
|
||||
/obj/vehicle/train/RunOver(var/mob/living/M)
|
||||
if(pulledby == M) // VOREstation edit: Don't destroy people pulling vehicles up stairs
|
||||
return
|
||||
|
||||
var/list/parts = list(BP_HEAD, BP_TORSO, BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM)
|
||||
|
||||
M.apply_effects(5, 5)
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.4 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 62 KiB |
@@ -10,7 +10,8 @@ export const BodyScannerMainAbnormalities = (props: { occupant: occupant }) => {
|
||||
occupant.blind ||
|
||||
occupant.colourblind ||
|
||||
occupant.nearsighted ||
|
||||
occupant.hasVirus;
|
||||
occupant.hasVirus ||
|
||||
occupant.husked;
|
||||
|
||||
hasAbnormalities =
|
||||
hasAbnormalities ||
|
||||
|
||||
@@ -43,6 +43,11 @@ export const abnormalities: (string | ((occupant: occupant) => string))[][] = [
|
||||
return 'Foreign Object(s) detected: ' + occupant.objectPrey;
|
||||
},
|
||||
],
|
||||
[
|
||||
'husked',
|
||||
'bad',
|
||||
(occupant) => 'Anatomical structure lost, resuscitation not possible!',
|
||||
],
|
||||
];
|
||||
|
||||
export const damages: string[][] = [
|
||||
|
||||
@@ -35,6 +35,7 @@ export type occupant = {
|
||||
humanPrey: number;
|
||||
objectPrey: number;
|
||||
weight: number;
|
||||
husked: BooleanLike;
|
||||
};
|
||||
|
||||
type reagent = { name: string; amount: number; overdose: BooleanLike };
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
import { toFixed } from 'common/math';
|
||||
|
||||
import { useBackend } from '../../backend';
|
||||
import { Icon, NumberInput, Table } from '../../components';
|
||||
import {
|
||||
Box,
|
||||
Icon,
|
||||
Input,
|
||||
LabeledList,
|
||||
NumberInput,
|
||||
Table,
|
||||
} from '../../components';
|
||||
import { Data } from './types';
|
||||
|
||||
export const ColorMateMatrix = (props) => {
|
||||
@@ -10,226 +17,241 @@ export const ColorMateMatrix = (props) => {
|
||||
const { matrixcolors } = data;
|
||||
|
||||
return (
|
||||
<Table>
|
||||
<Table.Cell>
|
||||
<Table.Row>
|
||||
RR:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.rr}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 1,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
GR:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.gr}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 4,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
BR:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.br}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 7,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
</Table.Cell>
|
||||
<Table.Cell>
|
||||
<Table.Row>
|
||||
RG:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.rg}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 2,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
GG:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.gg}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 5,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
BG:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.bg}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 8,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
</Table.Cell>
|
||||
<Table.Cell>
|
||||
<Table.Row>
|
||||
RB:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.rb}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 3,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
GB:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.gb}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 6,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
BB:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.bb}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 9,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
</Table.Cell>
|
||||
<Table.Cell>
|
||||
<Table.Row>
|
||||
CR:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.cr}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 10,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
CG:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.cg}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 11,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
CB:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.cb}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 12,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
</Table.Cell>
|
||||
<Table.Cell width="40%">
|
||||
<Icon name="question-circle" color="blue" /> RG means red will become
|
||||
this much green.
|
||||
<br />
|
||||
<Icon name="question-circle" color="blue" /> CR means this much red will
|
||||
be added.
|
||||
</Table.Cell>
|
||||
</Table>
|
||||
<>
|
||||
<Table>
|
||||
<Table.Cell>
|
||||
<Table.Row>
|
||||
RR:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.rr}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 1,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
GR:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.gr}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 4,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
BR:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.br}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 7,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
</Table.Cell>
|
||||
<Table.Cell>
|
||||
<Table.Row>
|
||||
RG:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.rg}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 2,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
GG:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.gg}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 5,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
BG:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.bg}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 8,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
</Table.Cell>
|
||||
<Table.Cell>
|
||||
<Table.Row>
|
||||
RB:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.rb}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 3,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
GB:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.gb}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 6,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
BB:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.bb}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 9,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
</Table.Cell>
|
||||
<Table.Cell>
|
||||
<Table.Row>
|
||||
CR:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.cr}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 10,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
CG:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.cg}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 11,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
<Table.Row>
|
||||
CB:
|
||||
<NumberInput
|
||||
width="50px"
|
||||
minValue={-10}
|
||||
maxValue={10}
|
||||
step={0.01}
|
||||
value={matrixcolors.cb}
|
||||
format={(value: number) => toFixed(value, 2)}
|
||||
onChange={(value: number) =>
|
||||
act('set_matrix_color', {
|
||||
color: 12,
|
||||
value,
|
||||
})
|
||||
}
|
||||
/>
|
||||
</Table.Row>
|
||||
</Table.Cell>
|
||||
<Table.Cell width="40%">
|
||||
<Icon name="question-circle" color="blue" /> RG means red will become
|
||||
this much green.
|
||||
<br />
|
||||
<Icon name="question-circle" color="blue" /> CR means this much red
|
||||
will be added.
|
||||
</Table.Cell>
|
||||
</Table>
|
||||
<Box mt={3}>
|
||||
<LabeledList>
|
||||
<LabeledList.Item label="Config">
|
||||
<Input
|
||||
fluid
|
||||
value={Object.values(matrixcolors).toString()}
|
||||
onChange={(e, value: string) =>
|
||||
act('set_matrix_string', { value })
|
||||
}
|
||||
/>
|
||||
</LabeledList.Item>
|
||||
</LabeledList>
|
||||
</Box>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
-1
@@ -4343,6 +4343,6 @@
|
||||
#include "maps\submaps\space_submaps\debrisfield\debrisfield.dm"
|
||||
#include "maps\submaps\surface_submaps\wilderness\wilderness.dm"
|
||||
#include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm"
|
||||
#include "maps\tether\tether.dm"
|
||||
#include "maps\groundbase\groundbase.dm"
|
||||
#include "maps\~map_system\maps.dm"
|
||||
// END_INCLUDE
|
||||
|
||||
Reference in New Issue
Block a user