diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 2797c8c904..bcd85b53be 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -192,3 +192,10 @@ #define NOMUT 0 #define COLORMUT 1 #define SPECIESMUT 2 + +//carbon taste sensitivity defines, used in mob/living/carbon/proc/ingest +#define TASTE_HYPERSENSITIVE 3 //anything below 5% +#define TASTE_SENSITIVE 2 //anything below 7% +#define TASTE_NORMAL 1 //anything below 15% +#define TASTE_DULL 0.5 //anything below 30% +#define TASTE_NUMB 0.1 //anything below 150% \ No newline at end of file diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 44273c80ff..957a690f4f 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -33,11 +33,14 @@ #define LANGUAGE_SKRELLIAN "Skrellian" #define LANGUAGE_TRADEBAND "Tradeband" #define LANGUAGE_GUTTER "Gutter" +#define LANGUAGE_SIGN "Sign Language" #define LANGUAGE_SCHECHI "Schechi" #define LANGUAGE_ROOTLOCAL "Local Rootspeak" #define LANGUAGE_ROOTGLOBAL "Global Rootspeak" #define LANGUAGE_CULT "Cult" -#define LANGUAGE_SIGN "Sign Language" +#define LANGUAGE_OCCULT "Occult" +#define LANGUAGE_CHANGELING "Changeling" +#define LANGUAGE_VOX "Vox-Pidgin" // Language flags. #define WHITELISTED 1 // Language is available if the speaker is whitelisted. diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 627bd27e7b..5ecc707227 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -573,7 +573,7 @@ name = "subspace wavelength analyzer" icon_state = "wavelength_analyzer" desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths." - origin_tech = list(TECH_DATA = 3, TECH_MAGNETS = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + origin_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10) /obj/item/weapon/stock_parts/subspace/crystal diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm index d149012c75..ae77e8f216 100644 --- a/code/game/antagonist/outsider/raider.dm +++ b/code/game/antagonist/outsider/raider.dm @@ -308,7 +308,7 @@ var/datum/antagonist/raider/raiders player.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(player), slot_shoes) // REPLACE THESE WITH CODED VOX ALTERNATIVES. player.equip_to_slot_or_del(new /obj/item/clothing/gloves/vox(player), slot_gloves) // AS ABOVE. player.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat/vox(player), slot_wear_mask) - player.equip_to_slot_or_del(new /obj/item/weapon/tank/phoron/vox(player), slot_back) + player.equip_to_slot_or_del(new /obj/item/weapon/tank/vox(player), slot_back) player.equip_to_slot_or_del(new /obj/item/device/flashlight(player), slot_r_store) player.internal = locate(/obj/item/weapon/tank) in player.contents diff --git a/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm b/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm index 9c18e774ed..a4761c847a 100644 --- a/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm +++ b/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm @@ -47,7 +47,7 @@ ..() /obj/item/clothing/gloves/regen/process() - if(!wearer || wearer.isSynthetic() || wearer.stat == DEAD || wearer.nutrition >= 10) + if(!wearer || wearer.isSynthetic() || wearer.stat == DEAD || wearer.nutrition <= 10) return // Robots and dead people don't have a metabolism. if(wearer.getBruteLoss()) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index f9bbeb8f33..c354d65576 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -14,8 +14,12 @@ return check_access(id) return 0 -/obj/item/proc/GetAccess() - return list() +///obj/item/proc/GetAccess() +// return list() + +/atom/movable/proc/GetAccess() + var/obj/item/weapon/card/id/id = GetIdCard() + return id ? id.GetAccess() : list() /obj/proc/GetID() return null @@ -197,7 +201,7 @@ "Emergency Response Team", "Emergency Response Team Leader") -/mob/proc/GetIdCard() +/atom/movable/proc/GetIdCard() return null /mob/living/bot/GetIdCard() diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 13168e19f4..4349752370 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -8,7 +8,7 @@ obj/machinery/recharger idle_power_usage = 4 active_power_usage = 40000 //40 kW var/obj/item/charging = null - var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell, /obj/item/device/flashlight) + var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly) var/icon_state_charged = "recharger2" var/icon_state_charging = "recharger1" var/icon_state_idle = "recharger0" //also when unpowered @@ -60,6 +60,11 @@ obj/machinery/recharger if(!L.stored_computer.battery) user << "There's no battery in it!" return + if(istype(G, /obj/item/device/electronic_assembly)) + var/obj/item/device/electronic_assembly/assembly = G + if(!assembly.battery) + to_chat(user, "The assembly doesn't have a power cell.") + return user.drop_item() G.loc = src charging = G @@ -161,6 +166,21 @@ obj/machinery/recharger update_use_power(1) return + if(istype(charging, /obj/item/device/electronic_assembly)) + var/obj/item/device/electronic_assembly/assembly = charging + if(assembly.battery) + if(!assembly.battery.fully_charged()) + icon_state = icon_state_charging + assembly.battery.give(active_power_usage*CELLRATE) + update_use_power(2) + else + icon_state = icon_state_charged + update_use_power(1) + else + icon_state = icon_state_idle + update_use_power(1) + return + /obj/machinery/recharger/emp_act(severity) if(stat & (NOPOWER|BROKEN) || !anchored) ..(severity) diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 6d91733c7b..6c2b6aa885 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -100,14 +100,21 @@ src.loc = F return -/obj/item/weapon/tank/phoron/vox +/obj/item/weapon/tank/vox //Can't be a child of phoron or the gas amount gets screwey. name = "phoron tank" desc = "Contains dangerous phoron. Do not inhale. Warning: extremely flammable." icon_state = "oxygen_fr" gauge_icon = null flags = CONDUCT + distribute_pressure = ONE_ATMOSPHERE*O2STANDARD slot_flags = SLOT_BACK //these ones have straps! +/obj/item/weapon/tank/vox/New() + ..() + + air_contents.adjust_gas("phoron", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + return + /* * Emergency Oxygen */ diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 58fa8ed5f2..6aea41942f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -127,6 +127,7 @@ new /obj/item/clothing/head/beret/sec/corporate/hos(src) new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src) new /obj/item/device/flashlight/maglight(src) + new /obj/item/clothing/mask/gas/half(src) return @@ -173,6 +174,7 @@ new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src) new /obj/item/device/flashlight/maglight(src) new /obj/item/device/megaphone(src) + new /obj/item/clothing/mask/gas/half(src) return diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 2083d3a354..1136c6cfeb 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -535,6 +535,7 @@ new /obj/item/clothing/under/pants/black(src) new /obj/item/clothing/under/pants/tan(src) new /obj/item/clothing/under/pants/track(src) + new /obj/item/clothing/suit/storage/toggle/track(src) new /obj/item/clothing/under/pants(src) new /obj/item/clothing/under/pants/khaki(src) new /obj/item/clothing/mask/bandana/blue(src) diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 05f2299962..54aa955839 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -147,8 +147,8 @@ slip_stun = 4 slip_dist = 2 - if(M.slip("the [floor_type] floor",slip_stun)) - for(var/i = 0;i") + text = replacetext(text, "\[center\]", "
") + text = replacetext(text, "\[/center\]", "
") + text = replacetext(text, "\[br\]", "
") + text = replacetext(text, "\[b\]", "") + text = replacetext(text, "\[/b\]", "") + text = replacetext(text, "\[i\]", "") + text = replacetext(text, "\[/i\]", "") + text = replacetext(text, "\[u\]", "") + text = replacetext(text, "\[/u\]", "") + text = replacetext(text, "\[large\]", "") + text = replacetext(text, "\[/large\]", "") + text = replacetext(text, "\[h1\]", "

") + text = replacetext(text, "\[/h1\]", "

") + text = replacetext(text, "\[h2\]", "

") + text = replacetext(text, "\[/h2\]", "

") + text = replacetext(text, "\[h3\]", "

") + text = replacetext(text, "\[/h3\]", "

") + + text = replacetext(text, "\[*\]", "
  • ") + text = replacetext(text, "\[hr\]", "
    ") + text = replacetext(text, "\[small\]", "") + text = replacetext(text, "\[/small\]", "") + text = replacetext(text, "\[list\]", "") + text = replacetext(text, "\[table\]", "") + text = replacetext(text, "\[/table\]", "
    ") + text = replacetext(text, "\[grid\]", "") + text = replacetext(text, "\[/grid\]", "
    ") + text = replacetext(text, "\[row\]", "") + text = replacetext(text, "\[cell\]", "") + text = replacetext(text, "\[logo\]", "") // Not sure if these would get used but why not + text = replacetext(text, "\[sglogo\]", "") + return text + +// This is used when reading text that went through paper_markup2html(), to reverse it so that edits don't need to replace everything once more to avoid sanitization. +/proc/html2paper_markup(var/text) + text = replacetext(text, "
    ", "\[br\]") + text = replacetext(text, "
    ", "\[center\]") + text = replacetext(text, "
    ", "\[/center\]") + text = replacetext(text, "
    ", "\[br\]") + text = replacetext(text, "", "\[b\]") + text = replacetext(text, "", "\[/b\]") + text = replacetext(text, "", "\[i\]") + text = replacetext(text, "", "\[/i\]") + text = replacetext(text, "", "\[u\]") + text = replacetext(text, "", "\[/u\]") + text = replacetext(text, "", "\[large\]") + text = replacetext(text, "", "\[/large\]") + text = replacetext(text, "

    ", "\[h1\]") + text = replacetext(text, "

    ", "\[/h1\]") + text = replacetext(text, "

    ", "\[h2\]") + text = replacetext(text, "

    ", "\[/h2\]") + text = replacetext(text, "

    ", "\[h3\]") + text = replacetext(text, "

    ", "\[/h3\]") + + text = replacetext(text, "
  • ", "\[*\]") + text = replacetext(text, "
    ", "\[hr\]") + text = replacetext(text, "", "\[small\]") + text = replacetext(text, "", "\[/small\]") + text = replacetext(text, "", "\[/list\]") + text = replacetext(text, "", "\[table\]") + text = replacetext(text, "
    ", "\[/table\]") + text = replacetext(text, "", "\[grid\]") + text = replacetext(text, "
    ", "\[/grid\]") + text = replacetext(text, "", "\[row\]") + text = replacetext(text, "", "\[cell\]") + text = replacetext(text, "", "\[logo\]") // Not sure if these would get used but why not + text = replacetext(text, "", "\[sglogo\]") + return text #undef NEWSFILE \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm index 5909b0eb2e..533cf88a51 100644 --- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm @@ -42,15 +42,13 @@ display_name = "Security HUD, sunglasses (Security)" path = /obj/item/clothing/glasses/sunglasses/sechud -/datum/gear/eyes/secaviators - display_name = "Security HUD Aviators" +/datum/gear/eyes/security/aviator + display_name = "Security HUD Aviators (Security)" path = /obj/item/clothing/glasses/sunglasses/sechud/aviator - allowed_roles = list("Security Officer","Head of Security","Warden") -/datum/gear/eyes/secaviators/prescription - display_name = "Security HUD Aviators, prescription" +/datum/gear/eyes/security/aviator/prescription + display_name = "Security HUD Aviators, prescription (Security)" path = /obj/item/clothing/glasses/sunglasses/sechud/aviator/prescription - allowed_roles = list("Security Officer","Head of Security","Warden") /datum/gear/eyes/medical display_name = "Medical HUD (Medical)" @@ -61,10 +59,32 @@ display_name = "Medical HUD, prescription (Medical)" path = /obj/item/clothing/glasses/hud/health/prescription -/datum/gear/eyes/shades - display_name = "Sunglasses, fat (Security/Command)" - path = /obj/item/clothing/glasses/sunglasses/big - allowed_roles = list("Security Officer","Head of Security","Warden","Colony Director","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective") +/datum/gear/eyes/medical/aviator + display_name = "Medical HUD Aviators (Medical)" + path = /obj/item/clothing/glasses/sunglasses/medhud/aviator + +/datum/gear/eyes/medical/aviator + display_name = "Medical HUD Aviators, prescription (Medical)" + path = /obj/item/clothing/glasses/sunglasses/medhud/aviator/prescription + +/datum/gear/eyes/meson + display_name = "Optical Meson Scanners (Engineering)" + path = /obj/item/clothing/glasses/meson + allowed_roles = list("Station Engineer","Chief Engineer","Atmospheric Technician") + +/datum/gear/eyes/meson/prescription + display_name = "Optical Meson Scanners, prescription (Engineering)" + path = /obj/item/clothing/glasses/meson/prescription + +/datum/gear/eyes/meson/aviator + display_name = "Optical Meson Aviators, (Engineering)" + path = /obj/item/clothing/glasses/meson/aviator + +/datum/gear/eyes/meson/aviator/prescription + display_name = "Optical Meson Aviators, prescription (Engineering)" + path = /obj/item/clothing/glasses/meson/aviator/prescription + +/datum/gear/eyes/meson/aviator/prescription /datum/gear/eyes/glasses/fakesun display_name = "Sunglasses, stylish" @@ -74,7 +94,16 @@ display_name = "Sunglasses, stylish aviators" path = /obj/item/clothing/glasses/fakesunglasses/aviator -/datum/gear/eyes/shades/prescriptionsun +/datum/gear/eyes/sun + display_name = "Sunglasses (Security/Command)" + path = /obj/item/clothing/glasses/sunglasses + allowed_roles = list("Security Officer","Head of Security","Warden","Colony Director","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective") + +/datum/gear/eyes/sun/shades + display_name = "Sunglasses, fat (Security/Command)" + path = /obj/item/clothing/glasses/sunglasses/big + +/datum/gear/eyes/sun/prescriptionsun display_name = "sunglasses, presciption (Security/Command)" path = /obj/item/clothing/glasses/sunglasses/prescription cost = 2 diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 4b04dd0046..710c072e94 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1,4 +1,4 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 +#define SAVE_RESET -1 var/list/preferences_datums = list() @@ -199,7 +199,8 @@ datum/preferences dat += "Slot - " dat += "Load slot - " dat += "Save slot - " - dat += "Reload slot" + dat += "Reload slot - " + dat += "Reset slot" else dat += "Please create an account to save your preferences." @@ -248,6 +249,11 @@ datum/preferences load_character(text2num(href_list["changeslot"])) sanitize_preferences() close_load_dialog(usr) + else if(href_list["resetslot"]) + if("No" == alert("This will reset the current slot. Continue?", "Reset current slot?", "No", "Yes")) + return 0 + load_character(SAVE_RESET) + sanitize_preferences() else return 0 diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index d3fad955d6..22eab43de5 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -67,11 +67,20 @@ if(!S) return 0 S.cd = "/" if(!slot) slot = default_slot - slot = sanitize_integer(slot, 1, config.character_slots, initial(default_slot)) - if(slot != default_slot) - default_slot = slot - S["default_slot"] << slot - S.cd = "/character[slot]" + if(slot != SAVE_RESET) // SAVE_RESET will reset the slot as though it does not exist, but keep the current slot for saving purposes. + slot = sanitize_integer(slot, 1, config.character_slots, initial(default_slot)) + if(slot != default_slot) + default_slot = slot + S["default_slot"] << slot + else + S["default_slot"] << default_slot + + if(slot != SAVE_RESET) + S.cd = "/character[slot]" + player_setup.load_character(S) + else + player_setup.load_character(S) + S.cd = "/character[default_slot]" player_setup.load_character(S) return 1 diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 0208574e5b..53678c13e4 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -69,6 +69,19 @@ BLIND // can't see anything desc = "Optical Meson Scanner with prescription lenses." prescription = 1 +/obj/item/clothing/glasses/meson/aviator + name = "Engineering Aviators" + icon_state = "aviator_eng" + off_state = "aviator" + item_state_slots = list(slot_r_hand_str = "sunglasses", slot_l_hand_str = "sunglasses") + action_button_name = "Toggle HUD" + activation_sound = 'sound/effects/pop.ogg' + +/obj/item/clothing/glasses/meson/aviator/prescription + name = "Prescription Engineering Aviators" + desc = "Engineering Aviators with prescription lenses." + prescription = 1 + /obj/item/clothing/glasses/science name = "Science Goggles" desc = "The goggles do nothing!" @@ -242,20 +255,20 @@ BLIND // can't see anything icon_state = "bigsunglasses" /obj/item/clothing/glasses/fakesunglasses //Sunglasses without flash immunity - desc = "A pair of designer sunglasses. Doesn't seem like it'll block flashes." name = "stylish sunglasses" + desc = "A pair of designer sunglasses. Doesn't seem like it'll block flashes." icon_state = "sun" item_state_slots = list(slot_r_hand_str = "sunglasses", slot_l_hand_str = "sunglasses") /obj/item/clothing/glasses/fakesunglasses/aviator - desc = "A pair of designer sunglasses. Doesn't seem like it'll block flashes." name = "stylish aviators" - icon_state = "sec_flash" + desc = "A pair of designer sunglasses. Doesn't seem like it'll block flashes." + icon_state = "aviator" /obj/item/clothing/glasses/sunglasses/sechud name = "HUDSunglasses" desc = "Sunglasses with a HUD." - icon_state = "sunhud" + icon_state = "sunSecHud" var/obj/item/clothing/glasses/hud/security/hud = null New() @@ -269,10 +282,10 @@ BLIND // can't see anything icon_state = "swatgoggles" /obj/item/clothing/glasses/sunglasses/sechud/aviator - name = "HUD aviators" + name = "Security HUD aviators" desc = "Modified aviator glasses that can be switch between HUD and flash protection modes." - icon_state = "sec_hud" - off_state = "sec_flash" + icon_state = "aviator_sec" + off_state = "aviator" action_button_name = "Toggle Mode" var/on = 1 toggleable = 1 @@ -311,10 +324,68 @@ BLIND // can't see anything icon_state = off_state /obj/item/clothing/glasses/sunglasses/sechud/aviator/prescription - name = "Prescription HUD aviators" + name = "Prescription Security HUD aviators" desc = "Modified aviator glasses that can be switch between HUD and flash protection modes. Comes with bonus prescription lenses." prescription = 6 +/obj/item/clothing/glasses/sunglasses/medhud + name = "HUDSunglasses" + desc = "Sunglasses with a HUD." + icon_state = "sunMedHud" + var/obj/item/clothing/glasses/hud/health/hud = null + +/obj/item/clothing/glasses/sunglasses/medhud/New() + ..() + src.hud = new/obj/item/clothing/glasses/hud/health(src) + return + +/obj/item/clothing/glasses/sunglasses/medhud/aviator + name = "Medical HUD aviators" + desc = "Modified aviator glasses with a toggled health HUD." + icon_state = "aviator_med" + off_state = "aviator" + action_button_name = "Toggle Mode" + var/on = 1 + toggleable = 1 + activation_sound = 'sound/effects/pop.ogg' + + var/hud_holder + +/obj/item/clothing/glasses/sunglasses/medhud/aviator/New() + ..() + hud_holder = hud + +/obj/item/clothing/glasses/sunglasses/medhud/aviator/Destroy() + qdel(hud_holder) + hud_holder = null + hud = null + . = ..() + +/obj/item/clothing/glasses/sunglasses/medhud/aviator/attack_self(mob/user) + if(toggleable && !user.incapacitated()) + on = !on + if(on) + src.hud = hud_holder + to_chat(user, "You switch the [src] to HUD mode.") + else + src.hud = null + to_chat(user, "You switch \the [src] off.") + update_icon() + user << activation_sound + user.update_inv_glasses() + user.update_action_buttons() + +/obj/item/clothing/glasses/sunglasses/medhud/aviator/update_icon() + if(on) + icon_state = initial(icon_state) + else + icon_state = off_state + +/obj/item/clothing/glasses/sunglasses/medhud/aviator/prescription + name = "Prescription Medical HUD aviators" + desc = "Modified aviator glasses with a toggled health HUD. Comes with bonus prescription lenses." + prescription = 6 + /obj/item/clothing/glasses/thermal name = "Optical Thermal Scanner" desc = "Thermals in the shape of glasses." diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 09a1909392..4e17916853 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -92,4 +92,9 @@ siemens_coefficient = 0 phoronproof = 1 permeability_coefficient = 0.05 - species_restricted = list("Vox") \ No newline at end of file + species_restricted = list("Vox") + + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 57a50b4c09..63e4d93965 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -107,7 +107,6 @@ magpulse = 1 canremove = 0 //kinda hard to take off magclaws when you are gripping them tightly. to_chat(user, "You dig your claws deeply into the flooring, bracing yourself.") - to_chat(user, "It would be hard to take off the [src] without relaxing your grip first.") user.update_action_buttons() //In case they somehow come off while enabled. diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm index 7f28b34a9d..43a19c558f 100644 --- a/code/modules/clothing/spacesuits/alien.dm +++ b/code/modules/clothing/spacesuits/alien.dm @@ -33,17 +33,16 @@ w_class = ITEMSIZE_NORMAL item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | PHORONGUARD allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank) - slowdown = 1 phoronproof = 1 armor = list(melee = 60, bullet = 50, laser = 40,energy = 15, bomb = 30, bio = 30, rad = 30) - siemens_coefficient = 0.6 + siemens_coefficient = 0.2 heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE species_restricted = list("Vox") /obj/item/clothing/head/helmet/space/vox armor = list(melee = 60, bullet = 50, laser = 40, energy = 15, bomb = 30, bio = 30, rad = 30) - siemens_coefficient = 0.6 + siemens_coefficient = 0.2 item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT | PHORONGUARD flags_inv = 0 phoronproof = 1 diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm index 61fec573c1..d34739cad3 100644 --- a/code/modules/clothing/spacesuits/rig/suits/alien.dm +++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm @@ -47,9 +47,10 @@ icon_state = "vox_rig" armor = list(melee = 60, bullet = 50, laser = 40, energy = 15, bomb = 30, bio = 30, rad = 30) item_flags = THICKMATERIAL + siemens_coefficient = 0.2 phoronproof = 1 - air_type = /obj/item/weapon/tank/phoron/vox + air_type = /obj/item/weapon/tank/vox helm_type = /obj/item/clothing/head/helmet/space/rig/vox boot_type = /obj/item/clothing/shoes/magboots/rig/vox @@ -58,10 +59,15 @@ /obj/item/clothing/head/helmet/space/rig/vox species_restricted = list("Vox") + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE phoronproof = 1 /obj/item/clothing/shoes/magboots/rig/vox + name = "talons" species_restricted = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/shoes.dmi' + ) phoronproof = 1 /obj/item/clothing/suit/space/rig/vox @@ -69,14 +75,37 @@ phoronproof = 1 /obj/item/clothing/gloves/gauntlets/rig/vox - name = "talons" siemens_coefficient = 0 species_restricted = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/gloves.dmi' + ) phoronproof = 1 +/obj/item/weapon/rig/vox/carapace + name = "dense alien control module" + suit_type = "dense alien" + armor = list(melee = 60, bullet = 50, laser = 40, energy = 15, bomb = 30, bio = 30, rad = 30) + emp_protection = 40 //change this to 30 if too high. + phoronproof = 1 + + req_access = list(access_syndicate) + + cell_type = /obj/item/weapon/cell/hyper + + initial_modules = list( + /obj/item/rig_module/mounted/energy_blade, + /obj/item/rig_module/sprinter, + /obj/item/rig_module/electrowarfare_suite, + /obj/item/rig_module/vision, + /obj/item/rig_module/power_sink, + /obj/item/rig_module/self_destruct + ) + /obj/item/weapon/rig/vox/stealth name = "sinister alien control module" suit_type = "sinister alien" + icon_state = "voxstealth_rig" armor = list(melee = 40, bullet = 30, laser = 30, energy = 15, bomb = 30, bio = 100, rad = 100) emp_protection = 40 //change this to 30 if too high. slowdown = 0 @@ -88,6 +117,7 @@ initial_modules = list( /obj/item/rig_module/stealth_field, + /obj/item/rig_module/electrowarfare_suite, /obj/item/rig_module/vision, /obj/item/rig_module/power_sink, /obj/item/rig_module/self_destruct diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index b0c8838532..11dfbfb961 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -201,6 +201,7 @@ req_access = list(access_medical) initial_modules = list( + /obj/item/rig_module/sprinter, /obj/item/rig_module/chem_dispenser/injector, /obj/item/rig_module/maneuvering_jets, /obj/item/rig_module/device/healthscanner, diff --git a/code/modules/clothing/under/xenos/vox.dm b/code/modules/clothing/under/xenos/vox.dm index 9c1f3ce6b0..b29df92e8c 100644 --- a/code/modules/clothing/under/xenos/vox.dm +++ b/code/modules/clothing/under/xenos/vox.dm @@ -1,6 +1,8 @@ /obj/item/clothing/under/vox has_sensor = 0 species_restricted = list("Vox") + valid_accessory_slots = list("vox") + restricted_accessory_slots = list("vox") phoronproof = 1 /obj/item/clothing/under/vox/vox_casual @@ -14,4 +16,18 @@ name = "alien robes" desc = "Weird and flowing!" icon_state = "vox-casual-2" - item_state = "vox-casual-2" \ No newline at end of file + item_state = "vox-casual-2" + +//Vox Accessories +/obj/item/clothing/accessory/storage/vox + name = "alien mesh" + desc = "An alien mesh. Seems to be made up mostly of pockets and writhing flesh." + icon_state = "webbing-vox" + slot = "vox" + + slots = 5 + +/obj/item/clothing/accessory/storage/vox/New() + ..() + hold.max_storage_space = slots * ITEMSIZE_COST_NORMAL + hold.max_w_class = ITEMSIZE_NORMAL \ No newline at end of file diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 1a89c9c0a4..edc796594c 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -52,9 +52,13 @@ var/list/reagent_data = seed.chems[rid] if(reagent_data && reagent_data.len) var/rtotal = reagent_data[1] + var/list/data = list() if(reagent_data.len > 1 && potency > 0) rtotal += round(potency/reagent_data[2]) - reagents.add_reagent(rid,max(1,rtotal)) + if(rid == "nutriment") + data[seed.seed_name] = max(1,rtotal) + + reagents.add_reagent(rid,max(1,rtotal),data) update_desc() if(reagents.total_volume > 0) bitesize = 1+round(reagents.total_volume / 2, 1) diff --git a/code/modules/integrated_electronics/_defines.dm b/code/modules/integrated_electronics/_defines.dm index d9daa035d5..c404f61581 100644 --- a/code/modules/integrated_electronics/_defines.dm +++ b/code/modules/integrated_electronics/_defines.dm @@ -8,6 +8,13 @@ #define IC_SPAWN_DEFAULT 1 // If the circuit comes in the default circuit box. #define IC_SPAWN_RESEARCH 2 // If the circuit design will be autogenerated for RnD. +#define IC_FORMAT_STRING "\" +#define IC_FORMAT_NUMBER "\" +#define IC_FORMAT_REF "\" +#define IC_FORMAT_LIST "\" +#define IC_FORMAT_ANY "\" +#define IC_FORMAT_PULSE "\" + var/list/all_integrated_circuits = list() /proc/initialize_integrated_circuits_list() @@ -20,377 +27,19 @@ var/list/all_integrated_circuits = list() icon = 'icons/obj/electronic_assemblies.dmi' icon_state = "template" w_class = ITEMSIZE_TINY + var/obj/item/device/electronic_assembly/assembly = null // Reference to the assembly holding this circuit, if any. var/extended_desc = null var/list/inputs = list() var/list/outputs = list() var/list/activators = list() var/next_use = 0 //Uses world.time - var/complexity = 1 //This acts as a limitation on building machines, more resource-intensive components cost more 'space'. - var/cooldown_per_use = 1 SECOND - var/spawn_flags = null // Used for world initializing, see the #defines above. - var/category_text = "NO CATEGORY" // To show up on circuit printer, and perhaps other places. - var/autopulse = -1 // When input is received, the circuit will pulse itself if set to 1. 0 means it won't. -1 means it is permanently off. - -/obj/item/integrated_circuit/examine(mob/user) - ..() - to_chat(user, "This board has [inputs.len] input pin\s and [outputs.len] output pin\s.") - for(var/datum/integrated_io/input/I in inputs) - if(I.linked.len) - to_chat(user, "The [I] is connected to [I.get_linked_to_desc()].") - for(var/datum/integrated_io/output/O in outputs) - if(O.linked.len) - to_chat(user, "The [O] is connected to [O.get_linked_to_desc()].") - for(var/datum/integrated_io/activate/A in activators) - if(A.linked.len) - to_chat(user, "The [A] is connected to [A.get_linked_to_desc()].") - - interact(user) - -/obj/item/integrated_circuit/New() - setup_io(inputs, /datum/integrated_io/input) - setup_io(outputs, /datum/integrated_io/output) - setup_io(activators, /datum/integrated_io/activate) - ..() - -/obj/item/integrated_circuit/proc/setup_io(var/list/io_list, var/io_type) - var/list/io_list_copy = io_list.Copy() - io_list.Cut() - for(var/io_entry in io_list_copy) - io_list.Add(new io_type(src, io_entry, io_list_copy[io_entry])) - -/obj/item/integrated_circuit/proc/on_data_written() //Override this for special behaviour when new data gets pushed to the circuit. - return - -/obj/item/integrated_circuit/Destroy() - for(var/datum/integrated_io/I in inputs) - qdel(I) - for(var/datum/integrated_io/O in outputs) - qdel(O) - for(var/datum/integrated_io/A in activators) - qdel(A) - . = ..() - -/obj/item/integrated_circuit/nano_host() - if(istype(src.loc, /obj/item/device/electronic_assembly)) - var/obj/item/device/electronic_assembly/assembly = loc - return assembly.resolve_nano_host() - return ..() - -/obj/item/integrated_circuit/emp_act(severity) - for(var/datum/integrated_io/io in inputs + outputs + activators) - io.scramble() - -/obj/item/integrated_circuit/verb/rename_component() - set name = "Rename Circuit" - set category = "Object" - set desc = "Rename your circuit, useful to stay organized." - - var/mob/M = usr - if(!CanInteract(M, physical_state)) - return - - var/input = sanitizeSafe(input("What do you want to name the circuit?", "Rename", src.name) as null|text, MAX_NAME_LEN) - if(src && input && CanInteract(M, physical_state)) - to_chat(M, "The circuit '[src.name]' is now labeled '[input]'.") - name = input - -/obj/item/integrated_circuit/proc/get_pin_ref(var/pin_type, var/pin_number) - switch(pin_type) - if(IC_INPUT) - if(pin_number > inputs.len) - return null - return inputs[pin_number] - if(IC_OUTPUT) - if(pin_number > outputs.len) - return null - return outputs[pin_number] - if(IC_ACTIVATOR) - if(pin_number > activators.len) - return null - return activators[pin_number] - return null - -/obj/item/integrated_circuit/interact(mob/user) - if(!CanInteract(user, physical_state)) - return - - var/window_height = 350 - var/window_width = 600 - - //var/table_edge_width = "[(window_width - window_width * 0.1) / 4]px" - //var/table_middle_width = "[(window_width - window_width * 0.1) - (table_edge_width * 2)]px" - var/table_edge_width = "30%" - var/table_middle_width = "40%" - - var/HTML = list() - HTML += "[src.name]" - HTML += "
    " - HTML += "" - - HTML += "
    \[Refresh\] | " - HTML += "\[Rename\] | " - HTML += "\[Remove\]
    " - - HTML += "" - //HTML += "" - //HTML += "" - //HTML += "" - HTML += "" - HTML += "" - HTML += "" - HTML += "" - - var/column_width = 3 - var/row_height = max(inputs.len, outputs.len, 1) - - for(var/i = 1 to row_height) - HTML += "" - for(var/j = 1 to column_width) - var/datum/integrated_io/io = null - var/words = list() - var/height = 1 - switch(j) - if(1) - io = get_pin_ref(IC_INPUT, i) - if(io) - if(io.linked.len) - words += "[io.name] [io.display_data()]
    " - for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
    " - else - words += "[io.name] [io.display_data()]
    " - for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
    " - if(outputs.len > inputs.len) - height = 1 - if(2) - if(i == 1) - words += "[src.name]

    [src.desc]" - height = row_height - else - continue - if(3) - io = get_pin_ref(IC_OUTPUT, i) - if(io) - if(io.linked.len) - words += "[io.name] [io.display_data()]
    " - for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
    " - else - words += "[io.name] [io.display_data()]
    " - for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
    " - if(inputs.len > outputs.len) - height = 1 - HTML += "" - HTML += "" - - for(var/activator in activators) - var/datum/integrated_io/io = activator - var/words = list() - if(io.linked.len) - words += "[io.name]
    " - for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
    " - else - words += "[io.name]
    " - for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
    " - HTML += "" - HTML += "" - HTML += "" - - HTML += "
    [jointext(words, null)]
    [jointext(words, null)]
    " - HTML += "
    " - - if(autopulse != -1) - HTML += "
    Meta Variables;" - HTML += "
    \[Autopulse\] = [autopulse ? "ON" : "OFF"]" - HTML += "
    " - - HTML += "
    Complexity: [complexity]" - HTML += "
    [extended_desc]" - - HTML += "" - user << browse(jointext(HTML, null), "window=circuit-\ref[src];size=[window_width]x[window_height];border=1;can_resize=1;can_close=1;can_minimize=1") - - onclose(user, "circuit-\ref[src]") - -/obj/item/integrated_circuit/Topic(href, href_list, state = physical_state) - if(..()) - return 1 - var/pin = locate(href_list["pin"]) in inputs + outputs + activators - - var/obj/held_item = usr.get_active_hand() - if(href_list["wire"]) - if(istype(held_item, /obj/item/device/integrated_electronics/wirer)) - var/obj/item/device/integrated_electronics/wirer/wirer = held_item - if(pin) - wirer.wire(pin, usr) - - else if(istype(held_item, /obj/item/device/integrated_electronics/debugger)) - var/obj/item/device/integrated_electronics/debugger/debugger = held_item - if(pin) - debugger.write_data(pin, usr) - else - to_chat(usr, "You can't do a whole lot without the proper tools.") - - if(href_list["examine"]) - examine(usr) - - if(href_list["rename"]) - rename_component(usr) - - if(href_list["autopulse"]) - if(autopulse != -1) - autopulse = !autopulse - - if(href_list["remove"]) - if(istype(held_item, /obj/item/weapon/screwdriver)) - disconnect_all() - var/turf/T = get_turf(src) - forceMove(T) - playsound(T, 'sound/items/Crowbar.ogg', 50, 1) - to_chat(usr, "You pop \the [src] out of the case, and slide it out.") - else - to_chat(usr, "You need a screwdriver to remove components.") - var/obj/item/device/electronic_assembly/ea = loc - if(istype(ea)) - ea.interact(usr) - return - - interact(usr) // To refresh the UI. - -/datum/integrated_io - var/name = "input/output" - var/obj/item/integrated_circuit/holder = null - var/weakref/data = null // This is a weakref, to reduce typecasts. Note that oftentimes numbers and text may also occupy this. - var/list/linked = list() - var/io_type = DATA_CHANNEL - -/datum/integrated_io/New(var/newloc, var/name, var/data) - ..() - src.name = name - src.data = data - holder = newloc - if(!istype(holder)) - message_admins("ERROR: An integrated_io ([src.name]) spawned without a valid holder! This is a bug.") - -/datum/integrated_io/Destroy() - disconnect() - data = null - holder = null - . = ..() - -/datum/integrated_io/nano_host() - return holder.nano_host() + var/complexity = 1 //This acts as a limitation on building machines, more resource-intensive components cost more 'space'. + var/cooldown_per_use = 1 SECOND // Circuits are limited in how many times they can be work()'d by this variable. + var/power_draw_per_use = 0 // How much power is drawn when work()'d. + var/power_draw_idle = 0 // How much power is drawn when doing nothing. + var/spawn_flags = null // Used for world initializing, see the #defines above. + var/category_text = "NO CATEGORY THIS IS A BUG" // To show up on circuit printer, and perhaps other places. + var/autopulse = -1 // When input is received, the circuit will pulse itself if set to 1. 0 means it won't. -1 means it is permanently off. + var/removable = TRUE // Determines if a circuit is removable from the assembly. -/datum/integrated_io/proc/data_as_type(var/as_type) - if(!isweakref(data)) - return - var/weakref/w = data - var/output = w.resolve() - return istype(output, as_type) ? output : null - -/datum/integrated_io/proc/display_data() - if(isnull(data)) - return "(null)" // Empty data means nothing to show. - if(istext(data)) - return "(\"[data]\")" // Wraps the 'string' in escaped quotes, so that people know it's a 'string'. - if(isweakref(data)) - var/weakref/w = data - var/atom/A = w.resolve() - //return A ? "([A.name] \[Ref\])" : "(null)" // For refs, we want just the name displayed. - return A ? "(\ref[A] \[Ref\])" : "(null)" - return "([data])" // Nothing special needed for numbers or other stuff. - -/datum/integrated_io/activate/display_data() - return "(\[pulse\])" - -/datum/integrated_io/proc/scramble() - if(isnull(data)) - return - if(isnum(data)) - write_data_to_pin(rand(-10000, 10000)) - if(istext(data)) - write_data_to_pin("ERROR") - push_data() - -/datum/integrated_io/activate/scramble() - push_data() - -/datum/integrated_io/proc/write_data_to_pin(var/new_data) - if(isnull(new_data) || isnum(new_data) || istext(new_data) || isweakref(new_data)) // Anything else is a type we don't want. - data = new_data - holder.on_data_written() - -/datum/integrated_io/proc/push_data() - for(var/datum/integrated_io/io in linked) - io.write_data_to_pin(data) - -/datum/integrated_io/activate/push_data() - for(var/datum/integrated_io/io in linked) - io.holder.check_then_do_work() - -/datum/integrated_io/proc/pull_data() - for(var/datum/integrated_io/io in linked) - write_data_to_pin(io.data) - -/datum/integrated_io/proc/get_linked_to_desc() - if(linked.len) - return "the [english_list(linked)]" - return "nothing" - -/datum/integrated_io/proc/disconnect() - //First we iterate over everything we are linked to. - for(var/datum/integrated_io/their_io in linked) - //While doing that, we iterate them as well, and disconnect ourselves from them. - for(var/datum/integrated_io/their_linked_io in their_io.linked) - if(their_linked_io == src) - their_io.linked.Remove(src) - else - continue - //Now that we're removed from them, we gotta remove them from us. - src.linked.Remove(their_io) - -/datum/integrated_io/input - name = "input pin" - -/datum/integrated_io/output - name = "output pin" - -/datum/integrated_io/activate - name = "activation pin" - io_type = PULSE_CHANNEL - -/obj/item/integrated_circuit/proc/push_data() - for(var/datum/integrated_io/output/O in outputs) - O.push_data() - -/obj/item/integrated_circuit/proc/pull_data() - for(var/datum/integrated_io/input/I in inputs) - I.push_data() - -/obj/item/integrated_circuit/proc/check_then_do_work() - if(world.time < next_use) // All intergrated circuits have an internal cooldown, to protect from spam. - return - next_use = world.time + cooldown_per_use - do_work() - -/obj/item/integrated_circuit/proc/do_work() - return - -/obj/item/integrated_circuit/proc/disconnect_all() - for(var/datum/integrated_io/input/I in inputs) - I.disconnect() - for(var/datum/integrated_io/output/O in outputs) - O.disconnect() - for(var/datum/integrated_io/activate/A in activators) - A.disconnect() \ No newline at end of file diff --git a/code/modules/integrated_electronics/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm similarity index 51% rename from code/modules/integrated_electronics/assemblies.dm rename to code/modules/integrated_electronics/core/assemblies.dm index ff994aa43c..88b804f80a 100644 --- a/code/modules/integrated_electronics/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -11,6 +11,7 @@ var/max_components = IC_COMPONENTS_BASE var/max_complexity = IC_COMPLEXITY_BASE var/opened = 0 + var/obj/item/weapon/cell/device/battery = null // Internal cell which most circuits need to work. /obj/item/device/electronic_assembly/medium name = "electronic mechanism" @@ -23,8 +24,8 @@ name = "electronic machine" icon_state = "setup_large" w_class = ITEMSIZE_LARGE - max_components = IC_COMPONENTS_BASE * 3 - max_complexity = IC_COMPLEXITY_BASE * 3 + max_components = IC_COMPONENTS_BASE * 4 + max_complexity = IC_COMPLEXITY_BASE * 4 /obj/item/device/electronic_assembly/drone name = "electronic drone" @@ -41,6 +42,32 @@ max_complexity = IC_COMPLEXITY_BASE / 2 var/obj/item/weapon/implant/integrated_circuit/implant = null +/obj/item/device/electronic_assembly/New() + ..() + battery = new(src) + processing_objects |= src + +/obj/item/device/electronic_assembly/Destroy() + battery = null + processing_objects -= src + for(var/atom/movable/AM in contents) + qdel(AM) + ..() + +/obj/item/device/electronic_assembly/process() + handle_idle_power() + +/obj/item/device/electronic_assembly/proc/handle_idle_power() + // First we generate power. + for(var/obj/item/integrated_circuit/passive/power/P in contents) + P.make_energy() + + // Now spend it. + for(var/obj/item/integrated_circuit/IC in contents) + if(IC.power_draw_idle) + if(!draw_power(IC.power_draw_idle)) + IC.power_fail() + /obj/item/device/electronic_assembly/implant/update_icon() ..() implant.icon_state = icon_state @@ -70,13 +97,18 @@ HTML += "
    \[Refresh\] | " HTML += "\[Rename\]
    " HTML += "[total_parts]/[max_components] ([round((total_parts / max_components) * 100, 0.1)]%) space taken up in the assembly.
    " - HTML += "[total_complexity]/[max_complexity] ([round((total_complexity / max_complexity) * 100, 0.1)]%) maximum complexity." + HTML += "[total_complexity]/[max_complexity] ([round((total_complexity / max_complexity) * 100, 0.1)]%) maximum complexity.
    " + if(battery) + HTML += "[round(battery.charge, 0.1)]/[battery.maxcharge] ([round(battery.percent(), 0.1)]%) cell charge. \[Remove\]" + else + HTML += "No powercell detected!" HTML += "

    " HTML += "Components;
    " for(var/obj/item/integrated_circuit/circuit in contents) HTML += "[circuit.name] | " HTML += "\[Rename\] | " - HTML += "\[Remove\]" + if(circuit.removable) + HTML += "\[Remove\]" HTML += "
    " HTML += "" @@ -89,6 +121,16 @@ if(href_list["rename"]) rename(usr) + if(href_list["remove_cell"]) + if(!battery) + to_chat(usr, "There's no power cell to remove from \the [src].") + else + var/turf/T = get_turf(src) + battery.forceMove(T) + playsound(T, 'sound/items/Crowbar.ogg', 50, 1) + to_chat(usr, "You pull \the [battery] out of \the [src]'s power supplier.") + battery = null + interact(usr) // To refresh the UI. /obj/item/device/electronic_assembly/verb/rename() @@ -117,39 +159,84 @@ else icon_state = initial(icon_state) +/obj/item/device/electronic_assembly/GetAccess() + . = list() + for(var/obj/item/integrated_circuit/part in contents) + . |= part.GetAccess() + +/obj/item/device/electronic_assembly/GetIdCard() + . = list() + for(var/obj/item/integrated_circuit/part in contents) + var/id_card = part.GetIdCard() + if(id_card) + return id_card + /obj/item/device/electronic_assembly/examine(mob/user) . = ..(user, 1) if(.) - for(var/obj/item/integrated_circuit/output/screen/S in contents) - if(S.stuff_to_display) - to_chat(user, "There's a little screen labeled '[S.name]', which displays '[S.stuff_to_display]'.") + for(var/obj/item/integrated_circuit/IC in contents) + IC.external_examine(user) + // for(var/obj/item/integrated_circuit/output/screen/S in contents) + // if(S.stuff_to_display) + // to_chat(user, "There's a little screen labeled '[S.name]', which displays '[S.stuff_to_display]'.") if(opened) interact(user) +/obj/item/device/electronic_assembly/proc/get_part_complexity() + . = 0 + for(var/obj/item/integrated_circuit/part in contents) + . += part.complexity + +/obj/item/device/electronic_assembly/proc/get_part_size() + . = 0 + for(var/obj/item/integrated_circuit/part in contents) + . += part.w_class + +// Returns true if the circuit made it inside. +/obj/item/device/electronic_assembly/proc/add_circuit(var/obj/item/integrated_circuit/IC, var/mob/user) + if(!opened) + to_chat(user, "\The [src] isn't opened, so you can't put anything inside. Try using a crowbar.") + return FALSE + + if(IC.w_class > src.w_class) + to_chat(user, "\The [IC] is way too big to fit into \the [src].") + return FALSE + + var/total_part_size = get_part_size() + var/total_complexity = get_part_complexity() + + if((total_part_size + IC.w_class) > max_components) + to_chat(user, "You can't seem to add the '[IC.name]', as there's insufficient space.") + return FALSE + if((total_complexity + IC.complexity) > max_complexity) + to_chat(user, "You can't seem to add the '[IC.name]', since this setup's too complicated for the case.") + return FALSE + + if(!IC.forceMove(src)) + return FALSE + + IC.assembly = src + + return TRUE + +/obj/item/device/electronic_assembly/afterattack(atom/target, mob/user, proximity) + if(proximity) + var/scanned = FALSE + for(var/obj/item/integrated_circuit/input/sensor/S in contents) + S.set_pin_data(IC_OUTPUT, 1, weakref(target)) + S.check_then_do_work() + scanned = TRUE + if(scanned) + visible_message("\The [user] waves \the [src] around [target].") + /obj/item/device/electronic_assembly/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/integrated_circuit)) - if(!opened) - to_chat(user, "\The [src] isn't opened, so you can't put anything inside. Try using a crowbar.") + if(!user.unEquip(I)) return 0 - var/obj/item/integrated_circuit/IC = I - var/total_parts = 0 - var/total_complexity = 0 - for(var/obj/item/integrated_circuit/part in contents) - total_parts++ - total_complexity = total_complexity + part.complexity - - if( (total_parts + 1) > max_components) - to_chat(user, "You can't seem to add this [IC.name], since there's no more room.") - return 0 - if( (total_complexity + IC.complexity) > max_complexity) - to_chat(user, "You can't seem to add this [IC.name], since this setup's too complicated for the case.") - return 0 - - to_chat(user, "You slide \the [IC] inside \the [src].") - user.drop_item() - IC.forceMove(src) - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) - interact(user) + if(add_circuit(I, user)) + to_chat(user, "You slide \the [I] inside \the [src].") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + interact(user) else if(istype(I, /obj/item/weapon/crowbar)) playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) opened = !opened @@ -161,6 +248,21 @@ else to_chat(user, "\The [src] isn't opened, so you can't fiddle with the internal components. \ Try using a crowbar.") + else if(istype(I, /obj/item/weapon/cell/device)) + if(!opened) + to_chat(user, "\The [src] isn't opened, so you can't put anything inside. Try using a crowbar.") + return FALSE + if(battery) + to_chat(user, "\The [src] already has \a [battery] inside. Remove it first if you want to replace it.") + return FALSE + var/obj/item/weapon/cell/device/cell = I + user.drop_item(cell) + cell.forceMove(src) + battery = cell + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + to_chat(user, "You slot \the [cell] inside \the [src]'s power supplier.") + interact(user) + else return ..() @@ -179,4 +281,16 @@ /obj/item/device/electronic_assembly/emp_act(severity) ..() for(var/atom/movable/AM in contents) - AM.emp_act(severity) \ No newline at end of file + AM.emp_act(severity) + +// Returns true if power was successfully drawn. +/obj/item/device/electronic_assembly/proc/draw_power(amount) + if(battery && battery.checked_use(amount * CELLRATE)) + return TRUE + return FALSE + +// Ditto for giving. +/obj/item/device/electronic_assembly/proc/give_power(amount) + if(battery && battery.give(amount * CELLRATE)) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/modules/integrated_electronics/core/helpers.dm b/code/modules/integrated_electronics/core/helpers.dm new file mode 100644 index 0000000000..c98d74e79f --- /dev/null +++ b/code/modules/integrated_electronics/core/helpers.dm @@ -0,0 +1,44 @@ +/obj/item/integrated_circuit/proc/setup_io(var/list/io_list, var/io_type) + var/list/io_list_copy = io_list.Copy() + io_list.Cut() + for(var/io_entry in io_list_copy) + io_list.Add(new io_type(src, io_entry, io_list_copy[io_entry])) + +/obj/item/integrated_circuit/proc/set_pin_data(var/pin_type, var/pin_number, var/new_data) + var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number) + return pin.write_data_to_pin(new_data) + +/obj/item/integrated_circuit/proc/get_pin_data(var/pin_type, var/pin_number) + var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number) + return pin.get_data() + +/obj/item/integrated_circuit/proc/get_pin_data_as_type(var/pin_type, var/pin_number, var/as_type) + var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number) + return pin.data_as_type(as_type) + +/obj/item/integrated_circuit/proc/activate_pin(var/pin_number) + var/datum/integrated_io/activate/A = activators[pin_number] + A.push_data() + +/datum/integrated_io/proc/get_data() + if(isnull(data)) + return + if(isweakref(data)) + return data.resolve() + return data + +/obj/item/integrated_circuit/proc/get_pin_ref(var/pin_type, var/pin_number) + switch(pin_type) + if(IC_INPUT) + if(pin_number > inputs.len) + return null + return inputs[pin_number] + if(IC_OUTPUT) + if(pin_number > outputs.len) + return null + return outputs[pin_number] + if(IC_ACTIVATOR) + if(pin_number > activators.len) + return null + return activators[pin_number] + return null diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm new file mode 100644 index 0000000000..87bb4cd182 --- /dev/null +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -0,0 +1,282 @@ +/* + Integrated circuits are essentially modular machines. Each circuit has a specific function, and combining them inside Electronic Assemblies allows +a creative player the means to solve many problems. Circuits are held inside an electronic assembly, and are wired using special tools. +*/ + +/obj/item/integrated_circuit/examine(mob/user) + . = ..() + external_examine(user) + +// This should be used when someone is examining while the case is opened. +/obj/item/integrated_circuit/proc/internal_examine(mob/user) + to_chat(user, "This board has [inputs.len] input pin\s, [outputs.len] output pin\s and [activators.len] activation pin\s.") + for(var/datum/integrated_io/input/I in inputs) + if(I.linked.len) + to_chat(user, "The '[I]' is connected to [I.get_linked_to_desc()].") + for(var/datum/integrated_io/output/O in outputs) + if(O.linked.len) + to_chat(user, "The '[O]' is connected to [O.get_linked_to_desc()].") + for(var/datum/integrated_io/activate/A in activators) + if(A.linked.len) + to_chat(user, "The '[A]' is connected to [A.get_linked_to_desc()].") + any_examine(user) + interact(user) + +// This should be used when someone is examining from an 'outside' perspective, e.g. reading a screen or LED. +/obj/item/integrated_circuit/proc/external_examine(mob/user) + any_examine(user) + +/obj/item/integrated_circuit/proc/any_examine(mob/user) + return + +/obj/item/integrated_circuit/New() + setup_io(inputs, /datum/integrated_io/input) + setup_io(outputs, /datum/integrated_io/output) + setup_io(activators, /datum/integrated_io/activate) + ..() + +/obj/item/integrated_circuit/proc/on_data_written() //Override this for special behaviour when new data gets pushed to the circuit. + return + +/obj/item/integrated_circuit/Destroy() + for(var/datum/integrated_io/I in inputs) + qdel(I) + for(var/datum/integrated_io/O in outputs) + qdel(O) + for(var/datum/integrated_io/A in activators) + qdel(A) + . = ..() + +/obj/item/integrated_circuit/nano_host() + if(istype(src.loc, /obj/item/device/electronic_assembly)) + var/obj/item/device/electronic_assembly/assembly = loc + return assembly.resolve_nano_host() + return ..() + +/obj/item/integrated_circuit/emp_act(severity) + for(var/datum/integrated_io/io in inputs + outputs + activators) + io.scramble() + +/obj/item/integrated_circuit/verb/rename_component() + set name = "Rename Circuit" + set category = "Object" + set desc = "Rename your circuit, useful to stay organized." + + var/mob/M = usr + if(!CanInteract(M, physical_state)) + return + + var/input = sanitizeSafe(input("What do you want to name the circuit?", "Rename", src.name) as null|text, MAX_NAME_LEN) + if(src && input && CanInteract(M, physical_state)) + to_chat(M, "The circuit '[src.name]' is now labeled '[input]'.") + name = input + +/obj/item/integrated_circuit/interact(mob/user) + if(!CanInteract(user, physical_state)) + return + + var/window_height = 350 + var/window_width = 600 + + //var/table_edge_width = "[(window_width - window_width * 0.1) / 4]px" + //var/table_middle_width = "[(window_width - window_width * 0.1) - (table_edge_width * 2)]px" + var/table_edge_width = "30%" + var/table_middle_width = "40%" + + var/HTML = list() + HTML += "[src.name]" + HTML += "
    " + HTML += "" + + HTML += "
    \[Refresh\] | " + HTML += "\[Rename\] | " + HTML += "\[Remove\]
    " + + HTML += "" + //HTML += "" + //HTML += "" + //HTML += "" + HTML += "" + HTML += "" + HTML += "" + HTML += "" + + var/column_width = 3 + var/row_height = max(inputs.len, outputs.len, 1) + + for(var/i = 1 to row_height) + HTML += "" + for(var/j = 1 to column_width) + var/datum/integrated_io/io = null + var/words = list() + var/height = 1 + switch(j) + if(1) + io = get_pin_ref(IC_INPUT, i) + if(io) + if(io.linked.len) + words += "[io.name] [io.display_data()]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + else + words += "[io.name] [io.display_data()]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + if(outputs.len > inputs.len) + height = 1 + if(2) + if(i == 1) + words += "[src.name]

    [src.desc]" + height = row_height + else + continue + if(3) + io = get_pin_ref(IC_OUTPUT, i) + if(io) + if(io.linked.len) + words += "[io.name] [io.display_data()]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + else + words += "[io.name] [io.display_data()]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + if(inputs.len > outputs.len) + height = 1 + HTML += "" + HTML += "" + + for(var/activator in activators) + var/datum/integrated_io/io = activator + var/words = list() + if(io.linked.len) + words += "[io.name]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + else + words += "[io.name]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + HTML += "" + HTML += "" + HTML += "" + + HTML += "
    [jointext(words, null)]
    [jointext(words, null)]
    " + HTML += "
    " + + if(autopulse != -1) + HTML += "
    Meta Variables;" + HTML += "
    \[Autopulse\] = [autopulse ? "ON" : "OFF"]" + HTML += "
    " + + HTML += "
    Complexity: [complexity]" + if(power_draw_idle) + HTML += "
    Power Draw: [power_draw_idle] W (Idle)" + if(power_draw_per_use) + HTML += "
    Power Draw: [power_draw_per_use] W (Active)" // Borgcode says that powercells' checked_use() takes joules as input. + HTML += "
    [extended_desc]" + + HTML += "" + user << browse(jointext(HTML, null), "window=circuit-\ref[src];size=[window_width]x[window_height];border=1;can_resize=1;can_close=1;can_minimize=1") + + onclose(user, "circuit-\ref[src]") + +/obj/item/integrated_circuit/Topic(href, href_list, state = physical_state) + if(..()) + return 1 + var/pin = locate(href_list["pin"]) in inputs + outputs + activators + + var/obj/held_item = usr.get_active_hand() + if(href_list["wire"]) + if(istype(held_item, /obj/item/device/integrated_electronics/wirer)) + var/obj/item/device/integrated_electronics/wirer/wirer = held_item + if(pin) + wirer.wire(pin, usr) + + else if(istype(held_item, /obj/item/device/integrated_electronics/debugger)) + var/obj/item/device/integrated_electronics/debugger/debugger = held_item + if(pin) + debugger.write_data(pin, usr) + else + to_chat(usr, "You can't do a whole lot without the proper tools.") + + if(href_list["examine"]) + examine(usr) + + if(href_list["rename"]) + rename_component(usr) + + if(href_list["autopulse"]) + if(autopulse != -1) + autopulse = !autopulse + + if(href_list["remove"]) + if(istype(held_item, /obj/item/weapon/screwdriver)) + if(!removable) + to_chat(usr, "\The [src] seems to be permanently attached to the case.") + return + disconnect_all() + var/turf/T = get_turf(src) + forceMove(T) + assembly = null + playsound(T, 'sound/items/Crowbar.ogg', 50, 1) + to_chat(usr, "You pop \the [src] out of the case, and slide it out.") + else + to_chat(usr, "You need a screwdriver to remove components.") + var/obj/item/device/electronic_assembly/ea = loc + if(istype(ea)) + ea.interact(usr) + return + + interact(usr) // To refresh the UI. + +/obj/item/integrated_circuit/proc/push_data() + for(var/datum/integrated_io/output/O in outputs) + O.push_data() + +/obj/item/integrated_circuit/proc/pull_data() + for(var/datum/integrated_io/input/I in inputs) + I.push_data() + +/obj/item/integrated_circuit/proc/draw_idle_power() + if(assembly) + return assembly.draw_power(power_draw_idle) + +// Override this for special behaviour when there's no power left. +/obj/item/integrated_circuit/proc/power_fail() + return + +// Returns true if there's enough power to work(). +/obj/item/integrated_circuit/proc/check_power() + if(!assembly) + return FALSE // Not in an assembly, therefore no power. + if(assembly.draw_power(power_draw_per_use)) + return TRUE // Battery has enough. + return FALSE // Not enough power. + +/obj/item/integrated_circuit/proc/check_then_do_work() + if(world.time < next_use) // All intergrated circuits have an internal cooldown, to protect from spam. + return + if(power_draw_per_use) + if(!check_power()) + power_fail() + return + next_use = world.time + cooldown_per_use + do_work() + +/obj/item/integrated_circuit/proc/do_work() + return + +/obj/item/integrated_circuit/proc/disconnect_all() + for(var/datum/integrated_io/input/I in inputs) + I.disconnect() + for(var/datum/integrated_io/output/O in outputs) + O.disconnect() + for(var/datum/integrated_io/activate/A in activators) + A.disconnect() diff --git a/code/modules/integrated_electronics/core/pins.dm b/code/modules/integrated_electronics/core/pins.dm new file mode 100644 index 0000000000..dc6d48e303 --- /dev/null +++ b/code/modules/integrated_electronics/core/pins.dm @@ -0,0 +1,139 @@ +/* + Pins both hold data for circuits, as well move data between them. Some also cause circuits to do their function. DATA_CHANNEL pins are the data holding/moving kind, +where as PULSE_CHANNEL causes circuits to work() when their pulse hits them. + + +A visualization of how pins work is below. Imagine the below image involves an addition circuit. +When the bottom pin, the activator, receives a pulse, all the numbers on the left (input) get added, and the answer goes on the right side (output). + +Inputs Outputs + +A [2]\ /[8] result +B [1]-\|++|/ +C [4]-/|++| +D [1]/ || + || + Activator + + + +*/ +/datum/integrated_io + var/name = "input/output" + var/obj/item/integrated_circuit/holder = null + var/weakref/data = null // This is a weakref, to reduce typecasts. Note that oftentimes numbers and text may also occupy this. + var/list/linked = list() + var/io_type = DATA_CHANNEL + +/datum/integrated_io/New(var/newloc, var/name, var/data) + ..() + src.name = name + src.data = data + holder = newloc + if(!istype(holder)) + message_admins("ERROR: An integrated_io ([src.name]) spawned without a valid holder! This is a bug.") + +/datum/integrated_io/Destroy() + disconnect() + data = null + holder = null + . = ..() + +/datum/integrated_io/nano_host() + return holder.nano_host() + + +/datum/integrated_io/proc/data_as_type(var/as_type) + if(!isweakref(data)) + return + var/weakref/w = data + var/output = w.resolve() + return istype(output, as_type) ? output : null + +/datum/integrated_io/proc/display_data() + if(isnull(data)) + return "(null)" // Empty data means nothing to show. + if(istext(data)) + return "(\"[data]\")" // Wraps the 'string' in escaped quotes, so that people know it's a 'string'. + if(isweakref(data)) + var/weakref/w = data + var/atom/A = w.resolve() + //return A ? "([A.name] \[Ref\])" : "(null)" // For refs, we want just the name displayed. + return A ? "(\ref[A] \[Ref\])" : "(null)" + return "([data])" // Nothing special needed for numbers or other stuff. + +/datum/integrated_io/activate/display_data() + return "(\[pulse\])" + +/datum/integrated_io/proc/display_pin_type() + return IC_FORMAT_ANY + +/datum/integrated_io/activate/display_pin_type() + return IC_FORMAT_PULSE + +/datum/integrated_io/proc/scramble() + if(isnull(data)) + return + if(isnum(data)) + write_data_to_pin(rand(-10000, 10000)) + if(istext(data)) + write_data_to_pin("ERROR") + push_data() + +/datum/integrated_io/activate/scramble() + push_data() + +/datum/integrated_io/proc/write_data_to_pin(var/new_data) + if(isnull(new_data) || isnum(new_data) || istext(new_data) || isweakref(new_data)) // Anything else is a type we don't want. + data = new_data + holder.on_data_written() + +/datum/integrated_io/proc/push_data() + for(var/datum/integrated_io/io in linked) + io.write_data_to_pin(data) + +/datum/integrated_io/activate/push_data() + for(var/datum/integrated_io/io in linked) + io.holder.check_then_do_work() + +/datum/integrated_io/proc/pull_data() + for(var/datum/integrated_io/io in linked) + write_data_to_pin(io.data) + +/datum/integrated_io/proc/get_linked_to_desc() + if(linked.len) + return "the [english_list(linked)]" + return "nothing" + +/datum/integrated_io/proc/disconnect() + //First we iterate over everything we are linked to. + for(var/datum/integrated_io/their_io in linked) + //While doing that, we iterate them as well, and disconnect ourselves from them. + for(var/datum/integrated_io/their_linked_io in their_io.linked) + if(their_linked_io == src) + their_io.linked.Remove(src) + else + continue + //Now that we're removed from them, we gotta remove them from us. + src.linked.Remove(their_io) + +/datum/integrated_io/input + name = "input pin" + +/datum/integrated_io/output + name = "output pin" + +/datum/integrated_io/activate + name = "activation pin" + io_type = PULSE_CHANNEL + +/datum/integrated_io/list + name = "list pin" + +/datum/integrated_io/list/write_data_to_pin(var/new_data) + if(islist(new_data)) + data = new_data + holder.on_data_written() + +/datum/integrated_io/list/display_pin_type() + return IC_FORMAT_LIST \ No newline at end of file diff --git a/code/modules/integrated_electronics/tools.dm b/code/modules/integrated_electronics/core/tools.dm similarity index 71% rename from code/modules/integrated_electronics/tools.dm rename to code/modules/integrated_electronics/core/tools.dm index 6c76b9b4ff..21a56f014d 100644 --- a/code/modules/integrated_electronics/tools.dm +++ b/code/modules/integrated_electronics/core/tools.dm @@ -20,6 +20,9 @@ icon_state = "wirer-[mode]" /obj/item/device/integrated_electronics/wirer/proc/wire(var/datum/integrated_io/io, mob/user) + if(!io.holder.assembly) + to_chat(user, "\The [io.holder] needs to be secured inside an assembly first.") + return if(mode == WIRE) selected_io = io to_chat(user, "You attach a data wire to \the [selected_io.holder]'s [selected_io.name] data channel.") @@ -33,6 +36,9 @@ to_chat(user, "Those two types of channels are incompatable. The first is a [selected_io.io_type], \ while the second is a [io.io_type].") return + if(io.holder.assembly && io.holder.assembly != selected_io.holder.assembly) + to_chat(user, "Both \the [io.holder] and \the [selected_io.holder] need to be inside the same assembly.") + return selected_io.linked |= io io.linked |= selected_io @@ -191,6 +197,7 @@ new /obj/item/weapon/storage/bag/circuits/mini/reagents(src) new /obj/item/weapon/storage/bag/circuits/mini/transfer(src) new /obj/item/weapon/storage/bag/circuits/mini/converter(src) + new /obj/item/weapon/storage/bag/circuits/mini/power(src) new /obj/item/device/electronic_assembly(src) new /obj/item/device/integrated_electronics/wirer(src) @@ -202,11 +209,24 @@ /obj/item/weapon/storage/bag/circuits/all/New() ..() spawn(2 SECONDS) // So the list has time to initialize. - for(var/obj/item/integrated_circuit/IC in all_integrated_circuits) - for(var/i = 1 to 10) - new IC.type(src) + new /obj/item/weapon/storage/bag/circuits/mini/arithmetic/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/trig/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/input/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/output/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/memory/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/logic/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/smart/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/manipulation/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/time/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/reagents/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/transfer/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/converter/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/power/all(src) new /obj/item/device/electronic_assembly(src) + new /obj/item/device/electronic_assembly/medium(src) + new /obj/item/device/electronic_assembly/large(src) + new /obj/item/device/electronic_assembly/drone(src) new /obj/item/device/integrated_electronics/wirer(src) new /obj/item/device/integrated_electronics/debugger(src) new /obj/item/weapon/crowbar(src) @@ -219,16 +239,20 @@ w_class = 2 display_contents_with_number = 1 can_hold = list(/obj/item/integrated_circuit) + var/spawn_flags_to_use = IC_SPAWN_DEFAULT /obj/item/weapon/storage/bag/circuits/mini/arithmetic name = "arithmetic circuit box" desc = "Warning: Contains math." icon_state = "box_arithmetic" +/obj/item/weapon/storage/bag/circuits/mini/arithmetic/all // Don't believe this will ever be needed. + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/arithmetic/New() ..() for(var/obj/item/integrated_circuit/arithmetic/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -239,10 +263,13 @@ desc = "Danger: Contains more math." icon_state = "box_trig" +/obj/item/weapon/storage/bag/circuits/mini/trig/all // Ditto + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/trig/New() ..() for(var/obj/item/integrated_circuit/trig/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -253,10 +280,13 @@ desc = "Tell these circuits everything you know." icon_state = "box_input" +/obj/item/weapon/storage/bag/circuits/mini/input/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/input/New() ..() for(var/obj/item/integrated_circuit/input/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -267,10 +297,13 @@ desc = "Circuits to interface with the world beyond itself." icon_state = "box_output" +/obj/item/weapon/storage/bag/circuits/mini/output/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/output/New() ..() for(var/obj/item/integrated_circuit/output/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -281,25 +314,30 @@ desc = "Machines can be quite forgetful without these." icon_state = "box_memory" +/obj/item/weapon/storage/bag/circuits/mini/memory/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/memory/New() ..() for(var/obj/item/integrated_circuit/memory/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() - /obj/item/weapon/storage/bag/circuits/mini/logic name = "logic circuit box" desc = "May or may not be Turing complete." icon_state = "box_logic" +/obj/item/weapon/storage/bag/circuits/mini/logic/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/logic/New() ..() for(var/obj/item/integrated_circuit/logic/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -310,10 +348,13 @@ desc = "No time machine parts, sadly." icon_state = "box_time" +/obj/item/weapon/storage/bag/circuits/mini/time/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/time/New() ..() for(var/obj/item/integrated_circuit/time/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -324,10 +365,13 @@ desc = "Unlike most electronics, these circuits are supposed to come in contact with liquids." icon_state = "box_reagents" +/obj/item/weapon/storage/bag/circuits/mini/reagents/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/reagents/New() ..() for(var/obj/item/integrated_circuit/reagent/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -338,10 +382,13 @@ desc = "Useful for moving data representing something arbitrary to another arbitrary virtual place." icon_state = "box_transfer" +/obj/item/weapon/storage/bag/circuits/mini/transfer/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/transfer/New() ..() for(var/obj/item/integrated_circuit/transfer/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -352,10 +399,66 @@ desc = "Transform one piece of data to another type of data with these." icon_state = "box_converter" +/obj/item/weapon/storage/bag/circuits/mini/converter/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/converter/New() ..() for(var/obj/item/integrated_circuit/converter/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) + for(var/i = 1 to 3) + new IC.type(src) + make_exact_fit() + +/obj/item/weapon/storage/bag/circuits/mini/smart + name = "smart box" + desc = "Sentience not included." + icon_state = "box_ai" + +/obj/item/weapon/storage/bag/circuits/mini/smart/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/weapon/storage/bag/circuits/mini/smart/New() + ..() + for(var/obj/item/integrated_circuit/smart/IC in all_integrated_circuits) + if(IC.spawn_flags & spawn_flags_to_use) + for(var/i = 1 to 3) + new IC.type(src) + make_exact_fit() + +/obj/item/weapon/storage/bag/circuits/mini/manipulation + name = "manipulation box" + desc = "Make your machines actually useful with these." + icon_state = "box_manipulation" + +/obj/item/weapon/storage/bag/circuits/mini/manipulation/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/weapon/storage/bag/circuits/mini/manipulation/New() + ..() + for(var/obj/item/integrated_circuit/manipulation/IC in all_integrated_circuits) + if(IC.spawn_flags & spawn_flags_to_use) + for(var/i = 1 to 3) + new IC.type(src) + make_exact_fit() + + +/obj/item/weapon/storage/bag/circuits/mini/power + name = "power circuit box" + desc = "Electronics generally require electricity." + icon_state = "box_power" + +/obj/item/weapon/storage/bag/circuits/mini/power/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/weapon/storage/bag/circuits/mini/power/New() + ..() + for(var/obj/item/integrated_circuit/passive/power/IC in all_integrated_circuits) + if(IC.spawn_flags & spawn_flags_to_use) + for(var/i = 1 to 3) + new IC.type(src) + for(var/obj/item/integrated_circuit/power/IC in all_integrated_circuits) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() \ No newline at end of file diff --git a/code/modules/integrated_electronics/data_transfer.dm b/code/modules/integrated_electronics/data_transfer.dm deleted file mode 100644 index 7e37995df5..0000000000 --- a/code/modules/integrated_electronics/data_transfer.dm +++ /dev/null @@ -1,85 +0,0 @@ -/obj/item/integrated_circuit/transfer - category_text = "Data Transfer" - autopulse = 1 - -/obj/item/integrated_circuit/transfer/on_data_written() - if(autopulse == 1) - check_then_do_work() - -/obj/item/integrated_circuit/transfer/splitter - name = "splitter" - desc = "Splits incoming data into all of the output pins." - icon_state = "splitter" - complexity = 3 - inputs = list("data to split") - outputs = list("A","B") - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/transfer/splitter/medium - name = "four splitter" - icon_state = "splitter4" - complexity = 5 - outputs = list("A","B","C","D") - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/transfer/splitter/large - name = "eight splitter" - icon_state = "splitter8" - complexity = 9 - outputs = list("A","B","C","D","E","F","G","H") - spawn_flags = IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/transfer/splitter/do_work() - var/datum/integrated_io/I = inputs[1] - for(var/datum/integrated_io/output/O in outputs) - O.data = I.data - -/obj/item/integrated_circuit/transfer/activator_splitter - name = "activator splitter" - desc = "Splits incoming activation pulses into all of the output pins." - icon_state = "splitter" - complexity = 3 - activators = list( - "incoming pulse", - "outgoing pulse A", - "outgoing pulse B" - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/transfer/activator_splitter/do_work() - for(var/datum/integrated_io/activate/A in outputs) - if(A == activators[1]) - continue - if(A.linked.len) - for(var/datum/integrated_io/activate/target in A.linked) - target.holder.check_then_do_work() - -/obj/item/integrated_circuit/transfer/activator_splitter/medium - name = "four activator splitter" - icon_state = "splitter4" - complexity = 5 - activators = list( - "incoming pulse", - "outgoing pulse A", - "outgoing pulse B", - "outgoing pulse C", - "outgoing pulse D" - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/transfer/activator_splitter/large - name = "eight activator splitter" - icon_state = "splitter4" - complexity = 9 - activators = list( - "incoming pulse", - "outgoing pulse A", - "outgoing pulse B", - "outgoing pulse C", - "outgoing pulse D", - "outgoing pulse E", - "outgoing pulse F", - "outgoing pulse G", - "outgoing pulse H" - ) - spawn_flags = IC_SPAWN_RESEARCH \ No newline at end of file diff --git a/code/modules/integrated_electronics/passive/passive.dm b/code/modules/integrated_electronics/passive/passive.dm new file mode 100644 index 0000000000..02f03d48d7 --- /dev/null +++ b/code/modules/integrated_electronics/passive/passive.dm @@ -0,0 +1,7 @@ +// 'Passive' components do not have any pins, and instead contribute in some form to the assembly holding them. +/obj/item/integrated_circuit/passive + inputs = list() + outputs = list() + activators = list() + power_draw_idle = 0 + power_draw_per_use = 0 \ No newline at end of file diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm new file mode 100644 index 0000000000..9e08a96d24 --- /dev/null +++ b/code/modules/integrated_electronics/passive/power.dm @@ -0,0 +1,109 @@ + +/obj/item/integrated_circuit/passive/power + name = "power thingy" + desc = "Does power stuff." + complexity = 5 + origin_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_DATA = 2) + category_text = "Power - Passive" + +/obj/item/integrated_circuit/passive/power/proc/make_energy() + return + +// For calculators. +/obj/item/integrated_circuit/passive/power/solar_cell + name = "tiny photovoltaic cell" + desc = "It's a very tiny solar cell, generally used in calculators." + extended_desc = "The cell generates 1W of energy per second in optimal lighting conditions. Less light will result in less power being generated." + icon_state = "solar_cell" + complexity = 8 + origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3, TECH_DATA = 2) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + var/max_power = 1 + +/obj/item/integrated_circuit/passive/power/solar_cell/make_energy() + var/atom/movable/lighting_overlay/light = locate(/atom/movable/lighting_overlay) in get_turf(src) + var/light_amount = 1 // Unsimulated tiles are pretend-lit, so we need to be pretend too if that somehow happens. + if(light) + light_amount = (light.lum_r + light.lum_g + light.lum_b) / 3 + + var/adjusted_power = max(max_power * light_amount, 0) + adjusted_power = round(adjusted_power, 0.1) + if(adjusted_power) + if(assembly) + assembly.give_power(adjusted_power) + +// For implants. +/obj/item/integrated_circuit/passive/power/metabolic_siphon + name = "metabolic siphon" + desc = "A complicated piece of technology which converts bodily nutriments of a host into electricity." + extended_desc = "The siphon generates 10W of energy, so long as the siphon exists inside a biological entity. The entity will feel an increased \ + appetite and will need to eat more often due to this. This device will fail if used inside synthetic entities." + icon_state = "setup_implant" + complexity = 10 + origin_tech = list(TECH_POWER = 4, TECH_ENGINEERING = 4, TECH_DATA = 4, TECH_BIO = 5) + spawn_flags = IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/passive/power/metabolic_siphon/proc/test_validity(var/mob/living/carbon/human/host) + if(!host || host.isSynthetic() || host.stat == DEAD || host.nutrition <= 10) + return FALSE // Robots and dead people don't have a metabolism. + return TRUE + +/obj/item/integrated_circuit/passive/power/metabolic_siphon/make_energy() + var/mob/living/carbon/human/host = null + if(assembly && istype(assembly, /obj/item/device/electronic_assembly/implant)) + var/obj/item/device/electronic_assembly/implant/implant_assembly = assembly + if(implant_assembly.implant.imp_in) + host = implant_assembly.implant.imp_in + if(host && test_validity(host)) + assembly.give_power(10) + host.nutrition = max(host.nutrition - DEFAULT_HUNGER_FACTOR, 0) + +/obj/item/integrated_circuit/passive/power/metabolic_siphon/synthetic + name = "internal energy siphon" + desc = "A small circuit designed to be connected to an internal power wire inside a synthetic entity." + extended_desc = "The siphon generates 10W of energy, so long as the siphon exists inside a synthetic entity. The entity need to recharge \ + more often due to this. This device will fail if used inside organic entities." + icon_state = "setup_implant" + complexity = 10 + origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 4, TECH_DATA = 3) + spawn_flags = IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/passive/power/metabolic_siphon/synthetic/test_validity(var/mob/living/carbon/human/host) + if(!host || !host.isSynthetic() || host.stat == DEAD || host.nutrition <= 10) + return FALSE // This time we don't want a metabolism. + return TRUE + +// For fat machines that need fat power, like drones. +/obj/item/integrated_circuit/passive/power/relay + name = "tesla power relay" + desc = "A seemingly enigmatic device which connects to nearby APCs wirelessly and draws power from them." + w_class = ITEMSIZE_NORMAL + extended_desc = "The siphon generates 250W of energy, so long as an APC is in the same room, with a cell that has energy. It will always drain \ + from the 'equipment' power channel." + icon_state = "power_relay" + complexity = 7 + origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3, TECH_DATA = 2) + spawn_flags = IC_SPAWN_RESEARCH + var/power_amount = 250 + +// For really fat machines. +/obj/item/integrated_circuit/passive/power/relay/large + name = "large tesla power relay" + desc = "A seemingly enigmatic device which connects to nearby APCs wirelessly and draws power from them, now in industiral size!" + w_class = ITEMSIZE_LARGE + extended_desc = "The siphon generates 2 kW of energy, so long as an APC is in the same room, with a cell that has energy. It will always drain \ + from the 'equipment' power channel." + icon_state = "power_relay" + complexity = 15 + origin_tech = list(TECH_POWER = 6, TECH_ENGINEERING = 5, TECH_DATA = 4) + spawn_flags = IC_SPAWN_RESEARCH + power_amount = 2000 + +/obj/item/integrated_circuit/passive/power/relay/make_energy() + if(!assembly) + return + var/area/A = get_area(src) + if(A) + if(A.powered(EQUIP)) + A.use_power(power_amount, EQUIP) + assembly.give_power(power_amount) // give_power() handles CELLRATE on its own. diff --git a/code/modules/integrated_electronics/arithmetic.dm b/code/modules/integrated_electronics/subtypes/arithmetic.dm similarity index 99% rename from code/modules/integrated_electronics/arithmetic.dm rename to code/modules/integrated_electronics/subtypes/arithmetic.dm index 37eabf2027..c6134f9bd1 100644 --- a/code/modules/integrated_electronics/arithmetic.dm +++ b/code/modules/integrated_electronics/subtypes/arithmetic.dm @@ -6,6 +6,7 @@ activators = list("compute") category_text = "Arithmetic" autopulse = 1 + power_draw_per_use = 5 // Math is pretty cheap. /obj/item/integrated_circuit/arithmetic/on_data_written() if(autopulse == 1) diff --git a/code/modules/integrated_electronics/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm similarity index 99% rename from code/modules/integrated_electronics/converters.dm rename to code/modules/integrated_electronics/subtypes/converters.dm index 96494ba469..9e04e24db5 100644 --- a/code/modules/integrated_electronics/converters.dm +++ b/code/modules/integrated_electronics/subtypes/converters.dm @@ -6,6 +6,7 @@ activators = list("convert") category_text = "Converter" autopulse = 1 + power_draw_per_use = 10 /obj/item/integrated_circuit/converter/on_data_written() if(autopulse == 1) diff --git a/code/modules/integrated_electronics/subtypes/data_transfer.dm b/code/modules/integrated_electronics/subtypes/data_transfer.dm new file mode 100644 index 0000000000..c5fe9741be --- /dev/null +++ b/code/modules/integrated_electronics/subtypes/data_transfer.dm @@ -0,0 +1,186 @@ +/obj/item/integrated_circuit/transfer + category_text = "Data Transfer" + autopulse = 1 + power_draw_per_use = 2 + +/obj/item/integrated_circuit/transfer/on_data_written() + if(autopulse == 1) + check_then_do_work() + +/obj/item/integrated_circuit/transfer/splitter + name = "splitter" + desc = "Splits incoming data into all of the output pins." + icon_state = "splitter" + complexity = 3 + inputs = list("data to split") + outputs = list("A","B") + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/transfer/splitter/medium + name = "four splitter" + icon_state = "splitter4" + complexity = 5 + outputs = list("A","B","C","D") + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 + +/obj/item/integrated_circuit/transfer/splitter/large + name = "eight splitter" + icon_state = "splitter8" + w_class = ITEMSIZE_SMALL + complexity = 9 + outputs = list("A","B","C","D","E","F","G","H") + spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 8 + +/obj/item/integrated_circuit/transfer/splitter/do_work() + var/datum/integrated_io/I = inputs[1] + for(var/datum/integrated_io/output/O in outputs) + O.data = I.data + +/obj/item/integrated_circuit/transfer/activator_splitter + name = "activator splitter" + desc = "Splits incoming activation pulses into all of the output pins." + icon_state = "splitter" + complexity = 3 + activators = list( + "incoming pulse", + "outgoing pulse A", + "outgoing pulse B" + ) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 2 + +/obj/item/integrated_circuit/transfer/activator_splitter/do_work() + for(var/datum/integrated_io/activate/A in outputs) + if(A == activators[1]) + continue + if(A.linked.len) + for(var/datum/integrated_io/activate/target in A.linked) + target.holder.check_then_do_work() + +/obj/item/integrated_circuit/transfer/activator_splitter/medium + name = "four activator splitter" + icon_state = "splitter4" + complexity = 5 + activators = list( + "incoming pulse", + "outgoing pulse A", + "outgoing pulse B", + "outgoing pulse C", + "outgoing pulse D" + ) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 + +/obj/item/integrated_circuit/transfer/activator_splitter/large + name = "eight activator splitter" + icon_state = "splitter4" + w_class = ITEMSIZE_SMALL + complexity = 9 + activators = list( + "incoming pulse", + "outgoing pulse A", + "outgoing pulse B", + "outgoing pulse C", + "outgoing pulse D", + "outgoing pulse E", + "outgoing pulse F", + "outgoing pulse G", + "outgoing pulse H" + ) + spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 8 + + +/obj/item/integrated_circuit/transfer/multiplexer + name = "two multiplexer" + desc = "This is what those in the business tend to refer to as a 'mux' or data selector. It moves data from one of the selected inputs to the output." + extended_desc = "The first input pin is used to select which of the other input pins which has its data moved to the output. If the input selection is outside the valid range then no output is given." + complexity = 2 + icon_state = "mux2" + inputs = list("input selection") + outputs = list("output") + activators = list("select") + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 + var/number_of_inputs = 2 + +/obj/item/integrated_circuit/transfer/multiplexer/New() + for(var/i = 1 to number_of_inputs) + inputs += "input [i]" + complexity = number_of_inputs + ..() + desc += " It has [number_of_inputs] input pins." + extended_desc += " This multiplexer has a range from 1 to [inputs.len - 1]." + +/obj/item/integrated_circuit/transfer/multiplexer/do_work() + var/input_index = get_pin_data(IC_INPUT, 1) + var/output = null + + if(isnum(input_index) && (input_index >= 1 && input_index < inputs.len)) + output = get_pin_data(IC_INPUT, input_index + 1) + set_pin_data(IC_OUTPUT, 1, output) + +/obj/item/integrated_circuit/transfer/multiplexer/medium + name = "four multiplexer" + number_of_inputs = 4 + icon_state = "mux4" + +/obj/item/integrated_circuit/transfer/multiplexer/large + name = "eight multiplexer" + number_of_inputs = 8 + w_class = ITEMSIZE_SMALL + icon_state = "mux8" + +/obj/item/integrated_circuit/transfer/multiplexer/huge + name = "sixteen multiplexer" + icon_state = "mux16" + w_class = ITEMSIZE_SMALL + number_of_inputs = 16 + +/obj/item/integrated_circuit/transfer/demultiplexer + name = "two demultiplexer" + desc = "This is what those in the business tend to refer to as a 'demux'. It moves data from the input to one of the selected outputs." + extended_desc = "The first input pin is used to select which of the output pins is given the data from the second input pin. If the output selection is outside the valid range then no output is given." + complexity = 2 + icon_state = "dmux2" + inputs = list("output selection","input") + outputs = list() + activators = list("select") + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 + var/number_of_outputs = 2 + +/obj/item/integrated_circuit/transfer/demultiplexer/New() + for(var/i = 1 to number_of_outputs) + outputs += "output [i]" + complexity = number_of_outputs + + ..() + desc += " It has [number_of_outputs] output pins." + extended_desc += " This demultiplexer has a range from 1 to [outputs.len]." + +/obj/item/integrated_circuit/transfer/demultiplexer/do_work() + var/output_index = get_pin_data(IC_INPUT, 1) + var/output = get_pin_data(IC_INPUT, 2) + + for(var/i = 1 to outputs.len) + set_pin_data(IC_OUTPUT, i, i == output_index ? output : null) + +/obj/item/integrated_circuit/transfer/demultiplexer/medium + name = "four demultiplexer" + icon_state = "dmux4" + number_of_outputs = 4 + +/obj/item/integrated_circuit/transfer/demultiplexer/large + name = "eight demultiplexer" + icon_state = "dmux8" + w_class = ITEMSIZE_SMALL + number_of_outputs = 8 + +/obj/item/integrated_circuit/transfer/demultiplexer/huge + name = "sixteen demultiplexer" + icon_state = "dmux16" + w_class = ITEMSIZE_SMALL + number_of_outputs = 16 \ No newline at end of file diff --git a/code/modules/integrated_electronics/input_output.dm b/code/modules/integrated_electronics/subtypes/input_output.dm similarity index 76% rename from code/modules/integrated_electronics/input_output.dm rename to code/modules/integrated_electronics/subtypes/input_output.dm index c77ad3dc69..baa5738d4e 100644 --- a/code/modules/integrated_electronics/input_output.dm +++ b/code/modules/integrated_electronics/subtypes/input_output.dm @@ -1,6 +1,7 @@ /obj/item/integrated_circuit/input var/can_be_asked_input = 0 category_text = "Input" + power_draw_per_use = 5 /obj/item/integrated_circuit/input/proc/ask_for_input(mob/user) return @@ -23,6 +24,21 @@ target.holder.check_then_do_work() to_chat(user, "You press the button labeled '[src.name]'.") +/obj/item/integrated_circuit/input/toggle_button + name = "toggle button" + desc = "It toggles on, off, on, off..." + icon_state = "toggle_button" + complexity = 1 + inputs = list() + outputs = list("on" = 0) + activators = list("on toggle") + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/input/toggle_button/ask_for_input(mob/user) // Ditto. + set_pin_data(IC_OUTPUT, 1, !get_pin_data(IC_OUTPUT, 1)) + activate_pin(1) + to_chat(user, "You toggle the button labeled '[src.name]' [get_pin_data(IC_OUTPUT, 1) ? "on" : "off"].") + /obj/item/integrated_circuit/input/numberpad name = "number pad" desc = "This small number pad allows someone to input a number into the system." @@ -33,6 +49,7 @@ outputs = list("number entered") activators = list("on entered") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 /obj/item/integrated_circuit/input/numberpad/ask_for_input(mob/user) var/new_input = input(user, "Enter a number, please.","Number pad") as null|num @@ -53,6 +70,7 @@ outputs = list("string entered") activators = list("on entered") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 /obj/item/integrated_circuit/input/textpad/ask_for_input(mob/user) var/new_input = input(user, "Enter some words, please.","Number pad") as null|text @@ -73,6 +91,7 @@ activators = list("scan") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2) + power_draw_per_use = 40 /obj/item/integrated_circuit/input/med_scanner/do_work() var/datum/integrated_io/I = inputs[1] @@ -111,6 +130,7 @@ activators = list("scan") spawn_flags = IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_BIO = 4) + power_draw_per_use = 80 /obj/item/integrated_circuit/input/adv_med_scanner/do_work() var/datum/integrated_io/I = inputs[1] @@ -148,12 +168,12 @@ outputs = list("located ref") activators = list("locate") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 20 /obj/item/integrated_circuit/input/local_locator/do_work() var/datum/integrated_io/O = outputs[1] O.data = null - if(istype(src.loc, /obj/item/device/electronic_assembly)) // Check to make sure we're actually in a machine. - var/obj/item/device/electronic_assembly/assembly = src.loc + if(assembly) if(istype(assembly.loc, /mob/living)) // Now check if someone's holding us. O.data = weakref(assembly.loc) @@ -170,6 +190,7 @@ outputs = list("located ref") activators = list("locate") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 30 /obj/item/integrated_circuit/input/adjacent_locator/do_work() var/datum/integrated_io/I = inputs[1] @@ -205,7 +226,9 @@ outputs = list() activators = list("send signal","on signal received") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_MAGNETS = 2) + origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_MAGNET = 2) + power_draw_idle = 5 + power_draw_per_use = 40 var/frequency = 1457 var/code = 30 @@ -287,7 +310,8 @@ outputs = list("address received", "data received", "secondary text received") activators = list("send data", "on data received") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_MAGNETS = 2, TECH_BLUESPACE = 2) + origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_MAGNET = 2, TECH_BLUESPACE = 2) + power_draw_per_use = 50 var/datum/exonet_protocol/exonet = null /obj/item/integrated_circuit/input/EPv2/New() @@ -334,6 +358,7 @@ outputs = list("X (abs)", "Y (abs)") activators = list("get coordinates") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 30 /obj/item/integrated_circuit/input/gps/do_work() var/turf/T = get_turf(src) @@ -361,6 +386,7 @@ outputs = list("speaker \", "message \") activators = list("on message received") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 15 /obj/item/integrated_circuit/input/microphone/New() ..() @@ -385,9 +411,27 @@ for(var/datum/integrated_io/output/out in outputs) out.push_data() + A.push_data() +/obj/item/integrated_circuit/input/sensor + name = "sensor" + desc = "Scans and obtains a reference for any objects or persons near you. All you need to do is shove the machine in their face." + icon_state = "recorder" + complexity = 12 + inputs = list() + outputs = list("scanned ref \") + activators = list("on scanned") + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 120 + +/obj/item/integrated_circuit/input/sensor/do_work() + // Because this gets called by attack(), all this needs to do is pulse the activator. + for(var/datum/integrated_io/output/O in outputs) + O.push_data() + var/datum/integrated_io/activate/A = activators[1] + A.push_data() /obj/item/integrated_circuit/output @@ -401,8 +445,18 @@ outputs = list() activators = list("load data") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 10 + autopulse = 1 var/stuff_to_display = null + +/obj/item/integrated_circuit/output/screen/disconnect_all() + ..() + stuff_to_display = null + +/obj/item/integrated_circuit/output/screen/any_examine(mob/user) + to_chat(user, "There is a little screen labeled '[name]', which displays [stuff_to_display ? "'[stuff_to_display]'" : "nothing"].") + /obj/item/integrated_circuit/output/screen/do_work() var/datum/integrated_io/I = inputs[1] if(isweakref(I.data)) @@ -416,22 +470,24 @@ name = "screen" desc = "This screen allows for people holding the device to see a piece of data." icon_state = "screen_medium" + power_draw_per_use = 20 /obj/item/integrated_circuit/output/screen/medium/do_work() ..() var/list/nearby_things = range(0, get_turf(src)) for(var/mob/M in nearby_things) - var/obj/O = istype(loc, /obj/item/device/electronic_assembly) ? loc : src - visible_message("\icon[O] [stuff_to_display]") + var/obj/O = assembly ? assembly : src + to_chat(M, "\icon[O] [stuff_to_display]") /obj/item/integrated_circuit/output/screen/large name = "large screen" desc = "This screen allows for people able to see the device to see a piece of data." icon_state = "screen_large" + power_draw_per_use = 40 /obj/item/integrated_circuit/output/screen/large/do_work() ..() - var/obj/O = istype(loc, /obj/item/device/electronic_assembly) ? loc : src + var/obj/O = assembly ? loc : assembly O.visible_message("\icon[O] [stuff_to_display]") /obj/item/integrated_circuit/output/light @@ -446,6 +502,10 @@ var/light_toggled = 0 var/light_brightness = 3 var/light_rgb = "#FFFFFF" + power_draw_idle = 0 // Adjusted based on brightness. + +/obj/item/integrated_circuit/output/light/Destroy() + ..() /obj/item/integrated_circuit/output/light/do_work() light_toggled = !light_toggled @@ -456,6 +516,7 @@ set_light(l_range = light_brightness, l_power = light_brightness, l_color = light_rgb) else set_light(0) + power_draw_idle = light_toggled ? light_brightness * 2 : 0 /obj/item/integrated_circuit/output/light/advanced/update_lighting() var/datum/integrated_io/R = inputs[1] @@ -473,6 +534,10 @@ ..() +/obj/item/integrated_circuit/output/light/power_fail() // Turns off the flashlight if there's no power left. + light_toggled = FALSE + update_lighting() + /obj/item/integrated_circuit/output/light/advanced name = "advanced light" desc = "This light can turn on and off on command, in any color, and in various brightness levels." @@ -504,6 +569,7 @@ ) outputs = list() activators = list("play sound") + power_draw_per_use = 20 var/list/sounds = list() /obj/item/integrated_circuit/output/text_to_speech @@ -517,11 +583,12 @@ outputs = list() activators = list("to speech") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 60 /obj/item/integrated_circuit/output/text_to_speech/do_work() var/datum/integrated_io/text = inputs[1] if(istext(text.data)) - var/obj/O = istype(loc, /obj/item/device/electronic_assembly) ? loc : src + var/obj/O = assembly ? loc : assembly audible_message("\icon[O] \The [O.name] states, \"[text.data]\"") /obj/item/integrated_circuit/output/sound/New() @@ -576,4 +643,118 @@ "secure day" = 'sound/voice/bsecureday.ogg', ) spawn_flags = IC_SPAWN_RESEARCH - origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_ILLEGAL = 1) \ No newline at end of file + origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_ILLEGAL = 1) + +/obj/item/integrated_circuit/output/video_camera + name = "video camera circuit" + desc = "This small camera allows a remote viewer to see what it sees." + extended_desc = "The camera is linked to the Research camera network." + icon_state = "video_camera" + w_class = ITEMSIZE_SMALL + complexity = 10 + inputs = list("camera name" = "video camera circuit", "camera active" = 0) + outputs = list() + activators = list() + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_idle = 5 // Raises to 80 when on. + var/obj/machinery/camera/network/research/camera + +/obj/item/integrated_circuit/output/video_camera/New() + ..() + camera = new(src) + on_data_written() + +/obj/item/integrated_circuit/output/video_camera/Destroy() + qdel(camera) + ..() + +/obj/item/integrated_circuit/output/video_camera/proc/set_camera_status(var/status) + if(camera) + camera.set_status(status) + power_draw_idle = camera.status ? 80 : 5 + if(camera.status) // Ensure that there's actually power. + if(!draw_idle_power()) + power_fail() + +/obj/item/integrated_circuit/output/video_camera/on_data_written() + if(camera) + var/datum/integrated_io/cam_name = inputs[1] + var/datum/integrated_io/cam_active = inputs[2] + if(istext(cam_name.data)) + camera.c_tag = cam_name.data + if(isnum(cam_active.data)) + set_camera_status(cam_active.data) + +/obj/item/integrated_circuit/output/video_camera/power_fail() + if(camera) + set_camera_status(0) + var/datum/integrated_io/cam_active = inputs[2] + cam_active.data = FALSE + +/obj/item/integrated_circuit/output/led + name = "light-emitting diode" + desc = "This a LED that is lit whenever there is TRUE-equivalent data on its input." + extended_desc = "TRUE-equivalent values are: Non-empty strings, non-zero numbers, and valid refs." + complexity = 0.1 + icon_state = "led" + inputs = list("lit") + outputs = list() + activators = list() + power_draw_idle = 0 // Raises to 1 when lit. + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + var/led_color + +/obj/item/integrated_circuit/output/led/on_data_written() + power_draw_idle = get_pin_data(IC_INPUT, 1) ? 1 : 0 + +/obj/item/integrated_circuit/output/led/power_fail() + set_pin_data(IC_INPUT, 1, FALSE) + +/obj/item/integrated_circuit/output/led/any_examine(mob/user) + var/text_output = list() + var/initial_name = initial(name) + + // Doing all this work just to have a color-blind friendly output. + text_output += "There is " + if(name == initial_name) + text_output += "\an [name]" + else + text_output += "\an ["\improper[initial_name]"] labeled '[name]'" + text_output += " which is currently [get_pin_data(IC_INPUT, 1) ? "lit ¤" : "unlit."]" + to_chat(user,jointext(text_output,null)) + +/obj/item/integrated_circuit/output/led/red + name = "red LED" + led_color = COLOR_RED + +/obj/item/integrated_circuit/output/led/orange + name = "orange LED" + led_color = COLOR_ORANGE + +/obj/item/integrated_circuit/output/led/yellow + name = "yellow LED" + led_color = COLOR_YELLOW + +/obj/item/integrated_circuit/output/led/green + name = "green LED" + led_color = COLOR_GREEN + +/obj/item/integrated_circuit/output/led/blue + name = "blue LED" + led_color = COLOR_BLUE + +/obj/item/integrated_circuit/output/led/purple + name = "purple LED" + led_color = COLOR_PURPLE + +/obj/item/integrated_circuit/output/led/cyan + name = "cyan LED" + led_color = COLOR_CYAN + +/obj/item/integrated_circuit/output/led/white + name = "white LED" + led_color = COLOR_WHITE + +/obj/item/integrated_circuit/output/led/pink + name = "pink LED" + led_color = COLOR_PINK diff --git a/code/modules/integrated_electronics/logic.dm b/code/modules/integrated_electronics/subtypes/logic.dm similarity index 87% rename from code/modules/integrated_electronics/logic.dm rename to code/modules/integrated_electronics/subtypes/logic.dm index d477be3cbe..8feed0457c 100644 --- a/code/modules/integrated_electronics/logic.dm +++ b/code/modules/integrated_electronics/subtypes/logic.dm @@ -4,9 +4,10 @@ extended_desc = "Logic circuits will treat a null, 0, and a \"\" string value as FALSE and anything else as TRUE." complexity = 3 outputs = list("result") - activators = list("compare", "on true result") + activators = list("compare", "on true result", "on false result") category_text = "Logic" autopulse = 1 + power_draw_per_use = 1 /obj/item/integrated_circuit/logic/on_data_written() if(autopulse == 1) @@ -14,10 +15,13 @@ /obj/item/integrated_circuit/logic/do_work() var/datum/integrated_io/O = outputs[1] - var/datum/integrated_io/P = activators[2] + var/datum/integrated_io/T = activators[2] + var/datum/integrated_io/F = activators[3] O.push_data() if(O.data) - P.push_data() + T.push_data() + else + F.push_data() /obj/item/integrated_circuit/logic/binary inputs = list("A","B") @@ -53,6 +57,15 @@ /obj/item/integrated_circuit/logic/binary/equals/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) return A.data == B.data +/obj/item/integrated_circuit/logic/binary/not_equals + name = "not equal gate" + desc = "This gate compares two values, and outputs the number one if both are different." + icon_state = "not equal" + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/logic/binary/not_equals/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data != B.data + /obj/item/integrated_circuit/logic/binary/and name = "and gate" desc = "This gate will output 'one' if both inputs evaluate to true." @@ -114,4 +127,4 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH /obj/item/integrated_circuit/logic/unary/not/do_check(var/datum/integrated_io/A) - return !A.data \ No newline at end of file + return !A.data diff --git a/code/modules/integrated_electronics/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm similarity index 90% rename from code/modules/integrated_electronics/manipulation.dm rename to code/modules/integrated_electronics/subtypes/manipulation.dm index f49b96d16c..65bae751e0 100644 --- a/code/modules/integrated_electronics/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -9,6 +9,7 @@ The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Note that the \ normal limitations to firearms, such as ammunition requirements and firing delays, still hold true if fired by the mechanism." complexity = 20 + w_class = ITEMSIZE_NORMAL inputs = list( "target X rel", "target Y rel" @@ -20,6 +21,7 @@ var/obj/item/weapon/gun/installed_gun = null spawn_flags = IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_COMBAT = 4) + power_draw_per_use = 50 // The targeting mechanism uses this. The actual gun uses its own cell for firing if it's an energy weapon. /obj/item/integrated_circuit/manipulation/weapon_firing/Destroy() qdel(installed_gun) @@ -106,20 +108,21 @@
    \ Pulsing the 'step towards dir' activator pin will cause the machine to move a meter in that direction, assuming it is not \ being held, or anchored in some way. It should be noted that the ability to move is dependant on the type of assembly that this circuit inhabits." + w_class = ITEMSIZE_NORMAL complexity = 20 inputs = list("dir num") outputs = list() activators = list("step towards dir") spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 100 /obj/item/integrated_circuit/manipulation/locomotion/do_work() ..() var/turf/T = get_turf(src) - if(T && istype(loc, /obj/item/device/electronic_assembly)) - var/obj/item/device/electronic_assembly/machine = loc - if(machine.anchored || !machine.can_move()) + if(T && assembly) + if(assembly.anchored || !assembly.can_move()) return - if(machine.loc == T) // Check if we're held by someone. If the loc is the floor, we're not held. + if(assembly.loc == T) // Check if we're held by someone. If the loc is the floor, we're not held. var/datum/integrated_io/wanted_dir = inputs[1] if(isnum(wanted_dir.data)) - step(machine, wanted_dir.data) \ No newline at end of file + step(assembly, wanted_dir.data) \ No newline at end of file diff --git a/code/modules/integrated_electronics/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm similarity index 96% rename from code/modules/integrated_electronics/memory.dm rename to code/modules/integrated_electronics/subtypes/memory.dm index f9cd109dce..49a049a982 100644 --- a/code/modules/integrated_electronics/memory.dm +++ b/code/modules/integrated_electronics/subtypes/memory.dm @@ -8,6 +8,7 @@ activators = list("set") category_text = "Memory" spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 1 /obj/item/integrated_circuit/memory/examine(mob/user) ..() @@ -33,15 +34,18 @@ name = "memory circuit" desc = "This circuit can store four pieces of data." icon_state = "memory4" + w_class = ITEMSIZE_SMALL complexity = 4 inputs = list("input pin 1","input pin 2","input pin 3","input pin 4") outputs = list("output pin 1","output pin 2","output pin 3","output pin 4") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 2 /obj/item/integrated_circuit/memory/large name = "large memory circuit" desc = "This big circuit can hold eight pieces of data." icon_state = "memory8" + w_class = ITEMSIZE_SMALL complexity = 8 inputs = list( "input pin 1", @@ -63,11 +67,13 @@ "output pin 8") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3) + power_draw_per_use = 4 /obj/item/integrated_circuit/memory/huge name = "large memory stick" desc = "This stick of memory can hold up up to sixteen pieces of data." icon_state = "memory16" + w_class = ITEMSIZE_NORMAL complexity = 16 inputs = list( "input pin 1", @@ -106,6 +112,7 @@ "output pin 16") spawn_flags = IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 4) + power_draw_per_use = 8 /obj/item/integrated_circuit/memory/constant name = "constant chip" diff --git a/code/modules/integrated_electronics/subtypes/power.dm b/code/modules/integrated_electronics/subtypes/power.dm new file mode 100644 index 0000000000..7b3256e06b --- /dev/null +++ b/code/modules/integrated_electronics/subtypes/power.dm @@ -0,0 +1,80 @@ +/obj/item/integrated_circuit/power/ + category_text = "Power - Active" + +/obj/item/integrated_circuit/power/transmitter + name = "power transmission circuit" + desc = "This can wirelessly transmit electricity from an assembly's battery towards a nearby machine." + icon_state = "power_transmitter" + extended_desc = "This circuit transmits 5 kJ of electricity every time the activator pin is pulsed. The input pin must be \ + a reference to a machine to send electricity to. This can be a battery, or anything containing a battery. The machine can exist \ + inside the assembly, or adjacent to it. The power is sourced from the assembly's power cell. If the target is outside of the assembly, \ + some power is lost due to ineffiency." + w_class = ITEMSIZE_SMALL + complexity = 16 + inputs = list("target ref") + outputs = list("target cell charge", "target cell max charge", "target cell percentage") + activators = list("transmit") + spawn_flags = IC_SPAWN_RESEARCH + origin_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 4, TECH_POWER = 4, TECH_MAGNET = 3) + power_draw_per_use = 500 // Inefficency has to come from somewhere. + var/amount_to_move = 5000 + +/obj/item/integrated_circuit/power/transmitter/large + name = "large power transmission circuit" + desc = "This can wirelessly transmit a lot of electricity from an assembly's battery towards a nearby machine. Warning: Do not operate in flammable enviroments." + extended_desc = "This circuit transmits 20 kJ of electricity every time the activator pin is pulsed. The input pin must be \ + a reference to a machine to send electricity to. This can be a battery, or anything containing a battery. The machine can exist \ + inside the assembly, or adjacent to it. The power is sourced from the assembly's power cell. If the target is outside of the assembly, \ + some power is lost due to ineffiency." + w_class = ITEMSIZE_LARGE + complexity = 32 + origin_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 4, TECH_POWER = 6, TECH_MAGNET = 5) + power_draw_per_use = 2000 + amount_to_move = 20000 + +/obj/item/integrated_circuit/power/transmitter/do_work() + set_pin_data(IC_OUTPUT, 1, null) + set_pin_data(IC_OUTPUT, 2, null) + set_pin_data(IC_OUTPUT, 3, null) + var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) + if(AM) + if(!assembly) + return FALSE // Pointless to do everything else if there's no battery to draw from. + + var/obj/item/weapon/cell/cell = null + if(istype(AM, /obj/item/weapon/cell)) // Is this already a cell? + cell = AM + else // If not, maybe there's a cell inside it? + for(var/obj/item/weapon/cell/C in AM.contents) + if(C) // Find one cell to charge. + cell = C + break + if(cell) + var/transfer_amount = amount_to_move + var/turf/A = get_turf(src) + var/turf/B = get_turf(AM) + if(A.Adjacent(B)) + if(AM.loc != assembly) + transfer_amount *= 0.8 // Losses due to distance. + + if(cell.fully_charged()) + return FALSE + + if(transfer_amount && assembly.draw_power(amount_to_move)) // CELLRATE is already handled in draw_power() + cell.give(transfer_amount * CELLRATE) + AM.update_icon() + + set_pin_data(IC_OUTPUT, 1, cell.charge) + set_pin_data(IC_OUTPUT, 2, cell.maxcharge) + set_pin_data(IC_OUTPUT, 3, cell.percent()) + return TRUE + return FALSE + +/obj/item/integrated_circuit/power/transmitter/large/do_work() + if(..()) // If the above code succeeds, do this below. + if(prob(2)) + var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() + sparks.set_up(3, 0, get_turf(src)) + sparks.start() + visible_message("\The [assembly] makes some sparks!") + qdel(sparks) \ No newline at end of file diff --git a/code/modules/integrated_electronics/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm similarity index 98% rename from code/modules/integrated_electronics/reagents.dm rename to code/modules/integrated_electronics/subtypes/reagents.dm index bd6cd1d933..d0c26baf66 100644 --- a/code/modules/integrated_electronics/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -23,6 +23,7 @@ spawn_flags = IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_BIO = 3) volume = 100 + power_draw_per_use = 20 /obj/item/integrated_circuit/reagent/smoke/do_work() playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) @@ -47,6 +48,7 @@ activators = list("inject") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH volume = 30 + power_draw_per_use = 15 /obj/item/integrated_circuit/reagent/injector/proc/inject_amount() var/datum/integrated_io/amount = inputs[2] @@ -92,6 +94,7 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2) var/transfer_amount = 10 + power_draw_per_use = 10 /obj/item/integrated_circuit/reagent/pump/on_data_written() var/datum/integrated_io/amount = inputs[3] diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm new file mode 100644 index 0000000000..c159522e97 --- /dev/null +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -0,0 +1,33 @@ +/obj/item/integrated_circuit/smart + category_text = "Smart" + +/obj/item/integrated_circuit/smart/basic_pathfinder + name = "basic pathfinder" + desc = "This complex circuit is able to determine what direction a given target is." + extended_desc = "This circuit uses a miniturized, integrated camera to determine where the target is. If the machine \ + cannot see the target, it will not be able to calculate the correct direction." + icon_state = "numberpad" + complexity = 25 + inputs = list("target ref") + outputs = list("dir") + activators = list("calculate dir") + spawn_flags = IC_SPAWN_RESEARCH + origin_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 5) + power_draw_per_use = 40 + +/obj/item/integrated_circuit/smart/basic_pathfinder/do_work() + var/datum/integrated_io/I = inputs[1] + var/datum/integrated_io/O = outputs[1] + O.data = null + + if(!isweakref(I.data)) + return + var/atom/A = I.data.resolve() + if(!A) + return + if(!(A in view(get_turf(src)))) + return // Can't see the target. + var/desired_dir = get_dir(get_turf(src), A) + if(desired_dir) + O.data = desired_dir + O.push_data() \ No newline at end of file diff --git a/code/modules/integrated_electronics/time.dm b/code/modules/integrated_electronics/subtypes/time.dm similarity index 97% rename from code/modules/integrated_electronics/time.dm rename to code/modules/integrated_electronics/subtypes/time.dm index 50bcc5e386..72766c0c48 100644 --- a/code/modules/integrated_electronics/time.dm +++ b/code/modules/integrated_electronics/subtypes/time.dm @@ -14,6 +14,7 @@ var/delay = 2 SECONDS activators = list("incoming pulse","outgoing pulse") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 2 /obj/item/integrated_circuit/time/delay/do_work() set waitfor = 0 // Don't sleep in a proc that is called by a processor. It'll delay the entire thing @@ -82,6 +83,7 @@ inputs = list("enable ticking") activators = list("outgoing pulse") spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 4 /obj/item/integrated_circuit/time/ticker/Destroy() if(is_running) @@ -116,6 +118,7 @@ complexity = 12 ticks_to_pulse = 2 spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 8 /obj/item/integrated_circuit/time/ticker/slow name = "slow ticker" @@ -124,6 +127,7 @@ complexity = 4 ticks_to_pulse = 6 spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 2 /obj/item/integrated_circuit/time/clock name = "integrated clock" @@ -132,6 +136,7 @@ inputs = list() outputs = list("time (string)", "hours (number)", "minutes (number)", "seconds (number)") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 /obj/item/integrated_circuit/time/clock/do_work() var/datum/integrated_io/time = outputs[1] diff --git a/code/modules/integrated_electronics/trig.dm b/code/modules/integrated_electronics/subtypes/trig.dm similarity index 97% rename from code/modules/integrated_electronics/trig.dm rename to code/modules/integrated_electronics/subtypes/trig.dm index e8e2e09ca9..b1a19f4a40 100644 --- a/code/modules/integrated_electronics/trig.dm +++ b/code/modules/integrated_electronics/subtypes/trig.dm @@ -7,6 +7,7 @@ category_text = "Trig" extended_desc = "Input and output are in degrees." autopulse = 1 + power_draw_per_use = 1 // Still cheap math. /obj/item/integrated_circuit/trig/on_data_written() if(autopulse == 1) @@ -118,7 +119,7 @@ /obj/item/integrated_circuit/trig/cotangent name = "cot circuit" - desc = "Outputs the cotangent of A. Has nothing to do with the security department." + desc = "Outputs the cotangent of A." icon_state = "cotangent" inputs = list("A") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH diff --git a/code/modules/integrated_electronics/~defines.dm b/code/modules/integrated_electronics/~defines.dm deleted file mode 100644 index 7aea6dabbb..0000000000 --- a/code/modules/integrated_electronics/~defines.dm +++ /dev/null @@ -1,6 +0,0 @@ -#undef IC_INPUT -#undef IC_OUTPUT -#undef IC_ACTIVATOR - -#undef DATA_CHANNEL -#undef PULSE_CHANNEL \ No newline at end of file diff --git a/code/modules/integrated_electronics/~defines/~defines.dm b/code/modules/integrated_electronics/~defines/~defines.dm new file mode 100644 index 0000000000..78ce72f365 --- /dev/null +++ b/code/modules/integrated_electronics/~defines/~defines.dm @@ -0,0 +1,16 @@ +#undef IC_INPUT +#undef IC_OUTPUT +#undef IC_ACTIVATOR + +#undef DATA_CHANNEL +#undef PULSE_CHANNEL + +#undef IC_SPAWN_DEFAULT +//#undef IC_SPAWN_RESEARCH // Research designs depend on this unfortunately. + +#undef IC_FORMAT_STRING +#undef IC_FORMAT_NUMBER +#undef IC_FORMAT_REF +#undef IC_FORMAT_LIST +#undef IC_FORMAT_ANY +#undef IC_FORMAT_PULSE \ No newline at end of file diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index 7c964b9d4b..31d99ebb05 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -252,8 +252,9 @@ for(var/iy = 0,iy < 5, iy++) for(var/ix = 0, ix < 5, ix++) mine_turf = locate(tx + ix, ty + iy, T.z) - if(mine_turf && mine_turf.has_resources) - resource_field += mine_turf + if(!istype(mine_turf, /turf/space/)) + if(mine_turf && mine_turf.has_resources) + resource_field += mine_turf if(!resource_field.len) system_error("resources depleted") diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 0a5c2d94c3..b9fc47e4e9 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -35,7 +35,7 @@ var/list/mining_overlay_cache = list() var/ignore_mapgen var/ore_types = list( - "iron" = /obj/item/weapon/ore/iron, + "hematite" = /obj/item/weapon/ore/iron, "uranium" = /obj/item/weapon/ore/uranium, "gold" = /obj/item/weapon/ore/gold, "silver" = /obj/item/weapon/ore/silver, @@ -44,7 +44,7 @@ var/list/mining_overlay_cache = list() "osmium" = /obj/item/weapon/ore/osmium, "hydrogen" = /obj/item/weapon/ore/hydrogen, "silicates" = /obj/item/weapon/ore/glass, - "carbonaceous rock" = /obj/item/weapon/ore/coal + "carbon" = /obj/item/weapon/ore/coal ) has_resources = 1 @@ -483,6 +483,11 @@ var/list/mining_overlay_cache = list() if(prob(50)) M.Stun(5) M.apply_effect(25, IRRADIATE) + if(prob(25)) + excavate_find(prob(5), finds[1]) + else if(rand(1,500) == 1) + visible_message("An old dusty crate was buried within!") + new /obj/structure/closet/crate/secure/loot(src) make_floor() update_icon(1) @@ -546,10 +551,10 @@ var/list/mining_overlay_cache = list() var/mineral_name if(rare_ore) - mineral_name = pickweight(list("uranium" = 10, "platinum" = 10, "iron" = 20, "coal" = 20, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20)) + mineral_name = pickweight(list("uranium" = 10, "platinum" = 10, "hematite" = 20, "carbon" = 20, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20)) else - mineral_name = pickweight(list("uranium" = 5, "platinum" = 5, "iron" = 35, "coal" = 35, "diamond" = 1, "gold" = 5, "silver" = 5, "phoron" = 10)) + mineral_name = pickweight(list("uranium" = 5, "platinum" = 5, "hematite" = 35, "carbon" = 35, "diamond" = 1, "gold" = 5, "silver" = 5, "phoron" = 10)) if(mineral_name && (mineral_name in ore_data)) mineral = ore_data[mineral_name] diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm index 7545e8bd34..8c174a2ff7 100644 --- a/code/modules/mob/language/outsider.dm +++ b/code/modules/mob/language/outsider.dm @@ -1,5 +1,5 @@ /datum/language/ling - name = "Changeling" + name = LANGUAGE_CHANGELING desc = "Although they are normally wary and suspicious of each other, changelings can commune over a distance." speech_verb = "says" colour = "changeling" @@ -38,7 +38,7 @@ ..(speaker,message,speaker_mask) /datum/language/vox - name = "Vox-pidgin" + name = LANGUAGE_VOX desc = "The common tongue of the various Vox ships making up the Shoal. It sounds like chaotic shrieking to everyone else." speech_verb = "shrieks" ask_verb = "creels" @@ -73,7 +73,7 @@ "d'rekkathnor", "khari'd", "gual'te", "nikka", "nikt'o", "barada", "kla'atu", "barhah", "hra" ,"zar'garis", "spiri", "malum") /datum/language/cult - name = "Occult" + name = LANGUAGE_OCCULT desc = "The initiated can share their thoughts by means defying all reason." speech_verb = "intones" ask_verb = "intones" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index b0110137f1..204730a8e8 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -437,7 +437,6 @@ stop_pulling() src << "You slipped on [slipped_on]!" playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - Stun(stun_duration) Weaken(Floor(stun_duration/2)) return 1 diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 5657ec03ea..532b2daa7c 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -24,3 +24,8 @@ var/pulse = PULSE_NORM //current pulse level var/does_not_breathe = 0 //Used for specific mobs that can't take advantage of the species flags (changelings) + + //these two help govern taste. The first is the last time a taste message was shown to the plaer. + //the second is the message in question. + var/last_taste_time = 0 + var/last_taste_text = "" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5d3e57ca74..5d40b57b1a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -685,12 +685,20 @@ if(istype(src.head, /obj/item/clothing/head/helmet/space/emergency)) number -= 2 if(istype(src.glasses, /obj/item/clothing/glasses/thermal)) - number -= 1 + var/obj/item/clothing/glasses/thermal/T = src.glasses + if(T.active) + number -= 1 + if(istype(src.glasses, /obj/item/clothing/glasses/night)) + var/obj/item/clothing/glasses/night/N = src.glasses + if(N.active) + number -= 1 if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses)) if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses/sechud/aviator)) var/obj/item/clothing/glasses/sunglasses/sechud/aviator/S = src.glasses - if(!S.on) + if(!S.active) number += 1 + else if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses/medhud/aviator)) + number += 0 else number += 1 if(istype(src.glasses, /obj/item/clothing/glasses/welding)) @@ -1315,7 +1323,8 @@ /mob/living/carbon/human/slip(var/slipped_on, stun_duration=8) if((species.flags & NO_SLIP) || (shoes && (shoes.item_flags & NOSLIP))) return 0 - ..(slipped_on,stun_duration) + if(..(slipped_on,stun_duration)) + return 1 /mob/living/carbon/human/proc/undislocate() set category = "Object" diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 67561125f1..7682f675b0 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -90,54 +90,6 @@ return 0 -/mob/living/carbon/human - var/next_sonar_ping = 0 - -/mob/living/carbon/human/proc/sonar_ping() - set name = "Listen In" - set desc = "Allows you to listen in to movement and noises around you." - set category = "Abilities" - - if(incapacitated()) - src << "You need to recover before you can use this ability." - return - if(world.time < next_sonar_ping) - src << "You need another moment to focus." - return - if(is_deaf() || is_below_sound_pressure(get_turf(src))) - src << "You are for all intents and purposes currently deaf!" - return - next_sonar_ping += 10 SECONDS - var/heard_something = FALSE - src << "You take a moment to listen in to your environment..." - for(var/mob/living/L in range(client.view, src)) - var/turf/T = get_turf(L) - if(!T || L == src || L.stat == DEAD || is_below_sound_pressure(T)) - continue - heard_something = TRUE - var/feedback = list() - feedback += "There are noises of movement " - var/direction = get_dir(src, L) - if(direction) - feedback += "towards the [dir2text(direction)], " - switch(get_dist(src, L) / client.view) - if(0 to 0.2) - feedback += "very close by." - if(0.2 to 0.4) - feedback += "close by." - if(0.4 to 0.6) - feedback += "some distance away." - if(0.6 to 0.8) - feedback += "further away." - else - feedback += "far away." - else // No need to check distance if they're standing right on-top of us - feedback += "right on top of you." - feedback += "" - src << jointext(feedback,null) - if(!heard_something) - src << "You hear no movement but your own." - #undef HUMAN_EATING_NO_ISSUE #undef HUMAN_EATING_NO_MOUTH #undef HUMAN_EATING_BLOCKED_MOUTH diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 7a27e3c341..0567be8e8f 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -175,3 +175,84 @@ output += "[IO.name] - OK\n" src << output + +/mob/living/carbon/human + var/next_sonar_ping = 0 + +/mob/living/carbon/human/proc/sonar_ping() + set name = "Listen In" + set desc = "Allows you to listen in to movement and noises around you." + set category = "Abilities" + + if(incapacitated()) + src << "You need to recover before you can use this ability." + return + if(world.time < next_sonar_ping) + src << "You need another moment to focus." + return + if(is_deaf() || is_below_sound_pressure(get_turf(src))) + src << "You are for all intents and purposes currently deaf!" + return + next_sonar_ping += 10 SECONDS + var/heard_something = FALSE + src << "You take a moment to listen in to your environment..." + for(var/mob/living/L in range(client.view, src)) + var/turf/T = get_turf(L) + if(!T || L == src || L.stat == DEAD || is_below_sound_pressure(T)) + continue + heard_something = TRUE + var/feedback = list() + feedback += "There are noises of movement " + var/direction = get_dir(src, L) + if(direction) + feedback += "towards the [dir2text(direction)], " + switch(get_dist(src, L) / client.view) + if(0 to 0.2) + feedback += "very close by." + if(0.2 to 0.4) + feedback += "close by." + if(0.4 to 0.6) + feedback += "some distance away." + if(0.6 to 0.8) + feedback += "further away." + else + feedback += "far away." + else // No need to check distance if they're standing right on-top of us + feedback += "right on top of you." + feedback += "" + src << jointext(feedback,null) + if(!heard_something) + src << "You hear no movement but your own." + +/mob/living/carbon/human/proc/regenerate() + set name = "Regenerate" + set desc = "Allows you to regrow limbs and heal organs." + set category = "Abilities" + + if(nutrition < 250) + to_chat(src, "You lack the biomass regrow anything!") + return + + nutrition -= 200 + + // Theoretically the only internal organ a slime will have + // is the slime core. but we might as well be thorough. + for(var/obj/item/organ/I in internal_organs) + if(I.damage > 0) + I.damage = 0 + to_chat(src, "You feel a soothing sensation within your [I.name]...") + + // Replace completely missing limbs. + for(var/limb_type in src.species.has_limbs) + var/obj/item/organ/external/E = src.organs_by_name[limb_type] + if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED)))) + E.removed() + qdel(E) + E = null + if(!E) + var/list/organ_data = src.species.has_limbs[limb_type] + var/limb_path = organ_data["path"] + var/obj/item/organ/O = new limb_path(src) + organ_data["descriptor"] = O.name + to_chat(src, "You feel a slithering sensation as your [O.name] reform.") + src.update_body() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 29048560bc..7ecf8cd8ef 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1337,6 +1337,9 @@ if(istype(G, /obj/item/clothing/glasses/sunglasses/sechud)) var/obj/item/clothing/glasses/sunglasses/sechud/S = G O = S.hud + if(istype(G, /obj/item/clothing/glasses/sunglasses/medhud)) + var/obj/item/clothing/glasses/sunglasses/medhud/M = G + O = M.hud if(istype(O)) O.process_hud(src) if(!druggy && !seer) see_invisible = SEE_INVISIBLE_LIVING diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm index c0e52f658a..1a9a986dd1 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm @@ -3,8 +3,8 @@ name_plural = "Vox" icobase = 'icons/mob/human_races/r_vox.dmi' deform = 'icons/mob/human_races/r_def_vox.dmi' - default_language = "Vox-pidgin" - language = "Galactic Common" + default_language = LANGUAGE_VOX + language = LANGUAGE_GALCOM num_alternate_languages = 1 unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong) rarity_value = 4 @@ -17,6 +17,8 @@ // taste_sensitivity = TASTE_DULL + slowdown = -0.5 + speech_sounds = list('sound/voice/shriek1.ogg') speech_chance = 20 @@ -37,7 +39,7 @@ spawn_flags = SPECIES_IS_WHITELISTED appearance_flags = HAS_EYE_COLOR | HAS_HAIR_COLOR - blood_color = "#2299FC" + blood_color = "#9066BD" flesh_color = "#808D11" reagent_tag = IS_VOX @@ -75,11 +77,11 @@ /datum/species/vox/equip_survival_gear(var/mob/living/carbon/human/H) H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask) if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/tank/phoron/vox(H), slot_back) + H.equip_to_slot_or_del(new /obj/item/weapon/tank/vox(H), slot_back) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/vox(H), slot_r_hand) H.internal = H.back else - H.equip_to_slot_or_del(new /obj/item/weapon/tank/phoron/vox(H), slot_r_hand) + H.equip_to_slot_or_del(new /obj/item/weapon/tank/vox(H), slot_r_hand) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/vox(H.back), slot_in_backpack) H.internal = H.r_hand H.internal = locate(/obj/item/weapon/tank) in H.contents diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 7b53d86214..6a3b4c7ad1 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -36,6 +36,8 @@ var/blood_volume = 560 // Initial blood volume. var/hunger_factor = 0.05 // Multiplier for hunger. + var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes. + var/min_age = 17 var/max_age = 70 diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm index 863fb7d029..e7b4588e8f 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -28,9 +28,9 @@ var/datum/species/shapeshifter/promethean/prometheans breath_type = null poison_type = null - gluttonous = 2 + gluttonous = 1 virus_immune = 1 - blood_volume = 600 + blood_volume = 560 min_age = 1 max_age = 5 brute_mod = 0.5 @@ -73,7 +73,8 @@ var/datum/species/shapeshifter/promethean/prometheans /mob/living/carbon/human/proc/shapeshifter_select_shape, /mob/living/carbon/human/proc/shapeshifter_select_colour, /mob/living/carbon/human/proc/shapeshifter_select_hair, - /mob/living/carbon/human/proc/shapeshifter_select_gender + /mob/living/carbon/human/proc/shapeshifter_select_gender, + /mob/living/carbon/human/proc/regenerate ) valid_transform_species = list("Human", "Unathi", "Tajara", "Skrell", "Diona", "Teshari", "Monkey") @@ -130,42 +131,14 @@ var/datum/species/shapeshifter/promethean/prometheans var/obj/effect/decal/cleanable/C = locate() in T if(C) qdel(C) - //TODO: gain nutriment - - // Regenerate limbs and heal damage if we have any. Copied from Bay xenos code. - - // Theoretically the only internal organ a slime will have - // is the slime core. but we might as well be thorough. - for(var/obj/item/organ/I in H.internal_organs) - if(I.damage > 0) - I.damage = max(I.damage - heal_rate, 0) - if (prob(5)) - H << "You feel a soothing sensation within your [I.name]..." - return 1 - - // Replace completely missing limbs. - for(var/limb_type in has_limbs) - var/obj/item/organ/external/E = H.organs_by_name[limb_type] - if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED)))) - E.removed() - qdel(E) - E = null - if(!E) - var/list/organ_data = has_limbs[limb_type] - var/limb_path = organ_data["path"] - var/obj/item/organ/O = new limb_path(H) - organ_data["descriptor"] = O.name - H << "You feel a slithering sensation as your [O.name] reforms." - H.update_body() - return 1 + H.nutrition += rand(15, 45) // Heal remaining damage. - if (H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss()) + if(H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss()) H.adjustBruteLoss(-heal_rate) H.adjustFireLoss(-heal_rate) H.adjustOxyLoss(-heal_rate) H.adjustToxLoss(-heal_rate) - return 1 /datum/species/shapeshifter/promethean/get_blood_colour(var/mob/living/carbon/human/H) return (H ? rgb(H.r_skin, H.g_skin, H.b_skin) : ..()) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index d68a399f7f..28eb05bc25 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -246,7 +246,8 @@ ) inherent_verbs = list( - /mob/living/carbon/human/proc/diona_split_nymph + /mob/living/carbon/human/proc/diona_split_nymph, + /mob/living/carbon/human/proc/regenerate ) warning_low_pressure = 50 diff --git a/code/modules/mob/living/carbon/taste.dm b/code/modules/mob/living/carbon/taste.dm new file mode 100644 index 0000000000..29e28a4559 --- /dev/null +++ b/code/modules/mob/living/carbon/taste.dm @@ -0,0 +1,60 @@ +/mob/living/carbon/proc/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) //we kind of 'sneak' a proc in here for ingesting stuff so we can play with it. + if(last_taste_time + 50 < world.time) + var/datum/reagents/temp = new(amount) //temporary holder used to analyse what gets transfered. + from.trans_to_holder(temp, amount, multiplier, 1) + + var/text_output = temp.generate_taste_message(src) + if(text_output != last_taste_text || last_taste_time + 100 < world.time) //We dont want to spam the same message over and over again at the person. Give it a bit of a buffer. + to_chat(src, "You can taste [text_output].")//no taste means there are too many tastes and not enough flavor. + + last_taste_time = world.time + last_taste_text = text_output + return from.trans_to_holder(target,amount,multiplier,copy) //complete transfer + +/* what this does: +catalogue the 'taste strength' of each one +calculate text size per text. +*/ +/datum/reagents/proc/generate_taste_message(mob/living/carbon/taster = null) + var/minimum_percent = 15 + if(ishuman(taster)) + var/mob/living/carbon/human/H = taster + minimum_percent = round(15/ (H.isSynthetic() ? TASTE_DULL : H.species.taste_sensitivity)) + + var/list/out = list() + var/list/tastes = list() //descriptor = strength + if(minimum_percent <= 100) + for(var/datum/reagent/R in reagent_list) + if(!R.taste_mult) + continue + if(R.id == "nutriment") //this is ugly but apparently only nutriment (not subtypes) has taste data TODO figure out why + var/list/taste_data = R.get_data() + for(var/taste in taste_data) + if(taste in tastes) + tastes[taste] += taste_data[taste] + else + tastes[taste] = taste_data[taste] + else + var/taste_desc = R.taste_description + var/taste_amount = get_reagent_amount(R.id) * R.taste_mult + if(R.taste_description in tastes) + tastes[taste_desc] += taste_amount + else + tastes[taste_desc] = taste_amount + + //deal with percentages + var/total_taste = 0 + for(var/taste_desc in tastes) + total_taste += tastes[taste_desc] + for(var/taste_desc in tastes) + var/percent = tastes[taste_desc]/total_taste * 100 + if(percent < minimum_percent) + continue + var/intensity_desc = "a hint of" + if(percent > minimum_percent * 2 || percent == 100) + intensity_desc = "the flavor of" + else if(percent > minimum_percent * 3) + intensity_desc = "the strong flavor of" + out += "[intensity_desc] [taste_desc]" + + return english_list(out, "something indescribable") \ No newline at end of file diff --git a/code/modules/projectiles/effects.dm b/code/modules/projectiles/effects.dm index 8089893b5e..71d5d12d2e 100644 --- a/code/modules/projectiles/effects.dm +++ b/code/modules/projectiles/effects.dm @@ -223,4 +223,25 @@ icon_state = "impact_lightning" light_range = 2 light_power = 0.5 - light_color = "#00C6FF" \ No newline at end of file + light_color = "#00C6FF" + +//---------------------------- +// Dark matter +//---------------------------- +/obj/effect/projectile/darkmatter/tracer + icon_state = "darkb" + light_range = 2 + light_power = 0.5 + light_color = "#8837A3" + +/obj/effect/projectile/darkmatter/muzzle + icon_state = "muzzle_darkb" + light_range = 2 + light_power = 0.5 + light_color = "#8837A3" + +/obj/effect/projectile/darkmatter/impact + icon_state = "impact_darkb" + light_range = 2 + light_power = 0.5 + light_color = "#8837A3" \ No newline at end of file diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm deleted file mode 100644 index 5889b523e1..0000000000 --- a/code/modules/projectiles/guns/alien.dm +++ /dev/null @@ -1,46 +0,0 @@ -// Alien pinning weapon. -/obj/item/weapon/gun/launcher/spikethrower - - name = "spike thrower" - desc = "A vicious alien projectile weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive." - - var/last_regen = 0 - var/spike_gen_time = 150 - var/max_spikes = 3 - var/spikes = 3 - release_force = 30 - icon = 'icons/obj/gun.dmi' - icon_state = "spikethrower3" - item_state = "spikethrower" - fire_sound_text = "a strange noise" - fire_sound = 'sound/weapons/bladeslice.ogg' - -/obj/item/weapon/gun/launcher/spikethrower/New() - ..() - processing_objects.Add(src) - last_regen = world.time - -/obj/item/weapon/gun/launcher/spikethrower/Destroy() - processing_objects.Remove(src) - ..() - -/obj/item/weapon/gun/launcher/spikethrower/process() - if(spikes < max_spikes && world.time > last_regen + spike_gen_time) - spikes++ - last_regen = world.time - update_icon() - -/obj/item/weapon/gun/launcher/spikethrower/examine(mob/user) - ..(user) - user << "It has [spikes] spike\s remaining." - -/obj/item/weapon/gun/launcher/spikethrower/update_icon() - icon_state = "spikethrower[spikes]" - -/obj/item/weapon/gun/launcher/spikethrower/update_release_force() - return - -/obj/item/weapon/gun/launcher/spikethrower/consume_next_projectile() - if(spikes < 1) return null - spikes-- - return new /obj/item/weapon/spike(src) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 6a02d8a38f..4443775df5 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -149,4 +149,4 @@ obj/item/weapon/gun/energy/staff/focus charge_cost = 200 user << "The [src.name] will now strike only a single person." projectile_type = "/obj/item/projectile/forcebolt" - */ + */ \ No newline at end of file diff --git a/code/modules/projectiles/guns/vox.dm b/code/modules/projectiles/guns/vox.dm new file mode 100644 index 0000000000..c1e0e84cf8 --- /dev/null +++ b/code/modules/projectiles/guns/vox.dm @@ -0,0 +1,139 @@ +/* + * Vox Spike Thrower + * Alien pinning weapon. + */ + +/obj/item/weapon/gun/launcher/spikethrower + name = "spike thrower" + desc = "A vicious alien projectile weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive." + + var/last_regen = 0 + var/spike_gen_time = 150 + var/max_spikes = 3 + var/spikes = 3 + release_force = 30 + icon = 'icons/obj/gun.dmi' + icon_state = "spikethrower3" + item_state = "spikethrower" + fire_sound_text = "a strange noise" + fire_sound = 'sound/weapons/bladeslice.ogg' + +/obj/item/weapon/gun/launcher/spikethrower/New() + ..() + processing_objects.Add(src) + last_regen = world.time + +/obj/item/weapon/gun/launcher/spikethrower/Destroy() + processing_objects.Remove(src) + ..() + +/obj/item/weapon/gun/launcher/spikethrower/process() + if(spikes < max_spikes && world.time > last_regen + spike_gen_time) + spikes++ + last_regen = world.time + update_icon() + +/obj/item/weapon/gun/launcher/spikethrower/examine(mob/user) + ..(user) + user << "It has [spikes] spike\s remaining." + +/obj/item/weapon/gun/launcher/spikethrower/update_icon() + icon_state = "spikethrower[spikes]" + +/obj/item/weapon/gun/launcher/spikethrower/update_release_force() + return + +/obj/item/weapon/gun/launcher/spikethrower/consume_next_projectile() + if(spikes < 1) return null + spikes-- + return new /obj/item/weapon/spike(src) + +/* + * Vox Darkmatter Cannon + */ +/obj/item/weapon/gun/energy/darkmatter + name = "dark matter gun" + desc = "A vicious alien beam weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive." + icon_state = "darkcannon" + item_state = "darkcannon" + fire_sound = 'sound/weapons/eLuger.ogg' + charge_cost = 600 + projectile_type = /obj/item/projectile/beam/darkmatter + self_recharge = 1 + accuracy = 2 + + firemodes = list( + list(mode_name="focused", burst=1, fire_delay=null, move_delay=null, burst_accuracy=list(2), dispersion=null, projectile_type=/obj/item/projectile/beam/darkmatter, charge_cost = 600), + list(mode_name="scatter burst", burst=8, fire_delay=null, move_delay=4, burst_accuracy=list(0, 0, 0, 0, 0, 0, 0, 0), dispersion=list(3, 3, 3, 3, 3, 3, 3, 3, 3), projectile_type=/obj/item/projectile/energy/darkmatter, charge_cost = 300), + ) + +/obj/item/projectile/beam/darkmatter + name = "dark matter bolt" + icon_state = "darkb" + damage = 60 + armor_penetration = 35 + damage_type = BRUTE + check_armour = "energy" + light_color = "#8837A3" + + embed_chance = 0 + + muzzle_type = /obj/effect/projectile/darkmatter/muzzle + tracer_type = /obj/effect/projectile/darkmatter/tracer + impact_type = /obj/effect/projectile/darkmatter/impact + +/obj/item/projectile/energy/darkmatter + name = "dark matter pellet" + icon_state = "dark_pellet" + damage = 20 + armor_penetration = 35 + damage_type = BRUTE + check_armour = "energy" + light_color = "#8837A3" + + embed_chance = 0 + +/* + * Vox Darkmatter Cannon + */ +/obj/item/weapon/gun/energy/sonic + name = "soundcannon" + desc = "A vicious alien sound weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive." + icon_state = "noise" + item_state = "noise" + fire_sound = 'sound/effects/basscannon.ogg' + self_recharge = 1 + charge_cost = 600 + + projectile_type=/obj/item/projectile/sonic/strong + + firemodes = list( + list(mode_name="normal", projectile_type=/obj/item/projectile/sonic/strong, charge_cost = 600), + list(mode_name="suppressive", projectile_type=/obj/item/projectile/sonic/weak, charge_cost = 300), + ) + +/obj/item/projectile/sonic + name = "sonic pulse" + icon_state = "sound" + damage = 15 + armor_penetration = 30 + damage_type = BRUTE + check_armour = "melee" + embed_chance = 0 + vacuum_traversal = 0 + +// var/amplitude = 10 //Roughly how loud it is, changes the way damage will work, and such + +/obj/item/projectile/sonic/weak + agony = 30 + +/obj/item/projectile/sonic/strong + damage = 45 + +//Already have thoughts on how to improve this, will take a day or two after initial testing. - Anewbe + +/obj/item/projectile/sonic/strong/on_hit(var/atom/movable/target, var/blocked = 0) + if(ismob(target)) + var/throwdir = get_dir(firer,target) + target.throw_at(get_edge_target_turf(target, throwdir), rand(1,6), 10) + return 1 \ No newline at end of file diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 1f0dd03854..bf83edecec 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -8,6 +8,7 @@ eyeblur = 4 var/frequency = 1 hitscan = 1 + embed_chance = 0 invisibility = 101 //beam projectiles are invisible as they are rendered by the effect engine light_range = 2 light_power = 0.5 diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index c45ea1917b..5345f06dc9 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -140,7 +140,7 @@ armor_penetration = 10 kill_count = 4 damage = 5 - agony = 70 + agony = 55 damage_type = BURN vacuum_traversal = 0 //Projectile disappears in empty space @@ -151,12 +151,12 @@ var/ear_safety = 0 ear_safety = M.get_ear_protection() if(ear_safety == 1) - M.Weaken(2) + M.confused += 150 else if (ear_safety > 1) - M.Weaken(1) + M.confused += 30 else if (!ear_safety) M.Stun(10) - M.Weaken(3) + M.Weaken(2) M.ear_damage += rand(1, 10) M.ear_deaf = max(M.ear_deaf,15) if (M.ear_damage >= 15) diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 7ce94948fc..8aba3c0928 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -156,4 +156,3 @@ nodamage = 1 damage_type = HALLOSS muzzle_type = /obj/effect/projectile/bullet/muzzle - diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index c2b4157ff3..49c1099184 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -383,7 +383,7 @@ return trans_to_holder(R, amount, multiplier, copy) if(type == CHEM_INGEST) var/datum/reagents/R = C.ingested - return trans_to_holder(R, amount, multiplier, copy) + return C.ingest(src, R, amount, multiplier, copy) if(type == CHEM_TOUCH) var/datum/reagents/R = C.touching return trans_to_holder(R, amount, multiplier, copy) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 29d997cde5..9e7fbd461f 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -14,6 +14,8 @@ var/name = "Reagent" var/id = "reagent" var/description = "A non-descript chemical." + var/taste_description = "bitterness" + var/taste_mult = 1 //how this taste compares to others. Higher values means it is more noticable var/datum/reagents/holder = null var/reagent_state = SOLID var/list/data = null diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm index 27f40820e7..f6208f59ff 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm @@ -2,6 +2,8 @@ data = new/list("donor" = null, "viruses" = null, "species" = "Human", "blood_DNA" = null, "blood_type" = null, "blood_colour" = "#A10808", "resistances" = null, "trace_chem" = null, "antibodies" = list()) name = "Blood" id = "blood" + taste_description = "iron" + taste_mult = 1.3 reagent_state = LIQUID metabolism = REM * 5 mrate_static = TRUE @@ -74,6 +76,7 @@ /datum/reagent/antibodies data = list("antibodies"=list()) name = "Antibodies" + taste_description = "slime" id = "antibodies" reagent_state = LIQUID color = "#0050F0" @@ -88,6 +91,7 @@ /datum/reagent/water name = "Water" id = "water" + taste_description = "water" description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen." reagent_state = LIQUID color = "#0064C877" @@ -150,6 +154,7 @@ name = "Welding fuel" id = "fuel" description = "Required for welders. Flamable." + taste_description = "gross metal" reagent_state = LIQUID color = "#660000" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index 94f433c55e..44ad6f24a2 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -2,13 +2,17 @@ name = "Aluminum" id = "aluminum" description = "A silvery white and ductile member of the boron group of chemical elements." + taste_description = "metal" + taste_mult = 1.1 reagent_state = SOLID color = "#A8A8A8" /datum/reagent/carbon name = "Carbon" id = "carbon" - description = "A chemical element, the builing block of life." + description = "A chemical element, the building block of life." + taste_description = "sour chalk" + taste_mult = 1.5 reagent_state = SOLID color = "#1C1300" ingest_met = REM * 5 @@ -37,6 +41,7 @@ name = "Chlorine" id = "chlorine" description = "A chemical element with a characteristic odour." + taste_description = "pool water" reagent_state = GAS color = "#808080" @@ -50,12 +55,14 @@ name = "Copper" id = "copper" description = "A highly ductile metal." + taste_description = "pennies" color = "#6E3B08" /datum/reagent/ethanol name = "Ethanol" //Parent class for all alcoholic reagents. id = "ethanol" description = "A well-known alcohol with a variety of applications." + taste_description = "pure alcohol" reagent_state = LIQUID color = "#404030" var/nutriment_factor = 0 @@ -142,6 +149,7 @@ name = "Fluorine" id = "fluorine" description = "A highly-reactive chemical element." + taste_description = "acid" reagent_state = GAS color = "#808080" @@ -155,6 +163,7 @@ name = "Hydrogen" id = "hydrogen" description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas." + taste_mult = 0 //no taste reagent_state = GAS color = "#808080" @@ -162,6 +171,7 @@ name = "Iron" id = "iron" description = "Pure iron is a metal." + taste_description = "metal" reagent_state = SOLID color = "#353535" @@ -173,6 +183,7 @@ name = "Lithium" id = "lithium" description = "A chemical element, used as antidepressant." + taste_description = "metal" reagent_state = SOLID color = "#808080" @@ -187,6 +198,7 @@ name = "Mercury" id = "mercury" description = "A chemical element." + taste_mult = 0 //mercury apparently is tasteless. IDK reagent_state = LIQUID color = "#484848" @@ -202,6 +214,7 @@ name = "Nitrogen" id = "nitrogen" description = "A colorless, odorless, tasteless gas." + taste_mult = 0 //no taste reagent_state = GAS color = "#808080" @@ -209,6 +222,7 @@ name = "Oxygen" id = "oxygen" description = "A colorless, odorless gas." + taste_mult = 0 reagent_state = GAS color = "#808080" @@ -220,6 +234,7 @@ name = "Phosphorus" id = "phosphorus" description = "A chemical element, the backbone of biological energy carriers." + taste_description = "vinegar" reagent_state = SOLID color = "#832828" @@ -227,6 +242,7 @@ name = "Potassium" id = "potassium" description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water." + taste_description = "sweetness" //potassium is bitter in higher doses but sweet in lower ones. reagent_state = SOLID color = "#A0A0A0" @@ -234,6 +250,7 @@ name = "Radium" id = "radium" description = "Radium is an alkaline earth metal. It is extremely radioactive." + taste_mult = 0 //Apparently radium is tasteless reagent_state = SOLID color = "#C7C7C7" @@ -266,6 +283,7 @@ name = "Sulphuric acid" id = "sacid" description = "A very corrosive mineral acid with the molecular formula H2SO4." + taste_description = "acid" reagent_state = LIQUID color = "#DB5008" metabolism = REM * 2 @@ -352,6 +370,7 @@ name = "Silicon" id = "silicon" description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon." + taste_mult = 0 reagent_state = SOLID color = "#A8A8A8" @@ -359,6 +378,7 @@ name = "Sodium" id = "sodium" description = "A chemical element, readily reacts with water." + taste_description = "salty metal" reagent_state = SOLID color = "#808080" @@ -366,6 +386,8 @@ name = "Sugar" id = "sugar" description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste." + taste_description = "sugar" + taste_mult = 1.8 reagent_state = SOLID color = "#FFFFFF" @@ -398,6 +420,7 @@ name = "Sulfur" id = "sulfur" description = "A chemical element with a pungent smell." + taste_description = "old eggs" reagent_state = SOLID color = "#BF8C00" @@ -405,5 +428,7 @@ name = "Tungsten" id = "tungsten" description = "A chemical element, and a strong oxidising agent." + taste_description = "metal" + taste_mult = 0 //no taste reagent_state = SOLID color = "#DCDCDC" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index eab46ba8a0..5cff9231a1 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -4,6 +4,7 @@ name = "Nutriment" id = "nutriment" description = "All the vitamins, minerals, and carbohydrates the body needs in pure form." + taste_mult = 4 reagent_state = SOLID metabolism = REM * 4 mrate_static = TRUE @@ -11,6 +12,26 @@ var/injectable = 0 color = "#664330" +/datum/reagent/nutriment/mix_data(var/list/newdata, var/newamount) + + if(!islist(newdata) || !newdata.len) + return + + //add the new taste data + for(var/taste in newdata) + if(taste in data) + data[taste] += newdata[taste] + else + data[taste] = newdata[taste] + + //cull all tastes below 10% of total + var/totalFlavor = 0 + for(var/taste in data) + totalFlavor += data[taste] + for(var/taste in data) + if(data[taste]/totalFlavor < 0.1) + data -= taste + /datum/reagent/nutriment/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(!injectable) M.adjustToxLoss(0.1 * removed) @@ -28,6 +49,7 @@ /datum/reagent/nutriment/glucose name = "Glucose" id = "glucose" + taste_description = "sweetness" color = "#FFFFFF" injectable = 1 @@ -35,6 +57,7 @@ /datum/reagent/nutriment/protein // Bad for Skrell! name = "animal protein" id = "protein" + taste_description = "some sort of meat" color = "#440000" /datum/reagent/nutriment/protein/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) @@ -58,12 +81,14 @@ /datum/reagent/nutriment/protein/egg // Also bad for skrell. name = "egg yolk" id = "egg" + taste_description = "egg" color = "#FFFFAA" /datum/reagent/nutriment/honey name = "Honey" id = "honey" description = "A golden yellow syrup, loaded with sugary sweetness." + taste_description = "sweetness" nutriment_factor = 10 color = "#FFFF00" @@ -92,6 +117,7 @@ name = "flour" id = "flour" description = "This is what you rub all over yourself to pretend to be a ghost." + taste_description = "chalky wheat" reagent_state = SOLID nutriment_factor = 1 color = "#FFFFFF" @@ -104,6 +130,8 @@ name = "Coco Powder" id = "coco" description = "A fatty, bitter paste made from coco beans." + taste_description = "bitterness" + taste_mult = 1.3 reagent_state = SOLID nutriment_factor = 5 color = "#302000" @@ -112,6 +140,8 @@ name = "Soysauce" id = "soysauce" description = "A salty sauce made from the soy plant." + taste_description = "umami" + taste_mult = 1.1 reagent_state = LIQUID nutriment_factor = 2 color = "#792300" @@ -120,6 +150,7 @@ name = "Ketchup" id = "ketchup" description = "Ketchup, catsup, whatever. It's tomato paste." + taste_description = "ketchup" reagent_state = LIQUID nutriment_factor = 5 color = "#731008" @@ -128,6 +159,8 @@ name = "Rice" id = "rice" description = "Enjoy the great taste of nothing." + taste_description = "rice" + taste_mult = 0.4 reagent_state = SOLID nutriment_factor = 1 color = "#FFFFFF" @@ -136,6 +169,8 @@ name = "Cherry Jelly" id = "cherryjelly" description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." + taste_description = "cherry" + taste_mult = 1.3 reagent_state = LIQUID nutriment_factor = 1 color = "#801E28" @@ -144,6 +179,8 @@ name = "Corn Oil" id = "cornoil" description = "An oil derived from various types of corn." + taste_description = "slime" + taste_mult = 0.1 reagent_state = LIQUID nutriment_factor = 20 color = "#302000" @@ -167,6 +204,8 @@ name = "Virus Food" id = "virusfood" description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce." + taste_description = "vomit" + taste_mult = 2 reagent_state = LIQUID nutriment_factor = 2 color = "#899613" @@ -175,6 +214,7 @@ name = "Sprinkles" id = "sprinkles" description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." + taste_description = "sugar" nutriment_factor = 1 color = "#FF00FF" @@ -182,6 +222,7 @@ name = "Mint" id = "mint" description = "Also known as Mentha." + taste_description = "mint" reagent_state = LIQUID color = "#CF3600" @@ -189,6 +230,7 @@ name = "Lipozine" id = "lipozine" description = "A chemical compound that causes a powerful fat-burning reaction." + taste_description = "mothballs" reagent_state = LIQUID color = "#BBEDA4" overdose = REAGENTS_OVERDOSE @@ -205,6 +247,7 @@ name = "Table Salt" id = "sodiumchloride" description = "A salt made of sodium chloride. Commonly used to season food." + taste_description = "salt" reagent_state = SOLID color = "#FFFFFF" overdose = REAGENTS_OVERDOSE @@ -213,6 +256,7 @@ name = "Black Pepper" id = "blackpepper" description = "A powder ground from peppercorns. *AAAACHOOO*" + taste_description = "pepper" reagent_state = SOLID color = "#000000" @@ -220,6 +264,8 @@ name = "Universal Enzyme" id = "enzyme" description = "A universal enzyme used in the preperation of certain chemicals and foods." + taste_description = "sweetness" + taste_mult = 0.7 reagent_state = LIQUID color = "#365E30" overdose = REAGENTS_OVERDOSE @@ -228,6 +274,8 @@ name = "Frost Oil" id = "frostoil" description = "A special oil that noticably chills the body. Extracted from Ice Peppers." + taste_description = "mint" + taste_mult = 1.5 reagent_state = LIQUID color = "#B31008" @@ -245,6 +293,8 @@ name = "Capsaicin Oil" id = "capsaicin" description = "This is what makes chilis hot." + taste_description = "hot peppers" + taste_mult = 1.5 reagent_state = LIQUID color = "#B31008" @@ -275,6 +325,8 @@ name = "Condensed Capsaicin" id = "condensedcapsaicin" description = "A chemical agent used for self-defense and in police work." + taste_description = "fire" + taste_mult = 10 reagent_state = LIQUID touch_met = 50 // Get rid of it quickly color = "#B31008" @@ -388,6 +440,7 @@ name = "Banana Juice" id = "banana" description = "The raw essence of a banana." + taste_description = "banana" color = "#C3AF00" glass_name = "banana juice" @@ -397,6 +450,7 @@ name = "Berry Juice" id = "berryjuice" description = "A delicious blend of several different kinds of berries." + taste_description = "berries" color = "#990066" glass_name = "berry juice" @@ -406,6 +460,7 @@ name = "Carrot juice" id = "carrotjuice" description = "It is just like a carrot but without crunching." + taste_description = "carrots" color = "#FF8C00" // rgb: 255, 140, 0 glass_name = "carrot juice" @@ -419,6 +474,7 @@ name = "Grape Juice" id = "grapejuice" description = "It's grrrrrape!" + taste_description = "grapes" color = "#863333" glass_name = "grape juice" @@ -449,6 +505,8 @@ name = "Lemon Juice" id = "lemonjuice" description = "This juice is VERY sour." + taste_description = "sourness" + taste_mult = 1.1 color = "#AFAF00" glass_name = "lemon juice" @@ -458,6 +516,8 @@ name = "Lime Juice" id = "limejuice" description = "The sweet-sour juice of limes." + taste_description = "sourness" + taste_mult = 1.8 color = "#365E30" glass_name = "lime juice" @@ -473,6 +533,7 @@ name = "Orange juice" id = "orangejuice" description = "Both delicious AND rich in Vitamin C, what more do you need?" + taste_description = "oranges" color = "#E78108" glass_name = "orange juice" @@ -488,6 +549,7 @@ name = "Poison Berry Juice" id = "poisonberryjuice" description = "A tasty juice blended from various kinds of very deadly and toxic berries." + taste_description = "berries" color = "#863353" strength = 5 @@ -498,6 +560,7 @@ name = "Potato Juice" id = "potato" description = "Juice of the potato. Bleh." + taste_description = "potatoes" nutrition = 2 color = "#302000" @@ -508,6 +571,7 @@ name = "Tomato Juice" id = "tomatojuice" description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?" + taste_description = "tomatoes" color = "#731008" glass_name = "tomato juice" @@ -523,6 +587,7 @@ name = "Watermelon Juice" id = "watermelonjuice" description = "Delicious juice made from watermelon." + taste_description = "sweet watermelon" color = "#B83333" glass_name = "watermelon juice" @@ -534,6 +599,7 @@ name = "Milk" id = "milk" description = "An opaque white liquid produced by the mammary glands of mammals." + taste_description = "milk" color = "#DFDFDF" glass_name = "milk" @@ -547,6 +613,7 @@ name = "Chocolate Milk" id = "chocolate_milk" description = "A delicious mixture of perfectly healthy mix and terrible chocolate." + taste_description = "chocolate milk" color = "#74533b" cup_icon_state = "cup_brown" @@ -568,6 +635,7 @@ name = "Cream" id = "cream" description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?" + taste_description = "thick milk" color = "#DFD7AF" glass_name = "cream" @@ -581,6 +649,7 @@ name = "Soy Milk" id = "soymilk" description = "An opaque white liquid made from soybeans." + taste_description = "soy milk" color = "#DFDFC7" glass_name = "soy milk" @@ -594,6 +663,7 @@ name = "Tea" id = "tea" description = "Tasty black tea, it has antioxidants, it's good for you!" + taste_description = "black tea" color = "#832700" adj_dizzy = -2 adj_drowsy = -1 @@ -617,6 +687,7 @@ name = "Iced Tea" id = "icetea" description = "No relation to a certain rap artist/ actor." + taste_description = "sweet tea" color = "#AC7F24" // rgb: 16, 64, 56 adj_temp = -5 @@ -632,6 +703,8 @@ name = "Coffee" id = "coffee" description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant." + taste_description = "coffee" + taste_mult = 1.3 color = "#482000" adj_dizzy = -5 adj_drowsy = -3 @@ -687,6 +760,7 @@ name = "Soy Latte" id = "soy_latte" description = "A nice and tasty beverage while you are reading your hippie books." + taste_description = "creamy coffee" color = "#C65905" adj_temp = 5 @@ -706,6 +780,7 @@ name = "Cafe Latte" id = "cafe_latte" description = "A nice, strong and tasty beverage while you are reading." + taste_description = "bitter cream" color = "#C65905" adj_temp = 5 @@ -724,6 +799,7 @@ name = "Hot Chocolate" id = "hot_coco" description = "Made with love! And cocoa beans." + taste_description = "creamy chocolate" reagent_state = LIQUID color = "#403010" nutrition = 2 @@ -740,6 +816,7 @@ name = "Soda Water" id = "sodawater" description = "A can of club soda. Why not make a scotch and soda?" + taste_description = "carbonated water" color = "#619494" adj_dizzy = -5 adj_drowsy = -3 @@ -753,6 +830,7 @@ name = "Grape Soda" id = "grapesoda" description = "Grapes made into a fine drank." + taste_description = "grape soda" color = "#421C52" adj_drowsy = -3 @@ -764,6 +842,7 @@ name = "Tonic Water" id = "tonic" description = "It tastes strange but at least the quinine keeps the Space Malaria at bay." + taste_description = "tart and fresh" color = "#619494" adj_dizzy = -5 @@ -776,8 +855,9 @@ /datum/reagent/drink/soda/lemonade name = "Lemonade" - description = "Oh the nostalgia..." id = "lemonade" + description = "Oh the nostalgia..." + taste_description = "lemonade" color = "#FFFF00" adj_temp = -5 @@ -787,8 +867,9 @@ /datum/reagent/drink/soda/kiraspecial name = "Kira Special" - description = "Long live the guy who everyone had mistaken for a girl. Baka!" id = "kiraspecial" + description = "Long live the guy who everyone had mistaken for a girl. Baka!" + taste_description = "fruity sweetness" color = "#CCCC99" adj_temp = -5 @@ -798,8 +879,9 @@ /datum/reagent/drink/soda/brownstar name = "Brown Star" - description = "It's not what it sounds like..." id = "brownstar" + description = "It's not what it sounds like..." + taste_description = "orange and cola soda" color = "#9F3400" adj_temp = -2 @@ -808,8 +890,9 @@ /datum/reagent/drink/milkshake name = "Milkshake" - description = "Glorious brainfreezing mixture." id = "milkshake" + description = "Glorious brainfreezing mixture." + taste_description = "vanilla milkshake" color = "#AEE5E4" adj_temp = -9 @@ -839,8 +922,9 @@ /datum/reagent/drink/rewriter name = "Rewriter" - description = "The secret of the sanctuary of the Libarian..." id = "rewriter" + description = "The secret of the sanctuary of the Libarian..." + taste_description = "citrus and coffee" color = "#485000" adj_temp = -5 @@ -855,6 +939,7 @@ name = "Nuka Cola" id = "nuka_cola" description = "Cola, cola never changes." + taste_description = "cola" color = "#100800" adj_temp = -5 adj_sleepy = -2 @@ -875,6 +960,7 @@ name = "Grenadine Syrup" id = "grenadine" description = "Made in the modern day with proper pomegranate substitute. Who uses real fruit, anyways?" + taste_description = "100% pure pomegranate" color = "#FF004F" glass_name = "grenadine syrup" @@ -884,6 +970,7 @@ name = "Space Cola" id = "cola" description = "A refreshing beverage." + taste_description = "cola" reagent_state = LIQUID color = "#100800" adj_drowsy = -3 @@ -897,6 +984,7 @@ name = "Mountain Wind" id = "spacemountainwind" description = "Blows right through you like a space wind." + taste_description = "sweet citrus soda" color = "#102000" adj_drowsy = -7 adj_sleepy = -1 @@ -910,6 +998,7 @@ name = "Dr. Gibb" id = "dr_gibb" description = "A delicious blend of 42 different flavours" + taste_description = "cherry soda" color = "#102000" adj_drowsy = -6 adj_temp = -5 @@ -921,6 +1010,7 @@ name = "Space-Up" id = "space_up" description = "Tastes like a hull breach in your mouth." + taste_description = "citrus soda" color = "#202800" adj_temp = -8 @@ -930,8 +1020,9 @@ /datum/reagent/drink/soda/lemon_lime name = "Lemon Lime" - description = "A tangy substance made of 0.5% natural citrus!" id = "lemon_lime" + description = "A tangy substance made of 0.5% natural citrus!" + taste_description = "tangy lime and lemon soda" color = "#878F00" adj_temp = -8 @@ -941,8 +1032,9 @@ /datum/reagent/drink/shirley_temple name = "Shirley Temple" - description = "A sweet concotion hated even by its namesake." id = "shirley_temple" + description = "A sweet concotion hated even by its namesake." + taste_description = "sweet ginger ale" color = "#EF304F" adj_temp = -8 @@ -952,8 +1044,9 @@ /datum/reagent/drink/roy_rogers name = "Roy Rogers" - description = "I'm a cowboy, on a steel horse I ride." id = "roy_rogers" + description = "I'm a cowboy, on a steel horse I ride." + taste_description = "cola and fruit" color = "#4F1811" adj_temp = -8 @@ -963,8 +1056,9 @@ /datum/reagent/drink/collins_mix name = "Collins Mix" - description = "Best hope it isn't a hoax." id = "collins_mix" + description = "Best hope it isn't a hoax." + taste_description = "gin and lemonade" color = "#D7D0B3" adj_temp = -8 @@ -974,8 +1068,9 @@ /datum/reagent/drink/arnold_palmer name = "Arnold Palmer" - description = "Tastes just like the old man." id = "arnold_palmer" + description = "Tastes just like the old man." + taste_description = "lemon and sweet tea" color = "#AF5517" adj_temp = -8 @@ -987,6 +1082,7 @@ name = "The Doctor's Delight" id = "doctorsdelight" description = "A gulp a day keeps the MediBot away. That's probably for the best." + taste_description = "homely fruit smoothie" reagent_state = LIQUID color = "#FF8CFF" nutrition = 1 @@ -1010,6 +1106,7 @@ name = "Dry Ramen" id = "dry_ramen" description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water." + taste_description = "dry cheap noodles" reagent_state = SOLID nutrition = 1 color = "#302000" @@ -1018,6 +1115,7 @@ name = "Hot Ramen" id = "hot_ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." + taste_description = "noodles and salt" reagent_state = LIQUID color = "#302000" nutrition = 5 @@ -1027,6 +1125,8 @@ name = "Hell Ramen" id = "hell_ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." + taste_description = "noodles and spice" + taste_mult = 1.7 reagent_state = LIQUID color = "#302000" nutrition = 5 @@ -1041,6 +1141,7 @@ name = "Ice" id = "ice" description = "Frozen water, your dentist wouldn't like you chewing this." + taste_description = "ice" reagent_state = SOLID color = "#619494" adj_temp = -5 @@ -1053,6 +1154,7 @@ name = "Nothing" id = "nothing" description = "Absolutely nothing." + taste_description = "nothing" glass_name = "nothing" glass_desc = "Absolutely nothing." @@ -1065,6 +1167,8 @@ name = "Absinthe" id = "absinthe" description = "Watch out that the Green Fairy doesn't come for you!" + taste_description = "licorice" + taste_mult = 1.5 color = "#33EE00" strength = 12 @@ -1075,6 +1179,7 @@ name = "Ale" id = "ale" description = "A dark alchoholic beverage made by malted barley and yeast." + taste_description = "hearty barley ale" color = "#4C3100" strength = 50 @@ -1085,6 +1190,7 @@ name = "Beer" id = "beer" description = "An alcoholic beverage made from malted grains, hops, yeast, and water." + taste_description = "beer" color = "#FFD300" strength = 50 nutriment_factor = 1 @@ -1102,6 +1208,8 @@ name = "Blue Curacao" id = "bluecuracao" description = "Exotically blue, fruity drink, distilled from oranges." + taste_description = "oranges" + taste_mult = 1.1 color = "#0000CD" strength = 15 @@ -1112,6 +1220,8 @@ name = "Cognac" id = "cognac" description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication." + taste_description = "rich and smooth alcohol" + taste_mult = 1.1 color = "#AB3C05" strength = 15 @@ -1122,6 +1232,8 @@ name = "Deadrum" id = "deadrum" description = "Popular with the sailors. Not very popular with everyone else." + taste_description = "butterscotch and salt" + taste_mult = 1.1 color = "#ECB633" strength = 50 @@ -1138,6 +1250,7 @@ name = "Gin" id = "gin" description = "It's gin. In space. I say, good sir." + taste_description = "an alcoholic christmas tree" color = "#0064C6" strength = 50 @@ -1180,6 +1293,8 @@ name = "Kahlua" id = "kahlua" description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" + taste_description = "spiked latte" + taste_mult = 1.1 color = "#4C3100" strength = 15 @@ -1190,6 +1305,7 @@ name = "Melon Liquor" id = "melonliquor" description = "A relatively sweet and fruity 46 proof liquor." + taste_description = "fruity alcohol" color = "#138808" // rgb: 19, 136, 8 strength = 50 @@ -1200,6 +1316,8 @@ name = "Rum" id = "rum" description = "Yohoho and all that." + taste_description = "spiked butterscotch" + taste_mult = 1.1 color = "#ECB633" strength = 15 @@ -1210,6 +1328,7 @@ name = "Sake" id = "sake" description = "Anime's favorite drink." + taste_description = "dry alcohol" color = "#DDDDDD" strength = 25 @@ -1220,6 +1339,7 @@ name = "Tequila" id = "tequilla" description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" + taste_description = "paint thinner" color = "#FFFF91" strength = 25 @@ -1230,6 +1350,7 @@ name = "Thirteen Loko" id = "thirteenloko" description = "A potent mixture of caffeine and alcohol." + taste_description = "battery acid" color = "#102000" strength = 25 nutriment_factor = 1 @@ -1250,6 +1371,8 @@ name = "Vermouth" id = "vermouth" description = "You suddenly feel a craving for a martini..." + taste_description = "dry alcohol" + taste_mult = 1.3 color = "#91FF91" // rgb: 145, 255, 145 strength = 15 @@ -1260,6 +1383,7 @@ name = "Vodka" id = "vodka" description = "Number one drink AND fueling choice for Russians worldwide." + taste_description = "grain alcohol" color = "#0064C8" // rgb: 0, 100, 200 strength = 15 @@ -1274,6 +1398,7 @@ name = "Whiskey" id = "whiskey" description = "A superb and well-aged single-malt whiskey. Damn." + taste_description = "molasses" color = "#4C3100" strength = 25 @@ -1284,6 +1409,7 @@ name = "Wine" id = "wine" description = "An premium alchoholic beverage made from distilled grape juice." + taste_description = "bitter sweetness" color = "#7E4043" // rgb: 126, 64, 67 strength = 15 @@ -1296,6 +1422,7 @@ name = "Acid Spit" id = "acidspit" description = "A drink for the daring, can be deadly if incorrectly prepared!" + taste_description = "bitter tang" reagent_state = LIQUID color = "#365000" strength = 30 @@ -1307,6 +1434,7 @@ name = "Allies Cocktail" id = "alliescocktail" description = "A drink made from your allies, not as sweet as when made from your enemies." + taste_description = "bitter sweetness" color = "#D8AC45" strength = 25 @@ -1317,6 +1445,7 @@ name = "Aloe" id = "aloe" description = "So very, very, very good." + taste_description = "sweet and creamy" color = "#B7EA75" strength = 15 @@ -1327,6 +1456,7 @@ name = "Amasec" id = "amasec" description = "Official drink of the Gun Club!" + taste_description = "dark and metallic" reagent_state = LIQUID color = "#FF975D" strength = 25 @@ -1338,6 +1468,7 @@ name = "Andalusia" id = "andalusia" description = "A nice, strangely named drink." + taste_description = "lemons" color = "#F4EA4A" strength = 15 @@ -1348,6 +1479,7 @@ name = "Anti-freeze" id = "antifreeze" description = "Ultimate refreshment." + taste_description = "ice cold vodka" color = "#56DEEA" strength = 12 adj_temp = 20 @@ -1360,6 +1492,7 @@ name = "Atomic Bomb" id = "atomicbomb" description = "Nuclear proliferation never tasted so good." + taste_description = "coffee, almonds, and whiskey, with a kick" reagent_state = LIQUID color = "#666300" strength = 10 @@ -1372,6 +1505,8 @@ name = "B-52" id = "b52" description = "Coffee, Irish Cream, and cognac. You will get bombed." + taste_description = "coffee, almonds, and whiskey" + taste_mult = 1.3 color = "#997650" strength = 12 @@ -1382,6 +1517,7 @@ name = "Bahama mama" id = "bahama_mama" description = "Tropical cocktail." + taste_description = "lime and orange" color = "#FF7F3B" strength = 25 @@ -1392,6 +1528,7 @@ name = "Banana Mama" id = "bananahonk" description = "A drink from Clown Heaven." + taste_description = "bananas and sugar" nutriment_factor = 1 color = "#FFFF91" strength = 12 @@ -1403,6 +1540,7 @@ name = "Barefoot" id = "barefoot" description = "Barefoot and pregnant" + taste_description = "creamy berries" color = "#FFCDEA" strength = 30 @@ -1413,6 +1551,8 @@ name = "Beepsky Smash" id = "beepskysmash" description = "Deny drinking this and prepare for THE LAW." + taste_description = "whiskey and citrus" + taste_mult = 2 reagent_state = LIQUID color = "#404040" strength = 12 @@ -1428,6 +1568,7 @@ name = "Bilk" id = "bilk" description = "This appears to be beer mixed with milk. Disgusting." + taste_description = "sour milk" color = "#895C4C" strength = 50 nutriment_factor = 2 @@ -1439,6 +1580,7 @@ name = "Black Russian" id = "blackrussian" description = "For the lactose-intolerant. Still as classy as a White Russian." + taste_description = "coffee" color = "#360000" strength = 15 @@ -1449,6 +1591,7 @@ name = "Bloody Mary" id = "bloodymary" description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice." + taste_description = "tomatoes with a hint of lime" color = "#B40000" strength = 15 @@ -1459,6 +1602,7 @@ name = "Booger" id = "booger" description = "Ewww..." + taste_description = "sweet 'n creamy" color = "#8CFF8C" strength = 30 @@ -1469,6 +1613,8 @@ name = "Brave Bull" id = "bravebull" description = "It's just as effective as Dutch-Courage!" + taste_description = "coffee and paint thinner" + taste_mult = 1.1 color = "#4C3100" strength = 15 @@ -1479,6 +1625,7 @@ name = "Changeling Sting" id = "changelingsting" description = "You take a tiny sip and feel a burning sensation..." + taste_description = "constantly changing flavors" color = "#2E6671" strength = 10 @@ -1489,6 +1636,7 @@ name = "Classic Martini" id = "martini" description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious." + taste_description = "dry class" color = "#0064C8" strength = 25 @@ -1499,6 +1647,7 @@ name = "Cuba Libre" id = "cubalibre" description = "Rum, mixed with cola. Viva la revolucion." + taste_description = "cola" color = "#3E1B00" strength = 30 @@ -1509,6 +1658,8 @@ name = "Demons Blood" id = "demonsblood" description = "AHHHH!!!!" + taste_description = "sweet tasting iron" + taste_mult = 1.5 color = "#820000" strength = 15 @@ -1519,6 +1670,7 @@ name = "Devils Kiss" id = "devilskiss" description = "Creepy time!" + taste_description = "bitter iron" color = "#A68310" strength = 15 @@ -1529,6 +1681,7 @@ name = "Driest Martini" id = "driestmartini" description = "Only for the experienced. You think you see sand floating in the glass." + taste_description = "a beach" nutriment_factor = 1 color = "#2E6671" strength = 12 @@ -1540,6 +1693,7 @@ name = "Gin Fizz" id = "ginfizz" description = "Refreshingly lemony, deliciously dry." + taste_description = "dry, tart lemons" color = "#FFFFAE" strength = 30 @@ -1550,6 +1704,7 @@ name = "Grog" id = "grog" description = "Watered-down rum, pirate approved!" + taste_description = "a poor excuse for alcohol" reagent_state = LIQUID color = "#FFBB00" strength = 100 @@ -1562,6 +1717,7 @@ name = "Erika Surprise" id = "erikasurprise" description = "The surprise is, it's green!" + taste_description = "tartness and bananas" color = "#2E6671" strength = 15 @@ -1572,6 +1728,8 @@ name = "Pan-Galactic Gargle Blaster" id = "gargleblaster" description = "Whoah, this stuff looks volatile!" + taste_description = "your brains smashed out by a lemon wrapped around a gold brick" + taste_mult = 5 reagent_state = LIQUID color = "#7F00FF" strength = 10 @@ -1583,6 +1741,7 @@ name = "Gin and Tonic" id = "gintonic" description = "An all time classic, mild cocktail." + taste_description = "mild and tart" color = "#0064C8" strength = 50 @@ -1593,6 +1752,8 @@ name = "Goldschlager" id = "goldschlager" description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break." + taste_description = "burning cinnamon" + taste_mult = 1.3 color = "#F4E46D" strength = 15 @@ -1603,6 +1764,7 @@ name = "Hippies' Delight" id = "hippiesdelight" description = "You just don't get it maaaan." + taste_description = "giving peace a chance" reagent_state = LIQUID color = "#FF88FF" strength = 15 @@ -1615,6 +1777,7 @@ name = "Hooch" id = "hooch" description = "Either someone's failure at cocktail making or attempt in alchohol production. In any case, do you really want to drink that?" + taste_description = "pure alcohol" color = "#4C3100" strength = 25 toxicity = 2 @@ -1626,7 +1789,7 @@ name = "Iced Beer" id = "iced_beer" description = "A beer which is so cold the air around it freezes." - + taste_description = "refreshingly cold" color = "#FFD300" strength = 50 adj_temp = -20 @@ -1640,6 +1803,7 @@ name = "Irish Car Bomb" id = "irishcarbomb" description = "Mmm, tastes like chocolate cake..." + taste_description = "delicious anger" color = "#2E6671" strength = 15 @@ -1650,6 +1814,7 @@ name = "Irish Coffee" id = "irishcoffee" description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning." + taste_description = "giving up on the day" color = "#4C3100" strength = 15 @@ -1660,7 +1825,8 @@ name = "Irish Cream" id = "irishcream" description = "Whiskey-imbued cream, what else would you expect from the Irish." - color = "#DDDD9A3" + taste_description = "creamy alcohol" + color = "#DDD9A3" strength = 25 glass_name = "Irish cream" @@ -1670,6 +1836,7 @@ name = "Long Island Iced Tea" id = "longislandicedtea" description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." + taste_description = "sweet tea, with a kick" color = "#895B1F" strength = 12 @@ -1680,6 +1847,7 @@ name = "Manhattan" id = "manhattan" description = "The Detective's undercover drink of choice. He never could stomach gin..." + taste_description = "mild dryness" color = "#C13600" strength = 15 @@ -1690,6 +1858,7 @@ name = "Manhattan Project" id = "manhattan_proj" description = "A scientist's drink of choice, for pondering ways to blow up the station." + taste_description = "death, the destroyer of worlds" color = "#C15D00" strength = 10 druggy = 30 @@ -1701,6 +1870,7 @@ name = "The Manly Dorf" id = "manlydorf" description = "Beer and Ale, brought together in a delicious mix. Intended for true men only." + taste_description = "hair on your chest and your chin" color = "#4C3100" strength = 25 @@ -1711,6 +1881,7 @@ name = "Margarita" id = "margarita" description = "On the rocks with salt on the rim. Arriba~!" + taste_description = "dry and salty" color = "#8CFF8C" strength = 15 @@ -1721,6 +1892,7 @@ name = "Mead" id = "mead" description = "A Viking's drink, though a cheap one." + taste_description = "sweet yet alcoholic" reagent_state = LIQUID color = "#FFBB00" strength = 30 @@ -1733,6 +1905,8 @@ name = "Moonshine" id = "moonshine" description = "You've really hit rock bottom now... your liver packed its bags and left last night." + taste_description = "bitterness" + taste_mult = 2.5 color = "#0064C8" strength = 12 @@ -1743,6 +1917,7 @@ name = "Neurotoxin" id = "neurotoxin" description = "A strong neurotoxin that puts the subject into a death-like state." + taste_description = "a numbing sensation" reagent_state = LIQUID color = "#2E2E61" strength = 10 @@ -1760,6 +1935,7 @@ name = "Patron" id = "patron" description = "Tequila with silver in it, a favorite of alcoholic women in the club scene." + taste_description = "metallic paint thinner" color = "#585840" strength = 30 @@ -1795,6 +1971,7 @@ name = "Red Mead" id = "red_mead" description = "The true Viking's drink! Even though it has a strange red color." + taste_description = "sweet and salty alcohol" color = "#C73C00" strength = 30 @@ -1805,6 +1982,7 @@ name = "Sbiten" id = "sbiten" description = "A spicy Vodka! Might be a little hot for the little guys!" + taste_description = "hot and spice" color = "#FFA371" strength = 15 adj_temp = 50 @@ -1817,6 +1995,7 @@ name = "Screwdriver" id = "screwdrivercocktail" description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious." + taste_description = "oranges" color = "#A68310" strength = 15 @@ -1827,6 +2006,8 @@ name = "Silencer" id = "silencer" description = "A drink from Mime Heaven." + taste_description = "a pencil eraser" + taste_mult = 1.2 nutriment_factor = 1 color = "#FFFFFF" strength = 12 @@ -1838,6 +2019,7 @@ name = "Singulo" id = "singulo" description = "A blue-space beverage!" + taste_description = "concentrated matter" color = "#2E6671" strength = 10 @@ -1848,6 +2030,7 @@ name = "Snow White" id = "snowwhite" description = "A cold refreshment" + taste_description = "refreshing cold" color = "#FFFFFF" strength = 30 @@ -1858,6 +2041,7 @@ name = "Sui Dream" id = "suidream" description = "Comprised of: White soda, blue curacao, melon liquor." + taste_description = "fruit" color = "#00A86B" strength = 100 @@ -1868,6 +2052,7 @@ name = "Syndicate Bomb" id = "syndicatebomb" description = "Tastes like terrorism!" + taste_description = "purified antagonism" color = "#2E6671" strength = 10 @@ -1878,6 +2063,7 @@ name = "Tequila Sunrise" id = "tequillasunrise" description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~" + taste_description = "oranges" color = "#FFE48C" strength = 25 @@ -1888,6 +2074,7 @@ name = "Three Mile Island Iced Tea" id = "threemileisland" description = "Made for a woman, strong enough for a man." + taste_description = "dry" color = "#666340" strength = 10 druggy = 50 @@ -1899,6 +2086,7 @@ name = "Toxins Special" id = "phoronspecial" description = "This thing is ON FIRE! CALL THE DAMN SHUTTLE!" + taste_description = "spicy toxins" reagent_state = LIQUID color = "#7F00FF" strength = 10 @@ -1912,6 +2100,7 @@ name = "Vodka Martini" id = "vodkamartini" description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious." + taste_description = "shaken, not stirred" color = "#0064C8" strength = 12 @@ -1923,6 +2112,7 @@ name = "Vodka and Tonic" id = "vodkatonic" description = "For when a gin and tonic isn't russian enough." + taste_description = "tart bitterness" color = "#0064C8" // rgb: 0, 100, 200 strength = 15 @@ -1934,6 +2124,7 @@ name = "White Russian" id = "whiterussian" description = "That's just, like, your opinion, man..." + taste_description = "coffee icecream" color = "#A68340" strength = 15 @@ -1945,6 +2136,7 @@ name = "Whiskey Cola" id = "whiskeycola" description = "Whiskey, mixed with cola. Surprisingly refreshing." + taste_description = "cola with an alcoholic undertone" color = "#3E1B00" strength = 25 @@ -1956,6 +2148,7 @@ name = "Whiskey Soda" id = "whiskeysoda" description = "For the more refined griffon." + taste_description = "carbonated whiskey" color = "#EAB300" strength = 15 @@ -1966,6 +2159,7 @@ name = "Special Blend Whiskey" id = "specialwhiskey" description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything. The smell of it singes your nostrils." + taste_description = "unspeakable whiskey bliss" color = "#523600" strength = 7 diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index 480bea3370..3712baa895 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -4,6 +4,7 @@ name = "Inaprovaline" id = "inaprovaline" description = "Inaprovaline is a synaptic stimulant and cardiostimulant. Commonly used to stabilize patients." + taste_description = "bitterness" reagent_state = LIQUID color = "#00BFFF" overdose = REAGENTS_OVERDOSE * 2 @@ -20,6 +21,8 @@ name = "Bicaridine" id = "bicaridine" description = "Bicaridine is an analgesic medication and can be used to treat blunt trauma." + taste_description = "bitterness" + taste_mult = 3 reagent_state = LIQUID color = "#BF0000" overdose = REAGENTS_OVERDOSE @@ -33,6 +36,7 @@ name = "Kelotane" id = "kelotane" description = "Kelotane is a drug used to treat burns." + taste_description = "bitterness" reagent_state = LIQUID color = "#FFA800" overdose = REAGENTS_OVERDOSE @@ -46,6 +50,8 @@ name = "Dermaline" id = "dermaline" description = "Dermaline is the next step in burn medication. Works twice as good as kelotane and enables the body to restore even the direst heat-damaged tissue." + taste_description = "bitterness" + taste_mult = 1.5 reagent_state = LIQUID color = "#FF8000" overdose = REAGENTS_OVERDOSE * 0.5 @@ -59,6 +65,7 @@ name = "Dylovene" id = "anti_toxin" description = "Dylovene is a broad-spectrum antitoxin." + taste_description = "a roll of gauze" reagent_state = LIQUID color = "#00A000" scannable = 1 @@ -96,6 +103,7 @@ name = "Dexalin" id = "dexalin" description = "Dexalin is used in the treatment of oxygen deprivation." + taste_description = "bitterness" reagent_state = LIQUID color = "#0080FF" overdose = REAGENTS_OVERDOSE @@ -113,6 +121,7 @@ name = "Dexalin Plus" id = "dexalinp" description = "Dexalin Plus is used in the treatment of oxygen deprivation. It is highly effective." + taste_description = "bitterness" reagent_state = LIQUID color = "#0040FF" mrate_static = TRUE //Until it's not crazy strong, at least @@ -131,6 +140,7 @@ name = "Tricordrazine" id = "tricordrazine" description = "Tricordrazine is a highly potent stimulant, originally derived from cordrazine. Can be used to treat a wide range of injuries." + taste_description = "bitterness" reagent_state = LIQUID color = "#8040FF" scannable = 1 @@ -145,6 +155,7 @@ name = "Cryoxadone" id = "cryoxadone" description = "A chemical mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 170K for it to metabolise correctly." + taste_description = "overripe bananas" reagent_state = LIQUID color = "#8080FF" metabolism = REM * 0.5 @@ -162,6 +173,7 @@ name = "Clonexadone" id = "clonexadone" description = "A liquid compound similar to that used in the cloning process. Can be used to 'finish' the cloning process when used in conjunction with a cryo tube." + taste_description = "rotten bananas" reagent_state = LIQUID color = "#80BFFF" metabolism = REM * 0.5 @@ -181,6 +193,7 @@ name = "Paracetamol" id = "paracetamol" description = "Most probably know this as Tylenol, but this chemical is a mild, simple painkiller." + taste_description = "bitterness" reagent_state = LIQUID color = "#C8A5DC" overdose = 60 @@ -199,6 +212,7 @@ name = "Tramadol" id = "tramadol" description = "A simple, yet effective painkiller." + taste_description = "sourness" reagent_state = LIQUID color = "#CB68FC" overdose = 30 @@ -217,6 +231,7 @@ name = "Oxycodone" id = "oxycodone" description = "An effective and very addictive painkiller." + taste_description = "bitterness" reagent_state = LIQUID color = "#800080" overdose = 20 @@ -239,6 +254,7 @@ name = "Synaptizine" id = "synaptizine" description = "Synaptizine is used to treat various diseases." + taste_description = "bitterness" reagent_state = LIQUID color = "#99CCFF" metabolism = REM * 0.05 @@ -261,6 +277,7 @@ name = "Alkysine" id = "alkysine" description = "Alkysine is a drug used to lessen the damage to neurological tissue after a catastrophic injury. Can heal brain tissue." + taste_description = "bitterness" reagent_state = LIQUID color = "#FFFF66" metabolism = REM * 0.25 @@ -277,6 +294,7 @@ name = "Imidazoline" id = "imidazoline" description = "Heals eye damage" + taste_description = "dull toxin" reagent_state = LIQUID color = "#C8A5DC" overdose = REAGENTS_OVERDOSE @@ -300,6 +318,7 @@ name = "Peridaxon" id = "peridaxon" description = "Used to encourage recovery of internal organs and nervous systems. Medicate cautiously." + taste_description = "bitterness" reagent_state = LIQUID color = "#561EC3" overdose = 10 @@ -371,6 +390,7 @@ name = "Ryetalyn" id = "ryetalyn" description = "Ryetalyn can cure all genetic abnomalities via a catalytic process." + taste_description = "acid" reagent_state = SOLID color = "#004000" overdose = REAGENTS_OVERDOSE @@ -391,6 +411,7 @@ name = "Ethylredoxrazine" id = "ethylredoxrazine" description = "A powerful oxidizer that reacts with ethanol." + taste_description = "bitterness" reagent_state = SOLID color = "#605048" overdose = REAGENTS_OVERDOSE @@ -411,6 +432,7 @@ name = "Hyronalin" id = "hyronalin" description = "Hyronalin is a medicinal drug used to counter the effect of radiation poisoning." + taste_description = "bitterness" reagent_state = LIQUID color = "#408000" metabolism = REM * 0.25 @@ -426,6 +448,7 @@ name = "Arithrazine" id = "arithrazine" description = "Arithrazine is an unstable medication used for the most extreme cases of radiation poisoning." + taste_description = "bitterness" reagent_state = LIQUID color = "#008000" metabolism = REM * 0.25 @@ -444,6 +467,7 @@ name = "Spaceacillin" id = "spaceacillin" description = "An all-purpose antiviral agent." + taste_description = "bitterness" reagent_state = LIQUID color = "#C1C1C1" metabolism = REM * 0.05 @@ -455,6 +479,7 @@ name = "Sterilizine" id = "sterilizine" description = "Sterilizes wounds in preparation for surgery and thoroughly removes blood." + taste_description = "bitterness" reagent_state = LIQUID color = "#C8A5DC" touch_met = 5 @@ -480,6 +505,7 @@ name = "Leporazine" id = "leporazine" description = "Leporazine can be use to stabilize an individuals body temperature." + taste_description = "bitterness" reagent_state = LIQUID color = "#C8A5DC" overdose = REAGENTS_OVERDOSE @@ -523,6 +549,7 @@ name = "Methylphenidate" id = "methylphenidate" description = "Improves the ability to concentrate." + taste_description = "bitterness" reagent_state = LIQUID color = "#BF80BF" metabolism = 0.01 @@ -544,6 +571,7 @@ name = "Citalopram" id = "citalopram" description = "Stabilizes the mind a little." + taste_description = "bitterness" reagent_state = LIQUID color = "#FF80FF" metabolism = 0.01 @@ -565,6 +593,7 @@ name = "Paroxetine" id = "paroxetine" description = "Stabilizes the mind greatly, but has a chance of adverse effects." + taste_description = "bitterness" reagent_state = LIQUID color = "#FF80BF" metabolism = 0.01 @@ -584,4 +613,25 @@ M << "Your mind feels much more stable." else M << "Your mind breaks apart..." - M.hallucination += 200 \ No newline at end of file + M.hallucination += 200 + +/datum/reagent/rezadone + name = "Rezadone" + id = "rezadone" + description = "A powder with almost magical properties, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects." + taste_description = "bitterness" + reagent_state = SOLID + color = "#669900" + overdose = REAGENTS_OVERDOSE + scannable = 1 + +/datum/reagent/rezadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + M.adjustCloneLoss(-20 * removed) + M.adjustOxyLoss(-2 * removed) + M.heal_organ_damage(20 * removed, 20 * removed) + M.adjustToxLoss(-20 * removed) + if(dose > 3) + M.status_flags &= ~DISFIGURED + if(dose > 10) + M.make_dizzy(5) + M.make_jittery(5) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm index 7a94e64ac6..4f8e17cb1e 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -4,6 +4,7 @@ name = "Crayon dust" id = "crayon_dust" description = "Intensely coloured powder obtained by grinding crayons." + taste_description = "powdered wax" reagent_state = LIQUID color = "#888888" overdose = 5 @@ -52,6 +53,7 @@ name = "Paint" id = "paint" description = "This paint will stick to almost any object." + taste_description = "chalk" reagent_state = LIQUID color = "#808080" overdose = REAGENTS_OVERDOSE * 0.5 @@ -108,6 +110,7 @@ name = "Adminordrazine" id = "adminordrazine" description = "It's magic. We don't have to explain it." + taste_description = "bwoink" reagent_state = LIQUID color = "#C8A5DC" affects_dead = 1 //This can even heal dead people. @@ -146,6 +149,7 @@ name = "Gold" id = "gold" description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known." + taste_description = "metal" reagent_state = SOLID color = "#F7C430" @@ -153,6 +157,7 @@ name = "Silver" id = "silver" description = "A soft, white, lustrous transition metal, it has the highest electrical conductivity of any element and the highest thermal conductivity of any metal." + taste_description = "metal" reagent_state = SOLID color = "#D0D0D0" @@ -160,6 +165,7 @@ name ="Uranium" id = "uranium" description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive." + taste_description = "metal" reagent_state = SOLID color = "#B8B8C0" @@ -181,6 +187,7 @@ name = "Adrenaline" id = "adrenaline" description = "Adrenaline is a hormone used as a drug to treat cardiac arrest and other cardiac dysrhythmias resulting in diminished or absent cardiac output." + taste_description = "bitterness" reagent_state = LIQUID color = "#C8A5DC" mrate_static = TRUE @@ -196,6 +203,7 @@ name = "Holy Water" id = "holywater" description = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality." + taste_description = "water" color = "#E0E8EF" mrate_static = TRUE @@ -217,6 +225,8 @@ name = "Ammonia" id = "ammonia" description = "A caustic substance commonly used in fertilizer or household cleaners." + taste_description = "mordant" + taste_mult = 2 reagent_state = GAS color = "#404030" @@ -224,6 +234,7 @@ name = "Diethylamine" id = "diethylamine" description = "A secondary amine, mildly corrosive." + taste_description = "iron" reagent_state = LIQUID color = "#604030" @@ -231,6 +242,7 @@ name = "Fluorosurfactant" id = "fluorosurfactant" description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." + taste_description = "metal" reagent_state = LIQUID color = "#9E6B38" @@ -238,6 +250,7 @@ name = "Foaming agent" id = "foaming_agent" description = "A agent that yields metallic foam when mixed with light metal and a strong acid." + taste_description = "metal" reagent_state = SOLID color = "#664B63" @@ -245,6 +258,7 @@ name = "Thermite" id = "thermite" description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls." + taste_description = "sweet tasting metal" reagent_state = SOLID color = "#673910" touch_met = 50 @@ -269,6 +283,7 @@ name = "Space cleaner" id = "cleaner" description = "A compound used to clean things. Now with 50% more sodium hypochlorite!" + taste_description = "sourness" reagent_state = LIQUID color = "#A5F0EE" touch_met = 50 @@ -317,6 +332,7 @@ name = "Space Lube" id = "lube" description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity." + taste_description = "slime" reagent_state = LIQUID color = "#009CA8" @@ -330,6 +346,7 @@ name = "Silicate" id = "silicate" description = "A compound that can be used to reinforce glass." + taste_description = "plastic" reagent_state = LIQUID color = "#C7FFFF" @@ -344,6 +361,7 @@ name = "Glycerol" id = "glycerol" description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." + taste_description = "sweetness" reagent_state = LIQUID color = "#808080" @@ -351,6 +369,7 @@ name = "Nitroglycerin" id = "nitroglycerin" description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." + taste_description = "oil" reagent_state = LIQUID color = "#808080" @@ -358,6 +377,8 @@ name = "Coolant" id = "coolant" description = "Industrial cooling substance." + taste_description = "sourness" + taste_mult = 1.1 reagent_state = LIQUID color = "#C8A5DC" @@ -365,12 +386,14 @@ name = "Ultra Glue" id = "glue" description = "An extremely powerful bonding agent." + taste_description = "a special education class" color = "#FFFFCC" /datum/reagent/woodpulp name = "Wood Pulp" id = "woodpulp" description = "A mass of wood fibers." + taste_description = "wood" reagent_state = LIQUID color = "#B97A57" @@ -378,6 +401,7 @@ name = "Luminol" id = "luminol" description = "A compound that interacts with blood on the molecular level." + taste_description = "metal" reagent_state = LIQUID color = "#F2F3F4" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 803de86b71..e13a73dd29 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -1,13 +1,14 @@ /* Toxins, poisons, venoms */ /datum/reagent/toxin - name = "Toxin" + name = "toxin" id = "toxin" description = "A toxic chemical." + taste_description = "bitterness" + taste_mult = 1.2 reagent_state = LIQUID color = "#CF3600" metabolism = REM * 0.25 // 0.05 by default. Hopefully enough to get some help, or die horribly, whatever floats your boat - mrate_static = TRUE var/strength = 4 // How much damage it deals per unit /datum/reagent/toxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) @@ -19,6 +20,7 @@ name = "Plasticide" id = "plasticide" description = "Liquid plastic, do not eat." + taste_description = "plastic" reagent_state = LIQUID color = "#CF3600" strength = 5 @@ -27,6 +29,7 @@ name = "Amatoxin" id = "amatoxin" description = "A powerful poison derived from certain species of mushroom." + taste_description = "mushroom" reagent_state = LIQUID color = "#792300" strength = 10 @@ -35,6 +38,7 @@ name = "Carpotoxin" id = "carpotoxin" description = "A deadly neurotoxin produced by the dreaded space carp." + taste_description = "fish" reagent_state = LIQUID color = "#003333" strength = 10 @@ -50,6 +54,7 @@ name = "Phoron" id = "phoron" description = "Phoron in its liquid form." + taste_mult = 1.5 reagent_state = LIQUID color = "#9D14DB" strength = 30 @@ -84,6 +89,8 @@ name = "Cyanide" id = "cyanide" description = "A highly toxic chemical." + taste_description = "almond" + taste_mult = 0.6 reagent_state = LIQUID color = "#CF3600" strength = 20 @@ -98,6 +105,7 @@ name = "Hyperzine" id = "hyperzine" description = "Hyperzine is a highly effective, long lasting, muscle stimulant." + taste_description = "bitterness" reagent_state = LIQUID color = "#FF3300" overdose = REAGENTS_OVERDOSE * 0.5 @@ -115,6 +123,8 @@ name = "Stimm" id = "stimm" description = "A homemade stimulant with some serious side-effects." + taste_description = "sweetness" + taste_mult = 1.8 color = "#d0583a" metabolism = REM * 3 overdose = 10 @@ -135,6 +145,7 @@ name = "Potassium Chloride" id = "potassium_chloride" description = "A delicious salt that stops the heart when injected into cardiac muscle." + taste_description = "salt" reagent_state = SOLID color = "#FFFFFF" strength = 0 @@ -154,6 +165,7 @@ name = "Potassium Chlorophoride" id = "potassium_chlorophoride" description = "A specific chemical based on Potassium Chloride to stop the heart for surgery. Not safe to eat!" + taste_description = "salt" reagent_state = SOLID color = "#FFFFFF" strength = 10 @@ -173,6 +185,7 @@ name = "Zombie Powder" id = "zombiepowder" description = "A strong neurotoxin that puts the subject into a death-like state." + taste_description = "numbness" reagent_state = SOLID color = "#669900" metabolism = REM @@ -198,6 +211,8 @@ name = "fertilizer" id = "fertilizer" description = "A chemical mix good for growing plants with." + taste_description = "plant food" + taste_mult = 0.5 reagent_state = LIQUID strength = 0.5 // It's not THAT poisonous. color = "#664330" @@ -218,6 +233,7 @@ name = "Plant-B-Gone" id = "plantbgone" description = "A harmful toxic mixture to kill plantlife. Do not ingest!" + taste_mult = 1 reagent_state = LIQUID color = "#49002E" strength = 4 @@ -246,6 +262,7 @@ name = "Polytrinic acid" id = "pacid" description = "Polytrinic acid is a an extremely corrosive chemical substance." + taste_description = "acid" reagent_state = LIQUID color = "#8E18A9" power = 10 @@ -255,6 +272,7 @@ name = "Lexorin" id = "lexorin" description = "Lexorin temporarily stops respiration. Causes tissue damage." + taste_description = "acid" reagent_state = LIQUID color = "#C8A5DC" overdose = REAGENTS_OVERDOSE @@ -275,6 +293,8 @@ name = "Unstable mutagen" id = "mutagen" description = "Might cause unpredictable mutations. Keep away from children." + taste_description = "slime" + taste_mult = 0.9 reagent_state = LIQUID color = "#13BC5E" @@ -310,6 +330,8 @@ name = "Slime Jelly" id = "slimejelly" description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL." + taste_description = "slime" + taste_mult = 1.3 reagent_state = LIQUID color = "#801E28" @@ -326,6 +348,7 @@ name = "Soporific" id = "stoxin" description = "An effective hypnotic used to treat insomnia." + taste_description = "bitterness" reagent_state = LIQUID color = "#009CA8" metabolism = REM * 0.5 @@ -360,6 +383,7 @@ name = "Chloral Hydrate" id = "chloralhydrate" description = "A powerful sedative." + taste_description = "bitterness" reagent_state = SOLID color = "#000067" metabolism = REM * 0.5 @@ -393,6 +417,7 @@ name = "Beer" id = "beer2" description = "An alcoholic beverage made from malted grains, hops, yeast, and water. The fermentation appears to be incomplete." //If the players manage to analyze this, they deserve to know something is wrong. + taste_description = "beer" reagent_state = LIQUID color = "#FFD300" @@ -404,6 +429,8 @@ name = "Space drugs" id = "space_drugs" description = "An illegal chemical compound used as drug." + taste_description = "bitterness" + taste_mult = 0.4 reagent_state = LIQUID color = "#60A584" metabolism = REM * 0.5 @@ -427,6 +454,7 @@ name = "Serotrotium" id = "serotrotium" description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." + taste_description = "bitterness" reagent_state = LIQUID color = "#202040" metabolism = REM * 0.25 @@ -443,6 +471,7 @@ name = "Cryptobiolin" id = "cryptobiolin" description = "Cryptobiolin causes confusion and dizzyness." + taste_description = "sourness" reagent_state = LIQUID color = "#000055" metabolism = REM * 0.5 @@ -461,6 +490,7 @@ name = "Impedrezene" id = "impedrezene" description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." + taste_description = "numbness" reagent_state = LIQUID color = "#C8A5DC" overdose = REAGENTS_OVERDOSE @@ -480,6 +510,7 @@ name = "Mindbreaker Toxin" id = "mindbreaker" description = "A powerful hallucinogen, it can cause fatal effects in users." + taste_description = "sourness" reagent_state = LIQUID color = "#B31008" metabolism = REM * 0.25 @@ -498,6 +529,7 @@ name = "Psilocybin" id = "psilocybin" description = "A strong psycotropic derived from certain species of mushroom." + taste_description = "mushroom" color = "#E700E7" overdose = REAGENTS_OVERDOSE metabolism = REM * 0.5 @@ -538,6 +570,7 @@ name = "Nicotine" id = "nicotine" description = "A highly addictive stimulant extracted from the tobacco plant." + taste_description = "bitterness" reagent_state = LIQUID color = "#181818" @@ -547,6 +580,7 @@ name = "Mutation Toxin" id = "mutationtoxin" description = "A corruptive toxin produced by slimes." + taste_description = "sludge" reagent_state = LIQUID color = "#13BC5E" @@ -573,6 +607,7 @@ name = "Docility Toxin" id = "docilitytoxin" description = "A corruptive toxin produced by slimes." + taste_description = "sludge" reagent_state = LIQUID color = "#FF69B4" diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 7ee525fc0b..aa952915c3 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -57,7 +57,7 @@ safe_thing = victim.glasses if(safe_thing) - trans = reagents.trans_to_obj(safe_thing, amount_per_transfer_from_this) + trans = reagents.splash(safe_thing, amount_per_transfer_from_this, max_spill=30) user.visible_message("[user] tries to squirt something into [target]'s eyes, but fails!", "You transfer [trans] units of the solution.") return @@ -67,14 +67,15 @@ user.attack_log += text("\[[time_stamp()]\] Used the [name] to squirt [M.name] ([M.key]). Reagents: [contained]") msg_admin_attack("[user.name] ([user.ckey]) squirted [M.name] ([M.key]) with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)") - trans = reagents.trans_to_mob(target, reagents.total_volume, CHEM_INGEST) + trans += reagents.splash(target, reagents.total_volume/2, max_spill=30) + trans += reagents.trans_to_mob(target, reagents.total_volume/2, CHEM_BLOOD) //I guess it gets into the bloodstream through the eyes or something user.visible_message("[user] squirts something into [target]'s eyes!", "You transfer [trans] units of the solution.") return else - trans = reagents.trans_to(target, amount_per_transfer_from_this) //sprinkling reagents on generic non-mobs + trans = reagents.splash(target, amount_per_transfer_from_this, max_spill=30) //sprinkling reagents on generic non-mobs user << "You transfer [trans] units of the solution." else // Taking from something diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 2da4b59ee2..6aa703d2d4 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -12,9 +12,15 @@ var/dried_type = null var/dry = 0 var/nutriment_amt = 0 + var/list/nutriment_desc = list("food" = 1) center_of_mass = list("x"=16, "y"=16) w_class = ITEMSIZE_SMALL +/obj/item/weapon/reagent_containers/food/snacks/New() + ..() + if(nutriment_amt) + reagents.add_reagent("nutriment",nutriment_amt,nutriment_desc) + /obj/item/weapon/reagent_containers/food/snacks/New() ..() if(nutriment_amt) @@ -261,10 +267,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#468C00" center_of_mass = list("x"=17, "y"=11) + nutriment_amt = 8 + nutriment_desc = list("apples" = 3,"salad" = 5) /obj/item/weapon/reagent_containers/food/snacks/aesirsalad/New() ..() - reagents.add_reagent("nutriment", 8) reagents.add_reagent("doctorsdelight", 8) reagents.add_reagent("tricordrazine", 8) bitesize = 3 @@ -276,10 +283,11 @@ trash = /obj/item/trash/candy filling_color = "#7D5F46" center_of_mass = list("x"=15, "y"=15) + nutriment_amt = 1 + nutriment_desc = list("candy" = 1) /obj/item/weapon/reagent_containers/food/snacks/candy/New() ..() - reagents.add_reagent("nutriment", 1) reagents.add_reagent("sugar", 3) bitesize = 2 @@ -288,10 +296,11 @@ desc = "SwoleMAX brand protein bars, guaranteed to get you feeling perfectly overconfident." icon_state = "proteinbar" trash = /obj/item/trash/candy/proteinbar + nutriment_amt = 9 + nutriment_desc = list("candy" = 1, "protein" = 8) /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar/New() ..() - reagents.add_reagent("nutriment", 9) reagents.add_reagent("protein", 4) reagents.add_reagent("sugar", 4) bitesize = 6 @@ -300,10 +309,11 @@ name = "Donor Candy" desc = "A little treat for blood donors." trash = /obj/item/trash/candy + nutriment_amt = 9 + nutriment_desc = list("candy" = 10) /obj/item/weapon/reagent_containers/food/snacks/candy/donor/New() ..() - reagents.add_reagent("nutriment", 10) reagents.add_reagent("sugar", 3) bitesize = 5 @@ -313,10 +323,11 @@ icon_state = "candy_corn" filling_color = "#FFFCB0" center_of_mass = list("x"=14, "y"=10) + nutriment_amt = 4 + nutriment_desc = list("candy corn" = 4) /obj/item/weapon/reagent_containers/food/snacks/candy_corn/New() ..() - reagents.add_reagent("nutriment", 4) reagents.add_reagent("sugar", 2) bitesize = 2 @@ -327,10 +338,11 @@ trash = /obj/item/trash/chips filling_color = "#E8C31E" center_of_mass = list("x"=15, "y"=15) + nutriment_amt = 3 + nutriment_desc = list("salt" = 1, "chips" = 2) /obj/item/weapon/reagent_containers/food/snacks/chips/New() ..() - reagents.add_reagent("nutriment", 3) bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/cookie @@ -339,10 +351,11 @@ icon_state = "COOKIE!!!" filling_color = "#DBC94F" center_of_mass = list("x"=17, "y"=18) + nutriment_amt = 5 + nutriment_desc = list("sweetness" = 3, "cookie" = 2) /obj/item/weapon/reagent_containers/food/snacks/cookie/New() ..() - reagents.add_reagent("nutriment", 5) bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/chocolatebar @@ -351,10 +364,11 @@ icon_state = "chocolatebar" filling_color = "#7D5F46" center_of_mass = list("x"=15, "y"=15) + nutriment_amt = 2 + nutriment_desc = list("chocolate" = 5) /obj/item/weapon/reagent_containers/food/snacks/chocolatebar/New() ..() - reagents.add_reagent("nutriment", 2) reagents.add_reagent("sugar", 2) reagents.add_reagent("coco", 2) bitesize = 2 @@ -365,10 +379,11 @@ icon_state = "chocolateegg" filling_color = "#7D5F46" center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 3 + nutriment_desc = list("chocolate" = 5) /obj/item/weapon/reagent_containers/food/snacks/chocolateegg/New() ..() - reagents.add_reagent("nutriment", 3) reagents.add_reagent("sugar", 2) reagents.add_reagent("coco", 2) bitesize = 2 @@ -380,11 +395,13 @@ filling_color = "#D9C386" var/overlay_state = "box-donut1" center_of_mass = list("x"=13, "y"=16) + nutriment_desc = list("sweetness", "donut") /obj/item/weapon/reagent_containers/food/snacks/donut/normal name = "donut" desc = "Goes great with Robust Coffee." icon_state = "donut1" + nutriment_amt = 3 /obj/item/weapon/reagent_containers/food/snacks/donut/normal/New() ..() @@ -403,10 +420,10 @@ desc = "Like life, it never quite tastes the same." icon_state = "donut1" filling_color = "#ED11E6" + nutriment_amt = 2 /obj/item/weapon/reagent_containers/food/snacks/donut/chaos/New() ..() - reagents.add_reagent("nutriment", 2) reagents.add_reagent("sprinkles", 1) bitesize = 10 var/chaosselect = pick(1,2,3,4,5,6,7,8,9,10) @@ -443,10 +460,10 @@ icon_state = "jdonut1" filling_color = "#ED1169" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 3 /obj/item/weapon/reagent_containers/food/snacks/donut/jelly/New() ..() - reagents.add_reagent("nutriment", 3) reagents.add_reagent("sprinkles", 1) reagents.add_reagent("berryjuice", 5) bitesize = 5 @@ -462,10 +479,10 @@ icon_state = "jdonut1" filling_color = "#ED1169" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 3 /obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly/New() ..() - reagents.add_reagent("nutriment", 3) reagents.add_reagent("sprinkles", 1) reagents.add_reagent("slimejelly", 5) bitesize = 5 @@ -481,10 +498,10 @@ icon_state = "jdonut1" filling_color = "#ED1169" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 3 /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly/New() ..() - reagents.add_reagent("nutriment", 3) reagents.add_reagent("sprinkles", 1) reagents.add_reagent("cherryjelly", 5) bitesize = 5 @@ -605,10 +622,11 @@ desc = "We all love tofu." filling_color = "#FFFEE0" center_of_mass = list("x"=17, "y"=10) + nutriment_amt = 3 + nutriment_desc = list("tofu" = 3, "goeyness" = 3) /obj/item/weapon/reagent_containers/food/snacks/tofu/New() ..() - reagents.add_reagent("nutriment", 3) src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tofurkey @@ -617,10 +635,11 @@ icon_state = "tofurkey" filling_color = "#FFFEE0" center_of_mass = list("x"=16, "y"=8) + nutriment_amt = 12 + nutriment_desc = list("turkey" = 3, "tofu" = 5, "goeyness" = 4) /obj/item/weapon/reagent_containers/food/snacks/tofurkey/New() ..() - reagents.add_reagent("nutriment", 12) reagents.add_reagent("stoxin", 3) bitesize = 3 @@ -630,10 +649,11 @@ icon_state = "stuffing" filling_color = "#C9AC83" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 3 + nutriment_desc = list("dryness" = 2, "bread" = 2) /obj/item/weapon/reagent_containers/food/snacks/stuffing/New() ..() - reagents.add_reagent("nutriment", 3) bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/carpmeat @@ -668,10 +688,11 @@ icon_state = "hugemushroomslice" filling_color = "#E0D7C5" center_of_mass = list("x"=17, "y"=16) + nutriment_amt = 3 + nutriment_desc = list("raw" = 2, "mushroom" = 2) /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice/New() ..() - reagents.add_reagent("nutriment", 3) reagents.add_reagent("psilocybin", 3) src.bitesize = 6 @@ -681,10 +702,11 @@ icon_state = "tomatomeat" filling_color = "#DB0000" center_of_mass = list("x"=17, "y"=16) + nutriment_amt = 3 + nutriment_desc = list("raw" = 2, "tomato" = 3) /obj/item/weapon/reagent_containers/food/snacks/tomatomeat/New() ..() - reagents.add_reagent("nutriment", 3) src.bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/bearmeat @@ -820,10 +842,11 @@ icon_state = "ghostburger" filling_color = "#FFF2FF" center_of_mass = list("x"=16, "y"=11) + nutriment_desc = list("buns" = 3, "spookiness" = 3) + nutriment_amt = 2 /obj/item/weapon/reagent_containers/food/snacks/ghostburger/New() ..() - reagents.add_reagent("nutriment", 2) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/human @@ -847,11 +870,12 @@ desc = "The cheese adds a good flavor." icon_state = "cheeseburger" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 2 + nutriment_desc = list("cheese" = 2, "bun" = 2) /obj/item/weapon/reagent_containers/food/snacks/cheeseburger/New() ..() reagents.add_reagent("protein", 2) - reagents.add_reagent("nutriment", 2) /obj/item/weapon/reagent_containers/food/snacks/monkeyburger name = "burger" @@ -859,11 +883,12 @@ icon_state = "hburger" filling_color = "#D63C3C" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 3 + nutriment_desc = list("bun" = 2) /obj/item/weapon/reagent_containers/food/snacks/monkeyburger/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fishburger @@ -885,10 +910,11 @@ icon_state = "tofuburger" filling_color = "#FFFEE0" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 6 + nutriment_desc = list("bun" = 2, "pseudo-soy meat" = 3) /obj/item/weapon/reagent_containers/food/snacks/tofuburger/New() ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/roburger @@ -897,10 +923,11 @@ icon_state = "roburger" filling_color = "#CCCCCC" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 2 + nutriment_desc = list("bun" = 2, "metal" = 3) /obj/item/weapon/reagent_containers/food/snacks/roburger/New() ..() - reagents.add_reagent("nutriment", 2) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/roburgerbig @@ -933,10 +960,11 @@ icon_state = "clownburger" filling_color = "#FF00FF" center_of_mass = list("x"=17, "y"=12) + nutriment_amt = 6 + nutriment_desc = list("bun" = 2, "clown shoe" = 3) /obj/item/weapon/reagent_containers/food/snacks/clownburger/New() ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/mimeburger @@ -945,6 +973,8 @@ icon_state = "mimeburger" filling_color = "#FFFFFF" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 6 + nutriment_desc = list("bun" = 2, "face paint" = 3) /obj/item/weapon/reagent_containers/food/snacks/mimeburger/New() ..() @@ -970,6 +1000,8 @@ icon_state = "muffin" filling_color = "#E0CF9B" center_of_mass = list("x"=17, "y"=4) + nutriment_amt = 6 + nutriment_desc = list("sweetness" = 3, "muffin" = 3) /obj/item/weapon/reagent_containers/food/snacks/muffin/New() ..() @@ -983,10 +1015,11 @@ trash = /obj/item/trash/plate filling_color = "#FBFFB8" center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 4 + nutriment_desc = list("pie" = 3, "cream" = 2) /obj/item/weapon/reagent_containers/food/snacks/pie/New() ..() - reagents.add_reagent("nutriment", 4) reagents.add_reagent("banana",5) bitesize = 3 @@ -1002,10 +1035,11 @@ icon_state = "berryclafoutis" trash = /obj/item/trash/plate center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 4 + nutriment_desc = list("sweetness" = 2, "pie" = 3) /obj/item/weapon/reagent_containers/food/snacks/berryclafoutis/New() ..() - reagents.add_reagent("nutriment", 4) reagents.add_reagent("berryjuice", 5) bitesize = 3 @@ -1016,10 +1050,11 @@ trash = /obj/item/trash/waffles filling_color = "#E6DEB5" center_of_mass = list("x"=15, "y"=11) + nutriment_amt = 8 + nutriment_desc = list("waffle" = 8) /obj/item/weapon/reagent_containers/food/snacks/waffles/New() ..() - reagents.add_reagent("nutriment", 8) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/eggplantparm @@ -1029,10 +1064,11 @@ trash = /obj/item/trash/plate filling_color = "#4D2F5E" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 6 + nutriment_desc = list("cheese" = 3, "eggplant" = 3) /obj/item/weapon/reagent_containers/food/snacks/eggplantparm/New() ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/soylentgreen @@ -1055,10 +1091,11 @@ trash = /obj/item/trash/waffles filling_color = "#E6FA61" center_of_mass = list("x"=15, "y"=11) + nutriment_amt = 10 + nutriment_desc = list("some sort of protein" = 10) //seasoned VERY well. /obj/item/weapon/reagent_containers/food/snacks/soylenviridians/New() ..() - reagents.add_reagent("nutriment", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatpie @@ -1081,10 +1118,11 @@ trash = /obj/item/trash/plate filling_color = "#FFFEE0" center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 10 + nutriment_desc = list("tofu" = 2, "pie" = 8) /obj/item/weapon/reagent_containers/food/snacks/tofupie/New() ..() - reagents.add_reagent("nutriment", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/amanita_pie @@ -1093,10 +1131,11 @@ icon_state = "amanita_pie" filling_color = "#FFCCCC" center_of_mass = list("x"=17, "y"=9) + nutriment_amt = 5 + nutriment_desc = list("sweetness" = 3, "mushroom" = 3, "pie" = 2) /obj/item/weapon/reagent_containers/food/snacks/amanita_pie/New() ..() - reagents.add_reagent("nutriment", 5) reagents.add_reagent("amatoxin", 3) reagents.add_reagent("psilocybin", 1) bitesize = 3 @@ -1107,6 +1146,8 @@ icon_state = "plump_pie" filling_color = "#B8279B" center_of_mass = list("x"=17, "y"=9) + nutriment_amt = 8 + nutriment_desc = list("heartiness" = 2, "mushroom" = 3, "pie" = 3) /obj/item/weapon/reagent_containers/food/snacks/plump_pie/New() ..() @@ -1117,7 +1158,6 @@ reagents.add_reagent("tricordrazine", 5) bitesize = 2 else - reagents.add_reagent("nutriment", 8) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/xemeatpie @@ -1178,11 +1218,13 @@ desc = "Vegan meat, on a stick." trash = /obj/item/stack/rods filling_color = "#FFFEE0" + center_of_mass = list("x"=17, "y"=15) + nutriment_amt = 8 + nutriment_desc = list("tofu" = 3, "metal" = 1) /obj/item/weapon/reagent_containers/food/snacks/tofukabob/New() ..() - reagents.add_reagent("nutriment", 8) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cubancarp @@ -1192,11 +1234,12 @@ trash = /obj/item/trash/plate filling_color = "#E9ADFF" center_of_mass = list("x"=12, "y"=5) + nutriment_amt = 3 + nutriment_desc = list("toasted bread" = 3) /obj/item/weapon/reagent_containers/food/snacks/cubancarp/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) reagents.add_reagent("carpotoxin", 3) reagents.add_reagent("capsaicin", 3) bitesize = 3 @@ -1209,11 +1252,13 @@ var/unpopped = 0 filling_color = "#FFFAD4" center_of_mass = list("x"=16, "y"=8) + nutriment_amt = 2 + nutriment_desc = list("popcorn" = 3) + /obj/item/weapon/reagent_containers/food/snacks/popcorn/New() ..() unpopped = rand(1,10) - reagents.add_reagent("nutriment", 2) bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 /obj/item/weapon/reagent_containers/food/snacks/popcorn/On_Consume() @@ -1242,6 +1287,8 @@ trash = /obj/item/trash/raisins filling_color = "#343834" center_of_mass = list("x"=15, "y"=4) + nutriment_amt = 6 + nutriment_desc = list("dried raisins" = 6) /obj/item/weapon/reagent_containers/food/snacks/no_raisin/New() ..() @@ -1266,10 +1313,11 @@ trash = /obj/item/trash/cheesie filling_color = "#FFA305" center_of_mass = list("x"=15, "y"=9) + nutriment_amt = 4 + nutriment_desc = list("cheese" = 5, "chips" = 2) /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers/New() ..() - reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/syndicake @@ -1278,12 +1326,12 @@ desc = "An extremely moist snack cake that tastes just as good after being nuked." filling_color = "#FF5D05" center_of_mass = list("x"=16, "y"=10) - trash = /obj/item/trash/syndi_cakes + nutriment_amt = 4 + nutriment_desc = list("sweetness" = 3, "cake" = 1) /obj/item/weapon/reagent_containers/food/snacks/syndicake/New() ..() - reagents.add_reagent("nutriment", 4) reagents.add_reagent("doctorsdelight", 5) bitesize = 3 @@ -1293,10 +1341,11 @@ icon_state = "loadedbakedpotato" filling_color = "#9C7A68" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 3 + nutriment_desc = list("baked potato" = 3) /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato/New() ..() - reagents.add_reagent("nutriment", 3) reagents.add_reagent("protein", 3) bitesize = 2 @@ -1307,10 +1356,11 @@ trash = /obj/item/trash/plate filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 4 + nutriment_desc = list("fresh fries" = 4) /obj/item/weapon/reagent_containers/food/snacks/fries/New() ..() - reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/soydope @@ -1320,10 +1370,11 @@ trash = /obj/item/trash/plate filling_color = "#C4BF76" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 2 + nutriment_desc = list("slime" = 2, "soy" = 2) /obj/item/weapon/reagent_containers/food/snacks/soydope/New() ..() - reagents.add_reagent("nutriment", 2) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spagetti @@ -1332,10 +1383,11 @@ icon_state = "spagetti" filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=16) + nutriment_amt = 1 + nutriment_desc = list("noodles" = 2) /obj/item/weapon/reagent_containers/food/snacks/spagetti/New() ..() - reagents.add_reagent("nutriment", 1) bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/cheesyfries @@ -1345,11 +1397,12 @@ trash = /obj/item/trash/plate filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 4 + nutriment_desc = list("fresh fries" = 3, "cheese" = 3) /obj/item/weapon/reagent_containers/food/snacks/cheesyfries/New() ..() reagents.add_reagent("protein", 2) - reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fortunecookie @@ -1358,10 +1411,11 @@ icon_state = "fortune_cookie" filling_color = "#E8E79E" center_of_mass = list("x"=15, "y"=14) + nutriment_amt = 3 + nutriment_desc = list("fortune cookie" = 2) /obj/item/weapon/reagent_containers/food/snacks/fortunecookie/New() ..() - reagents.add_reagent("nutriment", 3) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/badrecipe @@ -1399,10 +1453,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#42B873" center_of_mass = list("x"=16, "y"=8) + nutriment_amt = 6 + nutriment_desc = list("mushroom" = 6) /obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff/New() ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("psilocybin", 6) bitesize = 3 @@ -1413,10 +1468,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#ED0758" center_of_mass = list("x"=16, "y"=5) + nutriment_amt = 6 + nutriment_desc = list("jelly" = 3, "mushroom" = 3) /obj/item/weapon/reagent_containers/food/snacks/amanitajelly/New() ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("amatoxin", 6) reagents.add_reagent("psilocybin", 3) bitesize = 3 @@ -1428,10 +1484,11 @@ bitesize = 2 filling_color = "#916E36" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 5 + nutriment_desc = list("poppy seeds" = 2, "pretzel" = 3) /obj/item/weapon/reagent_containers/food/snacks/poppypretzel/New() ..() - reagents.add_reagent("nutriment", 5) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatballsoup @@ -1480,10 +1537,11 @@ icon_state = "clownstears" filling_color = "#C4FBFF" center_of_mass = list("x"=16, "y"=7) + nutriment_amt = 4 + nutriment_desc = list("salt" = 1, "the worst joke" = 3) /obj/item/weapon/reagent_containers/food/snacks/clownstears/New() ..() - reagents.add_reagent("nutriment", 4) reagents.add_reagent("banana", 5) reagents.add_reagent("water", 10) bitesize = 5 @@ -1495,10 +1553,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#AFC4B5" center_of_mass = list("x"=16, "y"=8) + nutriment_amt = 8 + nutriment_desc = list("carot" = 2, "corn" = 2, "eggplant" = 2, "potato" = 2) /obj/item/weapon/reagent_containers/food/snacks/vegetablesoup/New() ..() - reagents.add_reagent("nutriment", 8) reagents.add_reagent("water", 5) bitesize = 5 @@ -1509,10 +1568,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#AFC4B5" center_of_mass = list("x"=16, "y"=7) + nutriment_amt = 8 + nutriment_desc = list("salad" = 4, "egg" = 2, "potato" = 2) /obj/item/weapon/reagent_containers/food/snacks/nettlesoup/New() ..() - reagents.add_reagent("nutriment", 8) reagents.add_reagent("water", 5) reagents.add_reagent("tricordrazine", 5) bitesize = 5 @@ -1524,6 +1584,8 @@ trash = /obj/item/trash/snack_bowl filling_color = "#F082FF" center_of_mass = list("x"=16, "y"=6) + nutriment_amt = 1 + nutriment_desc = list("backwash" = 1) /obj/item/weapon/reagent_containers/food/snacks/mysterysoup/New() ..() @@ -1579,7 +1641,7 @@ bitesize = 5 if(prob(25)) src.desc = "A wish come true!" - reagents.add_reagent("nutriment", 8) + reagents.add_reagent("nutriment", 8, list("something good" = 8)) /obj/item/weapon/reagent_containers/food/snacks/hotchili name = "Hot Chili" @@ -1588,11 +1650,12 @@ trash = /obj/item/trash/snack_bowl filling_color = "#FF3C00" center_of_mass = list("x"=15, "y"=9) + nutriment_amt = 3 + nutriment_desc = list("chilli peppers" = 3) /obj/item/weapon/reagent_containers/food/snacks/hotchili/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) reagents.add_reagent("capsaicin", 3) reagents.add_reagent("tomatojuice", 2) bitesize = 5 @@ -1603,13 +1666,13 @@ icon_state = "coldchili" filling_color = "#2B00FF" center_of_mass = list("x"=15, "y"=9) - trash = /obj/item/trash/snack_bowl + nutriment_amt = 3 + nutriment_desc = list("ice peppers" = 3) /obj/item/weapon/reagent_containers/food/snacks/coldchili/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) reagents.add_reagent("frostoil", 3) reagents.add_reagent("tomatojuice", 2) bitesize = 5 @@ -1693,10 +1756,11 @@ desc = "This is absolutely Ei Nath." icon_state = "spellburger" filling_color = "#D505FF" + nutriment_amt = 6 + nutriment_desc = list("magic" = 3, "buns" = 3) /obj/item/weapon/reagent_containers/food/snacks/spellburger/New() ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger @@ -1705,11 +1769,12 @@ icon_state = "bigbiteburger" filling_color = "#E3D681" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 4 + nutriment_desc = list("buns" = 4) /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger/New() ..() reagents.add_reagent("protein", 10) - reagents.add_reagent("nutriment", 4) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/enchiladas @@ -1719,11 +1784,12 @@ trash = /obj/item/trash/tray filling_color = "#A36A1F" center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 2 + nutriment_desc = list("tortilla" = 3, "corn" = 3) /obj/item/weapon/reagent_containers/food/snacks/enchiladas/New() ..() reagents.add_reagent("protein", 6) - reagents.add_reagent("nutriment",2) reagents.add_reagent("capsaicin", 6) bitesize = 4 @@ -1749,10 +1815,11 @@ icon_state = "baguette" filling_color = "#E3D796" center_of_mass = list("x"=18, "y"=12) + nutriment_amt = 6 + nutriment_desc = list("french bread" = 6) /obj/item/weapon/reagent_containers/food/snacks/baguette/New() ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("blackpepper", 1) reagents.add_reagent("sodiumchloride", 1) bitesize = 3 @@ -1763,11 +1830,12 @@ icon_state = "fishandchips" filling_color = "#E3D796" center_of_mass = list("x"=16, "y"=16) + nutriment_amt = 3 + nutriment_desc = list("salt" = 1, "chips" = 3) /obj/item/weapon/reagent_containers/food/snacks/fishandchips/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) reagents.add_reagent("carpotoxin", 3) bitesize = 3 @@ -1778,11 +1846,12 @@ trash = /obj/item/trash/plate filling_color = "#D9BE29" center_of_mass = list("x"=16, "y"=4) + nutriment_amt = 3 + nutriment_desc = list("bread" = 3, "cheese" = 3) /obj/item/weapon/reagent_containers/food/snacks/sandwich/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich @@ -1792,11 +1861,12 @@ trash = /obj/item/trash/plate filling_color = "#D9BE29" center_of_mass = list("x"=16, "y"=4) + nutriment_amt = 3 + nutriment_desc = list("toasted bread" = 3, "cheese" = 3) /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) reagents.add_reagent("carbon", 2) bitesize = 2 @@ -1806,11 +1876,12 @@ icon_state = "toastedsandwich" trash = /obj/item/trash/plate filling_color = "#D9BE29" + nutriment_amt = 3 + nutriment_desc = list("toasted bread" = 3, "cheese" = 3) /obj/item/weapon/reagent_containers/food/snacks/grilledcheese/New() ..() reagents.add_reagent("protein", 4) - reagents.add_reagent("nutriment", 3) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tomatosoup @@ -1820,10 +1891,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#D92929" center_of_mass = list("x"=16, "y"=7) + nutriment_amt = 5 + nutriment_desc = list("soup" = 5) /obj/item/weapon/reagent_containers/food/snacks/tomatosoup/New() ..() - reagents.add_reagent("nutriment", 5) reagents.add_reagent("tomatojuice", 10) bitesize = 3 @@ -1834,10 +1906,11 @@ trash = /obj/item/trash/waffles filling_color = "#FF00F7" center_of_mass = list("x"=15, "y"=11) + nutriment_amt = 8 + nutriment_desc = list("waffle" = 7, "sweetness" = 1) /obj/item/weapon/reagent_containers/food/snacks/rofflewaffles/New() ..() - reagents.add_reagent("nutriment", 8) reagents.add_reagent("psilocybin", 8) bitesize = 4 @@ -1847,11 +1920,12 @@ icon_state = "stew" filling_color = "#9E673A" center_of_mass = list("x"=16, "y"=5) + nutriment_amt = 6 + nutriment_desc = list("tomato" = 2, "potato" = 2, "carrot" = 2, "eggplant" = 2, "mushroom" = 2) /obj/item/weapon/reagent_containers/food/snacks/stew/New() ..() reagents.add_reagent("protein", 4) - reagents.add_reagent("nutriment", 6) reagents.add_reagent("tomatojuice", 5) reagents.add_reagent("imidazoline", 5) reagents.add_reagent("water", 5) @@ -1864,10 +1938,11 @@ trash = /obj/item/trash/plate filling_color = "#B572AB" center_of_mass = list("x"=16, "y"=8) + nutriment_amt = 1 + nutriment_desc = list("toasted bread" = 2) /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/New() ..() - reagents.add_reagent("nutriment", 1) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry/New() @@ -1884,10 +1959,11 @@ icon_state = "jellyburger" filling_color = "#B572AB" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 5 + nutriment_desc = list("buns" = 5) /obj/item/weapon/reagent_containers/food/snacks/jellyburger/New() ..() - reagents.add_reagent("nutriment", 5) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/jellyburger/slime/New() @@ -1904,10 +1980,11 @@ icon_state = "milosoup" trash = /obj/item/trash/snack_bowl center_of_mass = list("x"=16, "y"=7) + nutriment_amt = 8 + nutriment_desc = list("soy" = 8) /obj/item/weapon/reagent_containers/food/snacks/milosoup/New() ..() - reagents.add_reagent("nutriment", 8) reagents.add_reagent("water", 5) bitesize = 4 @@ -1917,10 +1994,11 @@ icon_state = "stewedsoymeat" trash = /obj/item/trash/plate center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 8 + nutriment_desc = list("soy" = 4, "tomato" = 4) /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat/New() ..() - reagents.add_reagent("nutriment", 8) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/boiledspagetti @@ -1930,10 +2008,11 @@ trash = /obj/item/trash/plate filling_color = "#FCEE81" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 2 + nutriment_desc = list("noodles" = 2) /obj/item/weapon/reagent_containers/food/snacks/boiledspagetti/New() ..() - reagents.add_reagent("nutriment", 2) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/boiledrice @@ -1943,10 +2022,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#FFFBDB" center_of_mass = list("x"=17, "y"=11) + nutriment_amt = 2 + nutriment_desc = list("rice" = 2) /obj/item/weapon/reagent_containers/food/snacks/boiledrice/New() ..() - reagents.add_reagent("nutriment", 2) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/ricepudding @@ -1956,10 +2036,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#FFFBDB" center_of_mass = list("x"=17, "y"=11) + nutriment_amt = 4 + nutriment_desc = list("rice" = 2) /obj/item/weapon/reagent_containers/food/snacks/ricepudding/New() ..() - reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/pastatomato @@ -1969,10 +2050,11 @@ trash = /obj/item/trash/plate filling_color = "#DE4545" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 6 + nutriment_desc = list("tomato" = 3, "noodles" = 3) /obj/item/weapon/reagent_containers/food/snacks/pastatomato/New() ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("tomatojuice", 10) bitesize = 4 @@ -1983,11 +2065,12 @@ trash = /obj/item/trash/plate filling_color = "#DE4545" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 4 + nutriment_desc = list("noodles" = 4) /obj/item/weapon/reagent_containers/food/snacks/meatballspagetti/New() ..() reagents.add_reagent("protein", 4) - reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spesslaw @@ -1996,11 +2079,12 @@ icon_state = "spesslaw" filling_color = "#DE4545" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 4 + nutriment_desc = list("noodles" = 4) /obj/item/weapon/reagent_containers/food/snacks/spesslaw/New() ..() reagents.add_reagent("protein", 4) - reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/carrotfries @@ -2010,10 +2094,11 @@ trash = /obj/item/trash/plate filling_color = "#FAA005" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 3 + nutriment_desc = list("carrot" = 3, "salt" = 1) /obj/item/weapon/reagent_containers/food/snacks/carrotfries/New() ..() - reagents.add_reagent("nutriment", 3) reagents.add_reagent("imidazoline", 3) bitesize = 2 @@ -2023,11 +2108,12 @@ icon_state = "superbiteburger" filling_color = "#CCA26A" center_of_mass = list("x"=16, "y"=3) + nutriment_amt = 25 + nutriment_desc = list("buns" = 25) /obj/item/weapon/reagent_containers/food/snacks/superbiteburger/New() ..() reagents.add_reagent("protein", 25) - reagents.add_reagent("nutriment", 25) bitesize = 10 /obj/item/weapon/reagent_containers/food/snacks/candiedapple @@ -2036,10 +2122,11 @@ icon_state = "candiedapple" filling_color = "#F21873" center_of_mass = list("x"=15, "y"=13) + nutriment_amt = 3 + nutriment_desc = list("apple" = 3, "caramel" = 3, "sweetness" = 2) /obj/item/weapon/reagent_containers/food/snacks/candiedapple/New() ..() - reagents.add_reagent("nutriment", 3) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/applepie @@ -2048,10 +2135,11 @@ icon_state = "applepie" filling_color = "#E0EDC5" center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 4 + nutriment_desc = list("sweetness" = 2, "apple" = 2, "pie" = 2) /obj/item/weapon/reagent_containers/food/snacks/applepie/New() ..() - reagents.add_reagent("nutriment", 4) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cherrypie @@ -2060,10 +2148,11 @@ icon_state = "cherrypie" filling_color = "#FF525A" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 4 + nutriment_desc = list("sweetness" = 2, "cherry" = 2, "pie" = 2) /obj/item/weapon/reagent_containers/food/snacks/cherrypie/New() ..() - reagents.add_reagent("nutriment", 4) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/twobread @@ -2072,10 +2161,11 @@ icon_state = "twobread" filling_color = "#DBCC9A" center_of_mass = list("x"=15, "y"=12) + nutriment_amt = 2 + nutriment_desc = list("sourness" = 2, "bread" = 2) /obj/item/weapon/reagent_containers/food/snacks/twobread/New() ..() - reagents.add_reagent("nutriment", 2) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/jellysandwich @@ -2085,10 +2175,11 @@ trash = /obj/item/trash/plate filling_color = "#9E3A78" center_of_mass = list("x"=16, "y"=8) + nutriment_amt = 2 + nutriment_desc = list("bread" = 2) /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/New() ..() - reagents.add_reagent("nutriment", 2) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime/New() @@ -2128,10 +2219,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#E386BF" center_of_mass = list("x"=17, "y"=10) + nutriment_amt = 8 + nutriment_desc = list("mushroom" = 8, "milk" = 2) /obj/item/weapon/reagent_containers/food/snacks/mushroomsoup/New() ..() - reagents.add_reagent("nutriment", 8) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit @@ -2140,6 +2232,8 @@ icon_state = "phelmbiscuit" filling_color = "#CFB4C4" center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 5 + nutriment_desc = list("mushroom" = 4) /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/New() ..() @@ -2147,7 +2241,6 @@ name = "exceptional plump helmet biscuit" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" reagents.add_reagent("nutriment", 8) - reagents.add_reagent("tricordrazine", 5) bitesize = 2 else reagents.add_reagent("nutriment", 5) @@ -2173,11 +2266,12 @@ trash = /obj/item/trash/snack_bowl filling_color = "#FAC9FF" center_of_mass = list("x"=15, "y"=8) + nutriment_amt = 8 + nutriment_desc = list("tomato" = 4, "beet" = 4) /obj/item/weapon/reagent_containers/food/snacks/beetsoup/New() ..() name = pick(list("borsch","bortsch","borstch","borsh","borshch","borscht")) - reagents.add_reagent("nutriment", 8) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tossedsalad @@ -2187,10 +2281,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#76B87F" center_of_mass = list("x"=17, "y"=11) + nutriment_amt = 8 + nutriment_desc = list("salad" = 2, "tomato" = 2, "carrot" = 2, "apple" = 2) /obj/item/weapon/reagent_containers/food/snacks/tossedsalad/New() ..() - reagents.add_reagent("nutriment", 8) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/validsalad @@ -2200,11 +2295,12 @@ trash = /obj/item/trash/snack_bowl filling_color = "#76B87F" center_of_mass = list("x"=17, "y"=11) + nutriment_amt = 6 + nutriment_desc = list("100% real salad") /obj/item/weapon/reagent_containers/food/snacks/validsalad/New() ..() reagents.add_reagent("protein", 2) - reagents.add_reagent("nutriment", 6) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/appletart @@ -2214,10 +2310,11 @@ trash = /obj/item/trash/plate filling_color = "#FFFF00" center_of_mass = list("x"=16, "y"=18) + nutriment_amt = 8 + nutriment_desc = list("apple" = 8) /obj/item/weapon/reagent_containers/food/snacks/appletart/New() ..() - reagents.add_reagent("nutriment", 8) reagents.add_reagent("gold", 5) bitesize = 3 @@ -2237,11 +2334,12 @@ slices_num = 5 filling_color = "#FF7575" center_of_mass = list("x"=16, "y"=9) + nutriment_amt = 10 + nutriment_desc = list("bread" = 10) /obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread/New() ..() reagents.add_reagent("protein", 20) - reagents.add_reagent("nutriment", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice @@ -2267,11 +2365,12 @@ slices_num = 5 filling_color = "#8AFF75" center_of_mass = list("x"=16, "y"=9) + nutriment_amt = 10 + nutriment_desc = list("bread" = 10) /obj/item/weapon/reagent_containers/food/snacks/sliceable/xenomeatbread/New() ..() reagents.add_reagent("protein", 20) - reagents.add_reagent("nutriment", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice @@ -2297,11 +2396,12 @@ slices_num = 5 filling_color = "#EDE5AD" center_of_mass = list("x"=16, "y"=9) + nutriment_amt = 10 + nutriment_desc = list("bread" = 10) /obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread/New() ..() reagents.add_reagent("banana", 20) - reagents.add_reagent("nutriment", 20) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bananabreadslice @@ -2327,6 +2427,8 @@ slices_num = 5 filling_color = "#F7FFE0" center_of_mass = list("x"=16, "y"=9) + nutriment_amt = 30 + nutriment_desc = list("bread" = 15, "tofu" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread/New() ..() @@ -2356,10 +2458,11 @@ slices_num = 5 filling_color = "#FFD675" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 25 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "carrot" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake/New() ..() - reagents.add_reagent("nutriment", 25) reagents.add_reagent("imidazoline", 10) bitesize = 2 @@ -2386,11 +2489,12 @@ slices_num = 5 filling_color = "#E6AEDB" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 5 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "slime" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake/New() ..() reagents.add_reagent("protein", 25) - reagents.add_reagent("nutriment", 5) reagents.add_reagent("alkysine", 10) bitesize = 2 @@ -2418,11 +2522,12 @@ slices_num = 5 filling_color = "#FAF7AF" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 10 + nutriment_desc = list("cake" = 10, "cream" = 10, "cheese" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake/New() ..() reagents.add_reagent("protein", 15) - reagents.add_reagent("nutriment", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice @@ -2448,10 +2553,11 @@ slices_num = 5 filling_color = "#F7EDD5" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 20 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "vanilla" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake/New() ..() - reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice name = "Vanilla Cake slice" @@ -2475,10 +2581,11 @@ slices_num = 5 filling_color = "#FADA8E" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 20 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "orange" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake/New() ..() - reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice name = "Orange Cake slice" @@ -2502,6 +2609,8 @@ slices_num = 5 filling_color = "#CBFA8E" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 20 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "lime" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake/New() ..() @@ -2529,10 +2638,11 @@ slices_num = 5 filling_color = "#FAFA8E" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 20 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "lemon" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake/New() ..() - reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice name = "Lemon Cake slice" @@ -2556,10 +2666,11 @@ slices_num = 5 filling_color = "#805930" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 20 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "chocolate" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake/New() ..() - reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice name = "Chocolate Cake slice" @@ -2583,10 +2694,12 @@ slices_num = 5 filling_color = "#FFF700" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 10 + nutriment_desc = list("cheese" = 10) /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel/New() ..() - reagents.add_reagent("protein", 20) + reagents.add_reagent("protein", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesewedge @@ -2605,10 +2718,11 @@ slices_num = 5 filling_color = "#FFD6D6" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 20 + nutriment_desc = list("cake" = 10, "sweetness" = 10) /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake/New() ..() - reagents.add_reagent("nutriment", 20) reagents.add_reagent("sprinkles", 10) bitesize = 3 @@ -2635,10 +2749,11 @@ slices_num = 5 filling_color = "#FFE396" center_of_mass = list("x"=16, "y"=9) + nutriment_amt = 6 + nutriment_desc = list("bread" = 6) /obj/item/weapon/reagent_containers/food/snacks/sliceable/bread/New() ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/breadslice @@ -2664,11 +2779,12 @@ slices_num = 5 filling_color = "#FFF896" center_of_mass = list("x"=16, "y"=9) + nutriment_amt = 5 + nutriment_desc = list("bread" = 6, "cream" = 3, "cheese" = 3) /obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread/New() ..() reagents.add_reagent("protein", 15) - reagents.add_reagent("nutriment", 5) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice @@ -2707,10 +2823,11 @@ slices_num = 5 filling_color = "#EBF5B8" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 15 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "apple" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake/New() ..() - reagents.add_reagent("nutriment", 15) /obj/item/weapon/reagent_containers/food/snacks/applecakeslice name = "Apple Cake slice" @@ -2734,10 +2851,11 @@ slices_num = 5 filling_color = "#F5B951" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 15 + nutriment_desc = list("pie" = 5, "cream" = 5, "pumpkin" = 5) /obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie/New() ..() - reagents.add_reagent("nutriment", 15) /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice name = "Pumpkin Pie slice" @@ -2759,10 +2877,11 @@ icon_state = "cracker" filling_color = "#F5DEB8" center_of_mass = list("x"=17, "y"=6) + nutriment_amt = 1 + nutriment_desc = list("salt" = 1, "cracker" = 2) /obj/item/weapon/reagent_containers/food/snacks/cracker/New() ..() - reagents.add_reagent("nutriment", 1) /////////////////////////////////////////////////PIZZA//////////////////////////////////////// @@ -2777,10 +2896,11 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/margheritaslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 35 + nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita/New() ..() - reagents.add_reagent("nutriment", 35) reagents.add_reagent("protein", 5) reagents.add_reagent("tomatojuice", 6) bitesize = 2 @@ -2807,10 +2927,12 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 10 + nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza/New() ..() - reagents.add_reagent("protein", 44) + reagents.add_reagent("protein", 34) reagents.add_reagent("tomatojuice", 6) bitesize = 2 @@ -2835,10 +2957,11 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 35 + nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 5, "mushroom" = 10) /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza/New() ..() - reagents.add_reagent("nutriment", 35) reagents.add_reagent("protein", 5) bitesize = 2 @@ -2863,10 +2986,11 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 25 + nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 5, "eggplant" = 5, "carrot" = 5, "corn" = 5) /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza/New() ..() - reagents.add_reagent("nutriment", 25) reagents.add_reagent("protein", 5) reagents.add_reagent("tomatojuice", 6) reagents.add_reagent("imidazoline", 12) @@ -3081,10 +3205,11 @@ trash = /obj/item/trash/plate filling_color = "#75754B" center_of_mass = list("x"=16, "y"=7) + nutriment_amt = 6 + nutriment_desc = list("a chorus of flavor" = 6) /obj/item/weapon/reagent_containers/food/snacks/dionaroast/New() ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("radium", 2) bitesize = 2 @@ -3098,11 +3223,12 @@ icon_state = "dough" bitesize = 2 center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 3 + nutriment_desc = list("uncooked dough" = 3) /obj/item/weapon/reagent_containers/food/snacks/dough/New() ..() reagents.add_reagent("protein", 1) - reagents.add_reagent("nutriment", 3) // Dough + rolling pin = flat dough /obj/item/weapon/reagent_containers/food/snacks/dough/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -3135,10 +3261,11 @@ slices_num = 1 bitesize = 2 center_of_mass = list("x"=17, "y"=19) + nutriment_amt = 1 + nutriment_desc = list("uncooked dough" = 1) /obj/item/weapon/reagent_containers/food/snacks/doughslice/New() ..() - reagents.add_reagent("nutriment", 1) /obj/item/weapon/reagent_containers/food/snacks/bun name = "bun" @@ -3147,10 +3274,11 @@ icon_state = "bun" bitesize = 2 center_of_mass = list("x"=16, "y"=12) + nutriment_amt = 4 + nutriment_desc = "bun" /obj/item/weapon/reagent_containers/food/snacks/bun/New() ..() - reagents.add_reagent("nutriment", 4) /obj/item/weapon/reagent_containers/food/snacks/bun/attackby(obj/item/weapon/W as obj, mob/user as mob) // Bun + meatball = burger @@ -3202,10 +3330,11 @@ icon_state = "bunbun" bitesize = 2 center_of_mass = list("x"=16, "y"=8) + nutriment_amt = 8 + nutriment_desc = list("bun" = 8) /obj/item/weapon/reagent_containers/food/snacks/bunbun/New() ..() - reagents.add_reagent("nutriment", 8) /obj/item/weapon/reagent_containers/food/snacks/taco name = "taco" @@ -3213,11 +3342,11 @@ icon_state = "taco" bitesize = 3 center_of_mass = list("x"=21, "y"=12) - + nutriment_amt = 4 + nutriment_desc = list("cheese" = 2,"taco shell" = 2) /obj/item/weapon/reagent_containers/food/snacks/taco/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 4) /obj/item/weapon/reagent_containers/food/snacks/rawcutlet name = "raw cutlet" @@ -3273,10 +3402,11 @@ icon_state = "flatbread" bitesize = 2 center_of_mass = list("x"=16, "y"=16) + nutriment_amt = 3 + nutriment_desc = list("bread" = 3) /obj/item/weapon/reagent_containers/food/snacks/flatbread/New() ..() - reagents.add_reagent("nutriment", 3) // potato + knife = raw sticks /obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -3294,10 +3424,11 @@ icon_state = "rawsticks" bitesize = 2 center_of_mass = list("x"=16, "y"=12) + nutriment_amt = 3 + nutriment_desc = list("raw potato" = 3) /obj/item/weapon/reagent_containers/food/snacks/rawsticks/New() ..() - reagents.add_reagent("nutriment", 3) /obj/item/weapon/reagent_containers/food/snacks/liquidfood name = "\improper LiquidFood Ration" @@ -3306,10 +3437,11 @@ trash = /obj/item/trash/liquidfood filling_color = "#A8A8A8" center_of_mass = list("x"=16, "y"=15) + nutriment_amt = 20 + nutriment_desc = list("chalk" = 6) /obj/item/weapon/reagent_containers/food/snacks/liquidfood/New() ..() - reagents.add_reagent("nutriment", 20) reagents.add_reagent("iron", 3) bitesize = 4 @@ -3320,10 +3452,11 @@ trash = /obj/item/trash/tastybread filling_color = "#A66829" center_of_mass = list("x"=17, "y"=16) + nutriment_amt = 6 + nutriment_desc = list("bread" = 2, "sweetness" = 3) /obj/item/weapon/reagent_containers/food/snacks/tastybread/New() ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks @@ -3332,8 +3465,9 @@ icon_state = "skrellsnacks" filling_color = "#A66829" center_of_mass = list("x"=15, "y"=12) + nutriment_amt = 10 + nutriment_desc = list("mushroom" = 5, "salt" = 5) /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks/New() ..() - reagents.add_reagent("nutriment", 10) bitesize = 3 diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index bbb0b3e8ad..5c7459e3b2 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -23,6 +23,7 @@ var/image/filling //holds a reference to the current filling overlay var/visible_name = "a syringe" var/time = 30 + var/drawing = 0 /obj/item/weapon/reagent_containers/syringe/on_reagent_change() update_icon() @@ -98,7 +99,12 @@ user << "You are unable to locate any blood." return + if(drawing) + user << "You are already drawing blood from [T.name]." + return + var/datum/reagent/B + drawing = 1 if(istype(T, /mob/living/carbon/human)) var/mob/living/carbon/human/H = T if(H.species && !H.should_have_organ(O_HEART)) @@ -106,12 +112,16 @@ else if(ismob(H) && H != user) if(!do_mob(user, target, time)) + drawing = 0 return B = T.take_blood(src, amount) + drawing = 0 else if(!do_mob(user, target, time)) + drawing = 0 return B = T.take_blood(src,amount) + drawing = 0 if (B) reagents.reagent_list += B @@ -200,7 +210,10 @@ admin_inject_log(user, target, src, contained, trans) else trans = reagents.trans_to(target, amount_per_transfer_from_this) - user << "You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units." + if(trans) + user << "You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units." + else + user << "The syringe is empty." if (reagents.total_volume <= 0 && mode == SYRINGE_INJECT) mode = SYRINGE_DRAW update_icon() diff --git a/code/unit_tests/integrated_circuits/logic.dm b/code/unit_tests/integrated_circuits/logic.dm index 314150f3b4..a022078c07 100644 --- a/code/unit_tests/integrated_circuits/logic.dm +++ b/code/unit_tests/integrated_circuits/logic.dm @@ -65,6 +65,32 @@ +/datum/unit_test/integrated_circuits/not_equals_1 + name = "Logic Circuits: Not Equals - String True" + circuit_type = /obj/item/integrated_circuit/logic/binary/not_equals + inputs_to_give = list("Test", "Nope") + expected_outputs = list(TRUE) + +/datum/unit_test/integrated_circuits/not_equals_2 + name = "Logic Circuits: Not Equals - String False" + circuit_type = /obj/item/integrated_circuit/logic/binary/not_equals + inputs_to_give = list("Test", "Test") + expected_outputs = list(FALSE) + +/datum/unit_test/integrated_circuits/not_equals_3 + name = "Logic Circuits: Not Equals - Number True" + circuit_type = /obj/item/integrated_circuit/logic/binary/not_equals + inputs_to_give = list(150, 20) + expected_outputs = list(TRUE) + +/datum/unit_test/integrated_circuits/not_equals_4 + name = "Logic Circuits: Not Equals - Number False" + circuit_type = /obj/item/integrated_circuit/logic/binary/not_equals + inputs_to_give = list(100, 100) + expected_outputs = list(FALSE) + + + /datum/unit_test/integrated_circuits/and_1 name = "Logic Circuits: And - True" circuit_type = /obj/item/integrated_circuit/logic/binary/and diff --git a/html/changelog.html b/html/changelog.html index 4ea1ab9d63..ae6ba88f27 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,67 @@ -->
    +

    28 January 2017

    +

    Anewbe updated:

    +
      +
    • Added Medical and Meson aviators.
    • +
    • Medical and Meson aviators are now in the loadout, department locked.
    • +
    • Meson Scanners have been added to the loadout, department locked.
    • +
    • Medical hardsuit has a toggleable sprint.
    • +
    • Carbon and Hematite should show up in asteroid walls.
    • +
    • Readded the random crates from mining.
    • +
    • Digging through an artifact sometimes doesn't destroy the artifact.
    • +
    • Space and cracked sand should no longer stop mining drills.
    • +
    • Diona can regenerate organs and limbs.
    • +
    +

    PsiOmegaDelta updated:

    +
      +
    • Resetting a character slot now requires confirmation.
    • +
    +

    Zuhayr updated:

    +
      +
    • Added a reset slot button to chargen.
    • +
    + +

    23 January 2017

    +

    Anewbe updated:

    +
      +
    • Can now just click ones boots to draw a holstered knife.
    • +
    • More boots can hold knives now.
    • +
    • Added an action button for breath masks, making it easier to toggle them.
    • +
    • Space Carp have a chance of sticking around after their event completes.
    • +
    • Robotic limbs will no longer show up on the health scanners.
    • +
    • Medics and Security can open firedoors. Do so at your own risk.
    • +
    • Chaplain hoodie now has pockets and an actual hood.
    • +
    • Winter coat hoods have the same armor values as their coats.
    • +
    • Characters will now spawn in at a random level of hunger.
    • +
    • Assisted and Prosthetic organs now have sprites.
    • +
    • Surgical tools will not attack while on help intent, this should prevent people getting accidentally stabbed in surgery.
    • +
    • Tajaran now process reagents slightly faster.
    • +
    • Taj are now allergic to coffee again, per loremaster request.
    • +
    • Taj now get drunk faster.
    • +
    • Hyperzine is now more toxic to Taj.
    • +
    • Readded the Vox for admin/antag use and testing. They breathe Phoron now, rather than Nitrogen.
    • +
    • The Xenotaser should work properly.
    • +
    +

    FTangSteve updated:

    +
      +
    • RootSpeak is now split into a local and a global variant. For now the global acts as a hivemind.
    • +
    +

    Hubblenaut updated:

    +
      +
    • Can now click on turfs with trash bags and similar to quick-gather everything on it. No longer pixelhunting for cigarettes and bullets.
    • +
    • Buckets and other reagent holders will no longer simply be put into the janitorial cart's trash bag.
    • +
    +

    PsiOmegaDelta updated:

    +
      +
    • The round start and auto-antag spawners can now check if players have played long enough to be eligable for selection.
    • +
    +

    Techhead updated:

    +
      +
    • Added a new random event: Shipping Error - A random crate is mistakenly shipped to the station.
    • +
    +

    12 January 2017

    Anewbe updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 0f4251f4ca..dc20965687 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -3229,3 +3229,53 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Neerti: - rscadd: Hand-held flashes and flash rounds will now stun upon repeated applications, similar to stun batons. +2017-01-23: + Anewbe: + - rscadd: Can now just click ones boots to draw a holstered knife. + - rscadd: More boots can hold knives now. + - rscadd: Added an action button for breath masks, making it easier to toggle them. + - rscadd: Space Carp have a chance of sticking around after their event completes. + - tweak: Robotic limbs will no longer show up on the health scanners. + - rscadd: Medics and Security can open firedoors. Do so at your own risk. + - rscadd: Chaplain hoodie now has pockets and an actual hood. + - tweak: Winter coat hoods have the same armor values as their coats. + - rscadd: Characters will now spawn in at a random level of hunger. + - rscadd: Assisted and Prosthetic organs now have sprites. + - rscadd: Surgical tools will not attack while on help intent, this should prevent + people getting accidentally stabbed in surgery. + - rscadd: Tajaran now process reagents slightly faster. + - rscdel: Taj are now allergic to coffee again, per loremaster request. + - tweak: Taj now get drunk faster. + - tweak: Hyperzine is now more toxic to Taj. + - rscadd: Readded the Vox for admin/antag use and testing. They breathe Phoron now, + rather than Nitrogen. + - bugfix: The Xenotaser should work properly. + FTangSteve: + - wip: RootSpeak is now split into a local and a global variant. For now the global + acts as a hivemind. + Hubblenaut: + - tweak: Can now click on turfs with trash bags and similar to quick-gather everything + on it. No longer pixelhunting for cigarettes and bullets. + - bugfix: Buckets and other reagent holders will no longer simply be put into the + janitorial cart's trash bag. + PsiOmegaDelta: + - tweak: The round start and auto-antag spawners can now check if players have played + long enough to be eligable for selection. + Techhead: + - rscadd: 'Added a new random event: Shipping Error - A random crate is mistakenly + shipped to the station.' +2017-01-28: + Anewbe: + - rscadd: Added Medical and Meson aviators. + - rscadd: Medical and Meson aviators are now in the loadout, department locked. + - rscadd: Meson Scanners have been added to the loadout, department locked. + - rscadd: Medical hardsuit has a toggleable sprint. + - bugfix: Carbon and Hematite should show up in asteroid walls. + - rscadd: Readded the random crates from mining. + - rscadd: Digging through an artifact sometimes doesn't destroy the artifact. + - bugfix: Space and cracked sand should no longer stop mining drills. + - rscadd: Diona can regenerate organs and limbs. + PsiOmegaDelta: + - rscadd: Resetting a character slot now requires confirmation. + Zuhayr: + - rscadd: Added a reset slot button to chargen. diff --git a/html/changelogs/Anewbe - Antag_Age.yml b/html/changelogs/Anewbe - Antag_Age.yml deleted file mode 100644 index 0360f8184a..0000000000 --- a/html/changelogs/Anewbe - Antag_Age.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: PsiOmegaDelta - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - tweak: "The round start and auto-antag spawners can now check if players have played long enough to be eligable for selection." diff --git a/html/changelogs/Anewbe - Boot Knives.yml b/html/changelogs/Anewbe - Boot Knives.yml deleted file mode 100644 index dcb76602c2..0000000000 --- a/html/changelogs/Anewbe - Boot Knives.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Can now just click ones boots to draw a holstered knife." - - rscadd: "More boots can hold knives now." \ No newline at end of file diff --git a/html/changelogs/Anewbe - BreathMask.yml b/html/changelogs/Anewbe - BreathMask.yml deleted file mode 100644 index c163d81a06..0000000000 --- a/html/changelogs/Anewbe - BreathMask.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Added an action button for breath masks, making it easier to toggle them." \ No newline at end of file diff --git a/html/changelogs/Anewbe - Carp.yml b/html/changelogs/Anewbe - Carp.yml deleted file mode 100644 index 2e02463ad6..0000000000 --- a/html/changelogs/Anewbe - Carp.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Space Carp have a chance of sticking around after their event completes." diff --git a/html/changelogs/Anewbe - CyberLimbs.yml b/html/changelogs/Anewbe - CyberLimbs.yml deleted file mode 100644 index e454a4a8b5..0000000000 --- a/html/changelogs/Anewbe - CyberLimbs.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - tweak: "Robotic limbs will no longer show up on the health scanners." \ No newline at end of file diff --git a/html/changelogs/Anewbe - Firedoors.yml b/html/changelogs/Anewbe - Firedoors.yml deleted file mode 100644 index ea7a72259a..0000000000 --- a/html/changelogs/Anewbe - Firedoors.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Medics and Security can open firedoors. Do so at your own risk." diff --git a/html/changelogs/Anewbe - HoodsP1.yml b/html/changelogs/Anewbe - HoodsP1.yml deleted file mode 100644 index 4d5adc652e..0000000000 --- a/html/changelogs/Anewbe - HoodsP1.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Chaplain hoodie now has pockets and an actual hood." - - tweak: "Winter coat hoods have the same armor values as their coats." diff --git a/html/changelogs/Anewbe - Hunger.yml b/html/changelogs/Anewbe - Hunger.yml deleted file mode 100644 index 8905ff60c1..0000000000 --- a/html/changelogs/Anewbe - Hunger.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Characters will now spawn in at a random level of hunger." \ No newline at end of file diff --git a/html/changelogs/Anewbe - Languages.yml b/html/changelogs/Anewbe - Languages.yml deleted file mode 100644 index df087346dc..0000000000 --- a/html/changelogs/Anewbe - Languages.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: FTangSteve - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - wip: "RootSpeak is now split into a local and a global variant. For now the global acts as a hivemind." \ No newline at end of file diff --git a/html/changelogs/Anewbe - Organs.yml b/html/changelogs/Anewbe - Organs.yml deleted file mode 100644 index 02d205572a..0000000000 --- a/html/changelogs/Anewbe - Organs.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Assisted and Prosthetic organs now have sprites." \ No newline at end of file diff --git a/html/changelogs/Anewbe - ShippingError.yml b/html/changelogs/Anewbe - ShippingError.yml deleted file mode 100644 index f0f43d8cdd..0000000000 --- a/html/changelogs/Anewbe - ShippingError.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Techhead - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Added a new random event: Shipping Error - A random crate is mistakenly shipped to the station." diff --git a/html/changelogs/Anewbe - Surgerytools.yml b/html/changelogs/Anewbe - Surgerytools.yml deleted file mode 100644 index e6ce2a47b5..0000000000 --- a/html/changelogs/Anewbe - Surgerytools.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Surgical tools will not attack while on help intent, this should prevent people getting accidentally stabbed in surgery." diff --git a/html/changelogs/Anewbe - TajChems.yml b/html/changelogs/Anewbe - TajChems.yml deleted file mode 100644 index eef2b30668..0000000000 --- a/html/changelogs/Anewbe - TajChems.yml +++ /dev/null @@ -1,39 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Tajaran now process reagents slightly faster." - - rscdel: "Taj are now allergic to coffee again, per loremaster request." - - tweak: "Taj now get drunk faster." - - tweak: "Hyperzine is now more toxic to Taj." diff --git a/html/changelogs/Anewbe - UnboxTheVox.yml b/html/changelogs/Anewbe - UnboxTheVox.yml deleted file mode 100644 index 5f6de34cea..0000000000 --- a/html/changelogs/Anewbe - UnboxTheVox.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Readded the Vox for admin/antag use and testing. They breathe Phoron now, rather than Nitrogen." \ No newline at end of file diff --git a/html/changelogs/Anewbe - Xenotaser.yml b/html/changelogs/Anewbe - Xenotaser.yml deleted file mode 100644 index 0684575099..0000000000 --- a/html/changelogs/Anewbe - Xenotaser.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - bugfix: "The Xenotaser should work properly." diff --git a/html/changelogs/Hubblenaut - Custodial.yml b/html/changelogs/Hubblenaut - Custodial.yml deleted file mode 100644 index 881c51aa3b..0000000000 --- a/html/changelogs/Hubblenaut - Custodial.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Hubblenaut - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - tweak: "Can now click on turfs with trash bags and similar to quick-gather everything on it. No longer pixelhunting for cigarettes and bullets." - - bugfix: "Buckets and other reagent holders will no longer simply be put into the janitorial cart's trash bag." \ No newline at end of file diff --git a/icons/effects/projectiles.dmi b/icons/effects/projectiles.dmi index 5598cf6f84..9664b3e13b 100644 Binary files a/icons/effects/projectiles.dmi and b/icons/effects/projectiles.dmi differ diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index 2afd8836d3..6657457344 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/items/lefthand_guns.dmi b/icons/mob/items/lefthand_guns.dmi index dd4369cce7..140f573f69 100644 Binary files a/icons/mob/items/lefthand_guns.dmi and b/icons/mob/items/lefthand_guns.dmi differ diff --git a/icons/mob/items/righthand_guns.dmi b/icons/mob/items/righthand_guns.dmi index d8f221abef..192798733f 100644 Binary files a/icons/mob/items/righthand_guns.dmi and b/icons/mob/items/righthand_guns.dmi differ diff --git a/icons/mob/rig_back.dmi b/icons/mob/rig_back.dmi index aee3eedc77..19bf38764e 100644 Binary files a/icons/mob/rig_back.dmi and b/icons/mob/rig_back.dmi differ diff --git a/icons/mob/species/vox/gloves.dmi b/icons/mob/species/vox/gloves.dmi index e069f8e36f..16fbe55fee 100644 Binary files a/icons/mob/species/vox/gloves.dmi and b/icons/mob/species/vox/gloves.dmi differ diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi index 5871846219..6f272f4d1d 100644 Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ diff --git a/icons/mob/species/vox/shoes.dmi b/icons/mob/species/vox/shoes.dmi index 661e90562a..a5a271f7cb 100644 Binary files a/icons/mob/species/vox/shoes.dmi and b/icons/mob/species/vox/shoes.dmi differ diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi index 41b2cf9eab..9692c5d111 100644 Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index ff4a15e679..c081276a2f 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index 662e2f91cf..ff4ea400ed 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index 08892b83ad..6518425b54 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 0e96c916ee..88105392b5 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index e414cdcd9a..daddbeddbc 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/species/vox/hats.dmi b/icons/obj/clothing/species/vox/hats.dmi index aae8da6a66..a9a71009bf 100644 Binary files a/icons/obj/clothing/species/vox/hats.dmi and b/icons/obj/clothing/species/vox/hats.dmi differ diff --git a/icons/obj/clothing/species/vox/suits.dmi b/icons/obj/clothing/species/vox/suits.dmi index 933e0be817..5efadccb80 100644 Binary files a/icons/obj/clothing/species/vox/suits.dmi and b/icons/obj/clothing/species/vox/suits.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index b08cdc384b..bbce516a0c 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index 2aa2e822c8..3adab0f88e 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/icons/obj/electronic_assemblies.dmi b/icons/obj/electronic_assemblies.dmi index 8fd1c4f5e1..81aa71eac7 100644 Binary files a/icons/obj/electronic_assemblies.dmi and b/icons/obj/electronic_assemblies.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 6bf741b8af..09fb9b6b7a 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 4c77191d26..30f8cdde7c 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 522d540bdb..61cb6a6a8f 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/rig_modules.dmi b/icons/obj/rig_modules.dmi index 11f3beb561..970d2f8a42 100644 Binary files a/icons/obj/rig_modules.dmi and b/icons/obj/rig_modules.dmi differ diff --git a/maps/polaris-1.dmm b/maps/polaris-1.dmm index e6d7511823..b9ca6d0677 100644 --- a/maps/polaris-1.dmm +++ b/maps/polaris-1.dmm @@ -4085,7 +4085,7 @@ "bAC" = (/obj/structure/table/reinforced,/obj/machinery/computer/med_data/laptop{pixel_x = 3; pixel_y = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bAD" = (/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bAE" = (/obj/effect/floor_decal/corner/paleblue{dir = 2},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) -"bAF" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/glasses/hud/health,/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Medical Officer's Desk"; departmentType = 5; name = "Chief Medical Officer RC"; pixel_x = 32; pixel_y = -2},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -26},/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) +"bAF" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/accessory/stethoscope,/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Medical Officer's Desk"; departmentType = 5; name = "Chief Medical Officer RC"; pixel_x = 32; pixel_y = -2},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -26},/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/obj/item/clothing/glasses/sunglasses/medhud,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bAG" = (/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/medical/morgue) "bAH" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue) "bAI" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/medical/morgue) diff --git a/polaris.dme b/polaris.dme index c05f4a6db3..2414d9fdbd 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1394,19 +1394,26 @@ #include "code\modules\hydroponics\trays\tray_tools.dm" #include "code\modules\hydroponics\trays\tray_update_icons.dm" #include "code\modules\integrated_electronics\_defines.dm" -#include "code\modules\integrated_electronics\arithmetic.dm" -#include "code\modules\integrated_electronics\assemblies.dm" -#include "code\modules\integrated_electronics\converters.dm" -#include "code\modules\integrated_electronics\data_transfer.dm" -#include "code\modules\integrated_electronics\input_output.dm" -#include "code\modules\integrated_electronics\logic.dm" -#include "code\modules\integrated_electronics\manipulation.dm" -#include "code\modules\integrated_electronics\memory.dm" -#include "code\modules\integrated_electronics\reagents.dm" -#include "code\modules\integrated_electronics\time.dm" -#include "code\modules\integrated_electronics\tools.dm" -#include "code\modules\integrated_electronics\trig.dm" -#include "code\modules\integrated_electronics\~defines.dm" +#include "code\modules\integrated_electronics\core\assemblies.dm" +#include "code\modules\integrated_electronics\core\helpers.dm" +#include "code\modules\integrated_electronics\core\integrated_circuit.dm" +#include "code\modules\integrated_electronics\core\pins.dm" +#include "code\modules\integrated_electronics\core\tools.dm" +#include "code\modules\integrated_electronics\passive\passive.dm" +#include "code\modules\integrated_electronics\passive\power.dm" +#include "code\modules\integrated_electronics\subtypes\arithmetic.dm" +#include "code\modules\integrated_electronics\subtypes\converters.dm" +#include "code\modules\integrated_electronics\subtypes\data_transfer.dm" +#include "code\modules\integrated_electronics\subtypes\input_output.dm" +#include "code\modules\integrated_electronics\subtypes\logic.dm" +#include "code\modules\integrated_electronics\subtypes\manipulation.dm" +#include "code\modules\integrated_electronics\subtypes\memory.dm" +#include "code\modules\integrated_electronics\subtypes\power.dm" +#include "code\modules\integrated_electronics\subtypes\reagents.dm" +#include "code\modules\integrated_electronics\subtypes\smart.dm" +#include "code\modules\integrated_electronics\subtypes\time.dm" +#include "code\modules\integrated_electronics\subtypes\trig.dm" +#include "code\modules\integrated_electronics\~defines\~defines.dm" #include "code\modules\library\lib_items.dm" #include "code\modules\library\lib_machines.dm" #include "code\modules\library\lib_readme.dm" @@ -1520,6 +1527,7 @@ #include "code\modules\mob\living\carbon\give.dm" #include "code\modules\mob\living\carbon\resist.dm" #include "code\modules\mob\living\carbon\shock.dm" +#include "code\modules\mob\living\carbon\taste.dm" #include "code\modules\mob\living\carbon\viruses.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" #include "code\modules\mob\living\carbon\alien\alien_attacks.dm" @@ -1820,10 +1828,10 @@ #include "code\modules\projectiles\projectile.dm" #include "code\modules\projectiles\ammunition\boxes.dm" #include "code\modules\projectiles\ammunition\bullets.dm" -#include "code\modules\projectiles\guns\alien.dm" #include "code\modules\projectiles\guns\energy.dm" #include "code\modules\projectiles\guns\launcher.dm" #include "code\modules\projectiles\guns\projectile.dm" +#include "code\modules\projectiles\guns\vox.dm" #include "code\modules\projectiles\guns\energy\laser.dm" #include "code\modules\projectiles\guns\energy\nuclear.dm" #include "code\modules\projectiles\guns\energy\pulse.dm"