diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index 01a84fdf5d..8dd637e58f 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -228,13 +228,16 @@ mob/living/carbon/human/airflow_hit(atom/A) var/b_loss = airflow_speed * vsc.airflow_damage var/blocked = run_armor_check(BP_HEAD,"melee") - apply_damage(b_loss/3, BRUTE, BP_HEAD, blocked, 0, "Airflow") + var/soaked = get_armor_soak(BP_HEAD,"melee") + apply_damage(b_loss/3, BRUTE, BP_HEAD, blocked, soaked, 0, "Airflow") blocked = run_armor_check(BP_TORSO,"melee") - apply_damage(b_loss/3, BRUTE, BP_TORSO, blocked, 0, "Airflow") + soaked = get_armor_soak(BP_TORSO,"melee") + apply_damage(b_loss/3, BRUTE, BP_TORSO, blocked, soaked, 0, "Airflow") blocked = run_armor_check(BP_GROIN,"melee") - apply_damage(b_loss/3, BRUTE, BP_GROIN, blocked, 0, "Airflow") + soaked = get_armor_soak(BP_GROIN,"melee") + apply_damage(b_loss/3, BRUTE, BP_GROIN, blocked, soaked, 0, "Airflow") if(airflow_speed > 10) Paralyse(round(airflow_speed * vsc.airflow_stun)) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 52c56ccb17..94032dcba3 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -341,6 +341,7 @@ var/mob/living/carbon/C = usr C.swap_hand() else - var/turf/T = screen_loc2turf("screen-loc", get_turf(usr)) - T.Click(location, control, params) + var/turf/T = screen_loc2turf(screen_loc, get_turf(usr)) + if(T) + T.Click(location, control, params) . = 1 diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm index 97d193bc5b..796fb0b664 100644 --- a/code/controllers/communications.dm +++ b/code/controllers/communications.dm @@ -108,6 +108,7 @@ var/const/ERT_FREQ = 1345 var/const/AI_FREQ = 1343 var/const/DTH_FREQ = 1341 var/const/SYND_FREQ = 1213 +var/const/RAID_FREQ = 1277 var/const/ENT_FREQ = 1461 //entertainment frequency. This is not a diona exclusive frequency. // department channels @@ -133,6 +134,7 @@ var/list/radiochannels = list( "Response Team" = ERT_FREQ, "Special Ops" = DTH_FREQ, "Mercenary" = SYND_FREQ, + "Raider" = RAID_FREQ, "Supply" = SUP_FREQ, "Service" = SRV_FREQ, "AI Private" = AI_FREQ, @@ -145,7 +147,7 @@ var/list/radiochannels = list( var/list/CENT_FREQS = list(ERT_FREQ, DTH_FREQ) // Antag channels, i.e. Syndicate -var/list/ANTAG_FREQS = list(SYND_FREQ) +var/list/ANTAG_FREQS = list(SYND_FREQ, RAID_FREQ) //Department channels, arranged lexically var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, ENT_FREQ, MED_FREQ, SEC_FREQ, SCI_FREQ, SRV_FREQ, SUP_FREQ) diff --git a/code/datums/autolathe/engineering.dm b/code/datums/autolathe/engineering.dm index 0921806ac0..ca40b4a6a9 100644 --- a/code/datums/autolathe/engineering.dm +++ b/code/datums/autolathe/engineering.dm @@ -74,6 +74,10 @@ name = "request console electronics" path =/obj/item/weapon/circuitboard/request +/datum/category_item/autolathe/engineering/pipelayer + name = "pipe layer electronics" + path =/obj/item/weapon/circuitboard/pipelayer + /datum/category_item/autolathe/engineering/motor name = "motor" path =/obj/item/weapon/stock_parts/motor diff --git a/code/datums/autolathe/tools.dm b/code/datums/autolathe/tools.dm index 50361e94d2..af90436602 100644 --- a/code/datums/autolathe/tools.dm +++ b/code/datums/autolathe/tools.dm @@ -14,6 +14,11 @@ name = "welding tool" path =/obj/item/weapon/weldingtool +/datum/category_item/autolathe/tools/electric_welder + name = "electric welding tool" + path =/obj/item/weapon/weldingtool/electric/unloaded + hidden = 1 + /datum/category_item/autolathe/tools/screwdriver name = "screwdriver" path =/obj/item/weapon/screwdriver diff --git a/code/datums/supplypacks/costumes.dm b/code/datums/supplypacks/costumes.dm index e9a1365b7b..321c0fde0e 100644 --- a/code/datums/supplypacks/costumes.dm +++ b/code/datums/supplypacks/costumes.dm @@ -156,7 +156,7 @@ datum/supply_packs/costumes/witch /obj/item/clothing/under/wedding/bride_blue, /obj/item/clothing/under/wedding/bride_red, /obj/item/clothing/under/wedding/bride_white, - /obj/item/clothing/under/dress/sundress, + /obj/item/clothing/under/sundress, /obj/item/clothing/under/dress/dress_green, /obj/item/clothing/under/dress/dress_pink, /obj/item/clothing/under/dress/dress_orange, diff --git a/code/datums/supplypacks/engineering.dm b/code/datums/supplypacks/engineering.dm index 3ab678e175..0cf0e1f52a 100644 --- a/code/datums/supplypacks/engineering.dm +++ b/code/datums/supplypacks/engineering.dm @@ -33,6 +33,15 @@ containertype = /obj/structure/closet/crate/engineering/electrical containername = "Electrical maintenance crate" +/datum/supply_packs/eng/e_welders + name = "Electric welder crate" + contains = list( + /obj/item/weapon/weldingtool/electric = 3 + ) + cost = 15 + containertype = /obj/structure/closet/crate/engineering/electrical + containername = "Electric welder crate" + /datum/supply_packs/eng/mechanical name = "Mechanical maintenance crate" contains = list( diff --git a/code/datums/supplypacks/hydroponics.dm b/code/datums/supplypacks/hydroponics.dm index 25f06143d0..a962986587 100644 --- a/code/datums/supplypacks/hydroponics.dm +++ b/code/datums/supplypacks/hydroponics.dm @@ -141,9 +141,10 @@ access = access_hydroponics /datum/supply_packs/hydro/tray - name = "Empty hydroponics tray" - cost = 20 + name = "Empty hydroponics trays" + cost = 50 containertype = /obj/structure/closet/crate/hydroponics containername = "Hydroponics tray crate" - contains = list(/obj/machinery/portable_atmospherics/hydroponics{anchored = 0}) - access = access_hydroponics \ No newline at end of file + contains = list(/obj/machinery/portable_atmospherics/hydroponics{anchored = 0} = 3) + access = access_hydroponics + diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index e7b29fd8d9..13a69cfc1a 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -66,6 +66,27 @@ containername = "Surgery crate" access = access_medical +/datum/supply_packs/med/deathalarm + name = "Death Alarm crate" + contains = list( + /obj/item/weapon/storage/box/cdeathalarm_kit, + /obj/item/weapon/storage/box/cdeathalarm_kit + ) + cost = 40 + containertype = "/obj/structure/closet/crate/secure" + containername = "Death Alarm crate" + access = access_medical + +/datum/supply_packs/med/clotting + name = "Clotting Medicine crate" + contains = list( + /obj/item/weapon/storage/firstaid/clotting + ) + cost = 40 + containertype = "/obj/structure/closet/crate/secure" + containername = "Clotting Medicine crate" + access = access_medical + /datum/supply_packs/med/sterile name = "Sterile equipment crate" contains = list( diff --git a/code/datums/supplypacks/munitions.dm b/code/datums/supplypacks/munitions.dm index 2a341c5c80..e2df9609ad 100644 --- a/code/datums/supplypacks/munitions.dm +++ b/code/datums/supplypacks/munitions.dm @@ -74,6 +74,14 @@ containername = "Energy marksman crate" access = access_armory +/datum/supply_packs/munitions/burstlaser + name = "Burst laser crate" + contains = list(/obj/item/weapon/gun/energy/gun/burst = 2) + cost = 50 + containertype = /obj/structure/closet/crate/secure + containername = "Burst laser crate" + access = access_armory + /datum/supply_packs/munitions/ionweapons name = "Electromagnetic weapons crate" contains = list( @@ -85,6 +93,17 @@ containername = "electromagnetic weapons crate" access = access_armory +/datum/supply_packs/munitions/ionpistols + name = "Electromagnetic pistols crate" + contains = list( + /obj/item/weapon/gun/energy/ionrifle/pistol = 2, + /obj/item/weapon/storage/box/emps + ) + cost = 30 + containertype = /obj/structure/closet/crate/secure + containername = "electromagnetic weapons crate" + access = access_armory + /datum/supply_packs/randomised/munitions/automatic name = "Automatic weapon crate" num_contained = 2 diff --git a/code/datums/supplypacks/robotics.dm b/code/datums/supplypacks/robotics.dm index d4efac5a1e..0f1a0c3b66 100644 --- a/code/datums/supplypacks/robotics.dm +++ b/code/datums/supplypacks/robotics.dm @@ -158,4 +158,14 @@ /obj/item/device/kit/paint/gygax/darkgygax, /obj/item/device/kit/paint/gygax/recitence ) - name = "Random Gygax exosuit modkit" \ No newline at end of file + name = "Random Gygax exosuit modkit" + +/datum/supply_packs/robotics/jumper_cables + name = "Jumper kit crate" + contains = list( + /obj/item/device/defib_kit/jumper_kit = 4 + ) + cost = 30 + containertype = /obj/structure/closet/crate/secure/science + containername = "Jumper kit crate" + access = access_robotics \ No newline at end of file diff --git a/code/datums/supplypacks/science.dm b/code/datums/supplypacks/science.dm index 2f61ebba12..b0853b0e00 100644 --- a/code/datums/supplypacks/science.dm +++ b/code/datums/supplypacks/science.dm @@ -40,6 +40,7 @@ name = "Exotic seeds crate" contains = list( /obj/item/seeds/replicapod = 2, + /obj/item/seeds/ambrosiavulgarisseed = 2, /obj/item/seeds/libertymycelium, /obj/item/seeds/reishimycelium, /obj/item/seeds/random = 6, @@ -49,4 +50,3 @@ containertype = /obj/structure/closet/crate/hydroponics containername = "Exotic Seeds crate" access = access_hydroponics - diff --git a/code/datums/uplink/medical.dm b/code/datums/uplink/medical.dm index 381221127d..eab9d9cd02 100644 --- a/code/datums/uplink/medical.dm +++ b/code/datums/uplink/medical.dm @@ -19,6 +19,16 @@ item_cost = 5 path = /obj/item/weapon/storage/box/ambrosia +/datum/uplink_item/item/medical/clotting + name = "Clotting Medicine injector" + item_cost = 10 + path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting + +/datum/uplink_item/item/medical/bonemeds + name = "Bone Repair injector" + item_cost = 10 + path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed + /datum/uplink_item/item/medical/ambrosiadeusseeds name = "Box of 7x ambrosia deus seed packets" item_cost = 10 diff --git a/code/game/antagonist/antagonist_create.dm b/code/game/antagonist/antagonist_create.dm index 733ec3eda0..a53037ead3 100644 --- a/code/game/antagonist/antagonist_create.dm +++ b/code/game/antagonist/antagonist_create.dm @@ -43,12 +43,15 @@ /datum/antagonist/proc/create_radio(var/freq, var/mob/living/carbon/human/player) var/obj/item/device/radio/R - if(freq == SYND_FREQ) - R = new/obj/item/device/radio/headset/syndicate(player) - else - R = new/obj/item/device/radio/headset(player) + switch(freq) + if(SYND_FREQ) + R = new/obj/item/device/radio/headset/syndicate(player) + if(RAID_FREQ) + R = new/obj/item/device/radio/headset/raider(player) + else + R = new/obj/item/device/radio/headset(player) + R.set_frequency(freq) - R.set_frequency(freq) player.equip_to_slot_or_del(R, slot_l_ear) return R diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm index 1a7da8954e..4124fc9af9 100644 --- a/code/game/antagonist/outsider/raider.dm +++ b/code/game/antagonist/outsider/raider.dm @@ -232,7 +232,7 @@ var/datum/antagonist/raider/raiders W.handle_item_insertion(id) player.equip_to_slot_or_del(W, slot_wear_id) spawn_money(rand(50,150)*10,W) - create_radio(SYND_FREQ, player) + create_radio(RAID_FREQ, player) return 1 diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index da165448da..75ba732950 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -305,7 +305,7 @@ if(subject.isSynthetic()) scantemp = "Error: Majority of subject is non-organic." return - if (subject.suiciding == 1) + if (subject.suiciding) scantemp = "Error: Subject's brain is not responding to scanning stimuli." return if ((!subject.ckey) || (!subject.client)) diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm index 0de61b4685..40726825a1 100644 --- a/code/game/machinery/pipe/pipelayer.dm +++ b/code/game/machinery/pipe/pipelayer.dm @@ -1,57 +1,104 @@ /obj/machinery/pipelayer - name = "automatic pipe layer" icon = 'icons/obj/stationobjs.dmi' icon_state = "pipe_d" density = 1 - var/turf/old_turf - var/old_dir - var/on = 0 - var/a_dis = 0 - var/P_type = 0 - var/P_type_t = "" - var/max_metal = 50 - var/metal = 10 - var/obj/item/weapon/wrench/W + circuit = /obj/item/weapon/circuitboard/pipelayer + var/turf/old_turf // Last turf we were on. + var/old_dir // Last direction we were facing. + var/on = 0 // Pipelaying online? + var/a_dis = 0 // Auto-dismantling - If enabled it will remove floor tiles + var/P_type = 0 // Currently selected pipe type + var/P_type_t = "" // Name of currently selected pipe type + var/max_metal = 50 // Max capacity for internal metal storage + var/metal = 0 // Current amount in internal metal storage + var/pipe_cost = 0.25 // Cost in steel for each pipe. + var/obj/item/weapon/wrench/W // Internal wrench used for wrenching down the pipes var/list/Pipes = list("regular pipes"=0,"scrubbers pipes"=31,"supply pipes"=29,"heat exchange pipes"=2) /obj/machinery/pipelayer/New() W = new(src) ..() + default_apply_parts() + update_icon() +/obj/machinery/pipelayer/Destroy() + qdel(W) + W = null + ..() + +/obj/machinery/pipelayer/RefreshParts() + var/mb_rating = 0 + for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) + mb_rating += M.rating + max_metal = mb_rating * initial(max_metal) + +/obj/machinery/pipelayer/dismantle() + eject_metal() + ..() + +// Whenever we move, if enabled try and lay pipe /obj/machinery/pipelayer/Move(new_turf,M_Dir) ..() if(on && a_dis) dismantleFloor(old_turf) - layPipe(old_turf,M_Dir,old_dir) + layPipe(old_turf, M_Dir, old_dir) old_turf = new_turf - old_dir = turn(M_Dir,180) + old_dir = turn(M_Dir, 180) /obj/machinery/pipelayer/attack_hand(mob/user as mob) - if(!metal&&!on) + if(..()) + return + if(panel_open) + if(metal < 1) + user << "\The [src] is empty." + return + var/answer = alert(user, "Do you want to eject all the metal in \the [src]?", , "Yes","No") + if(answer == "Yes") + var/amount_ejected = eject_metal() + user.visible_message("[user] removes [amount_ejected] sheet\s of [DEFAULT_WALL_MATERIAL] from the \the [src].", + "You remove [amount_ejected] sheet\s of [DEFAULT_WALL_MATERIAL] from \the [src].") + return + if(!metal && !on) user << "\The [src] doesn't work without metal." return - on=!on + on = !on + old_turf = get_turf(src) + old_dir = dir user.visible_message("[user] has [!on?"de":""]activated \the [src].", "You [!on?"de":""]activate \the [src].") return /obj/machinery/pipelayer/attackby(var/obj/item/W as obj, var/mob/user as mob) - - if (istype(W, /obj/item/weapon/wrench)) + if(default_deconstruction_screwdriver(user, W)) + return + if(default_deconstruction_crowbar(user, W)) + return + if(default_part_replacement(user, W)) + return + if (!panel_open && iswrench(W)) P_type_t = input("Choose pipe type", "Pipe type") as null|anything in Pipes P_type = Pipes[P_type_t] user.visible_message("[user] has set \the [src] to manufacture [P_type_t].", "You set \the [src] to manufacture [P_type_t].") return - - if(istype(W, /obj/item/weapon/crowbar)) - a_dis=!a_dis + if(!panel_open && iscrowbar(W)) + a_dis = !a_dis user.visible_message("[user] has [!a_dis?"de":""]activated auto-dismantling.", "You [!a_dis?"de":""]activate auto-dismantling.") return - + if(istype(W, /obj/item/pipe)) + // NOTE - We must check for matter, otherwise the (free) pipe dispenser can be used to get infinite steel. + if(!W.matter || W.matter[DEFAULT_WALL_MATERIAL] < pipe_cost * SHEET_MATERIAL_AMOUNT) + user << "\The [W] doesn't contain enough [DEFAULT_WALL_MATERIAL] to recycle." + else if(metal + pipe_cost > max_metal) + user << "\The [src] is full." + else + user.drop_from_inventory(W) + metal += pipe_cost + usr << "You recycle \the [W]." + qdel(W) + return if(istype(W, /obj/item/stack/material) && W.get_material_name() == DEFAULT_WALL_MATERIAL) - var/result = load_metal(W) if(isnull(result)) user << "Unable to load [W] - no metal found." @@ -59,23 +106,8 @@ user << "\The [src] is full." else user.visible_message("[user] has loaded metal into \the [src].", "You load metal into \the [src]") - return - if(istype(W, /obj/item/weapon/screwdriver)) - if(metal) - var/m = round(input(usr,"Please specify the amount of metal to remove","Remove metal",min(round(metal),50)) as num, 1) - m = min(m, 50) - m = min(m, round(metal)) - m = round(m) - if(m) - use_metal(m) - var/obj/item/stack/material/steel/MM = new (get_turf(src)) - MM.amount = m - user.visible_message("[user] removes [m] sheet\s of metal from the \the [src].", "You remove [m] sheet\s of metal from \the [src]") - else - user << "\The [src] is empty." - return ..() /obj/machinery/pipelayer/examine(mob/user) @@ -83,7 +115,7 @@ user << "\The [src] has [metal] sheet\s, is set to produce [P_type_t], and auto-dismantling is [!a_dis?"de":""]activated." /obj/machinery/pipelayer/proc/reset() - on=0 + on = 0 return /obj/machinery/pipelayer/proc/load_metal(var/obj/item/stack/MM) @@ -100,12 +132,22 @@ return /obj/machinery/pipelayer/proc/use_metal(amount) - if(!metal || metal= 1) + var/material/M = get_material_by_name(DEFAULT_WALL_MATERIAL) + var/obj/item/stack/material/S = new M.stack_type(get_turf(src)) + S.amount = min(metal, S.max_amount) + metal -= S.amount + amount_ejected += S.amount + return amount_ejected + /obj/machinery/pipelayer/proc/dismantleFloor(var/turf/new_turf) if(istype(new_turf, /turf/simulated/floor)) var/turf/simulated/floor/T = new_turf @@ -114,11 +156,11 @@ return new_turf.is_plating() /obj/machinery/pipelayer/proc/layPipe(var/turf/w_turf,var/M_Dir,var/old_dir) - if(!on || !(M_Dir in list(1, 2, 4, 8)) || M_Dir==old_dir) + if(!on || !(M_Dir in list(NORTH, SOUTH, EAST, WEST)) || M_Dir==old_dir) return reset() - if(!use_metal(0.25)) + if(!use_metal(pipe_cost)) return reset() - var/fdirn = turn(M_Dir,180) + var/fdirn = turn(M_Dir, 180) var/p_type var/p_dir @@ -130,6 +172,8 @@ p_dir=M_Dir var/obj/item/pipe/P = new (w_turf, pipe_type=p_type, dir=p_dir) + // We used metal to make these, so should be reclaimable! + P.matter = list(DEFAULT_WALL_MATERIAL = pipe_cost * SHEET_MATERIAL_AMOUNT) P.attackby(W , src) return 1 diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 4349752370..6dd278dc63 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, /obj/item/device/electronic_assembly) + 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, /obj/item/weapon/weldingtool/electric) var/icon_state_charged = "recharger2" var/icon_state_charging = "recharger1" var/icon_state_idle = "recharger0" //also when unpowered @@ -33,19 +33,19 @@ obj/machinery/recharger if(allowed) if(charging) - user << "\A [charging] is already charging here." + to_chat(user, "\A [charging] is already charging here.") return // Checks to make sure he's not in space doing it, and that the area got proper power. if(!powered()) - user << "The [name] blinks red as you try to insert the item!" + to_chat(user, "The [name] blinks red as you try to insert the item!") return if(istype(G, /obj/item/weapon/gun/energy)) var/obj/item/weapon/gun/energy/E = G if(!E.power_supply) - user << "Your gun has no power cell." + to_chat(user, "Your gun has no power cell.") return if(E.self_recharge) - user << "Your gun has no recharge port." + to_chat(user, "Your gun has no recharge port.") return if(istype(G, /obj/item/weapon/gun/energy/staff)) return @@ -65,16 +65,22 @@ obj/machinery/recharger if(!assembly.battery) to_chat(user, "The assembly doesn't have a power cell.") return + if(istype(G, /obj/item/weapon/weldingtool/electric)) + var/obj/item/weapon/weldingtool/electric/welder = G + if(!welder.power_supply) + to_chat(user, "Your welder has no power cell.") + return + user.drop_item() G.loc = src charging = G update_icon() else if(portable && istype(G, /obj/item/weapon/wrench)) if(charging) - user << "Remove [charging] first!" + to_chat(user, "Remove [charging] first!") return anchored = !anchored - user << "You [anchored ? "attached" : "detached"] the recharger." + to_chat(user, "You [anchored ? "attached" : "detached"] the recharger.") playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) else if(default_deconstruction_screwdriver(user, G)) return @@ -208,8 +214,8 @@ obj/machinery/recharger name = "wall recharger" icon = 'icons/obj/stationobjs.dmi' icon_state = "wrecharger0" - active_power_usage = 25000 //25 kW , It's more specialized than the standalone recharger (guns and batons only) so make it more powerful - allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/weapon/cell/device) + active_power_usage = 25000 //25 kW , It's more specialized than the standalone recharger (guns, batons, and flashlights only) so make it more powerful + allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/flashlight, /obj/item/weapon/cell/device) icon_state_charged = "wrecharger2" icon_state_charging = "wrecharger1" icon_state_idle = "wrecharger0" diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 7d27c94b65..9838d80722 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -374,6 +374,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept blackbox.msg_deathsquad += blackbox_msg if(SYND_FREQ) blackbox.msg_syndicate += blackbox_msg + if(RAID_FREQ) + blackbox.msg_raider += blackbox_msg if(SUP_FREQ) blackbox.msg_cargo += blackbox_msg if(SRV_FREQ) @@ -554,6 +556,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept blackbox.msg_deathsquad += blackbox_msg if(SYND_FREQ) blackbox.msg_syndicate += blackbox_msg + if(RAID_FREQ) + blackbox.msg_raider += blackbox_msg if(SUP_FREQ) blackbox.msg_cargo += blackbox_msg if(SRV_FREQ) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index b5c0df7127..3ecb7c7b2d 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -226,7 +226,7 @@ delete_me = 1 /obj/effect/landmark/costume/cutewitch/New() - new /obj/item/clothing/under/dress/sundress(src.loc) + new /obj/item/clothing/under/sundress(src.loc) new /obj/item/clothing/head/witchwig(src.loc) new /obj/item/weapon/staff/broom(src.loc) delete_me = 1 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 0559b626e1..4316da3c49 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -44,6 +44,7 @@ var/slowdown = 0 // How much clothing is slowing you down. Negative values speeds you up var/canremove = 1 //Mostly for Ninja code at this point but basically will not allow the item to be removed if set to 0. /N var/list/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + var/list/armorsoak = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) var/list/allowed = null //suit storage stuff. var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers. var/zoomdevicename = null //name used for message when binoculars/scope is used diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index b6d8a81709..c609d38c4a 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -2,7 +2,7 @@ name = "inteliCard" icon = 'icons/obj/pda.dmi' icon_state = "aicard" // aicard-full - item_state = "electronic" + item_state = "aicard" w_class = ITEMSIZE_SMALL slot_flags = SLOT_BELT show_messages = 0 diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index a4b0a02c5a..73efffe121 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -8,6 +8,8 @@ var/state //0 off, 1 open, 2 working, 3 dead var/uses = 2 //Calculates initial uses based on starting cell size + var/use_on_synthetic = 0 //If 1, this is only useful on FBPs, if 0, this is only useful on fleshies + var/pad_name = "defib pads" //Just the name given for some cosmetic things var/chance = 75 //Percent chance of working var/charge_cost //Set in New() based on uses var/obj/item/weapon/cell/cell //The size is mostly irrelevant, see 'uses' @@ -32,13 +34,31 @@ if(istype(onto) && Adjacent(usr) && !usr.restrained() && !usr.stat) var/mob/living/carbon/human/user = usr //<--Feel free to code clothing checks right here - user.visible_message("[user] begins applying defib pads to [onto].", - "You begin applying defib pads to [onto].") + if(can_defib(onto)) + user.visible_message("[user] begins applying [pad_name] to [onto].", + "You begin applying [pad_name] to [onto].") if(do_after(user, 100, onto)) patient = onto statechange(1,patient) - user.visible_message("[user] applies defib pads to [onto].", - "You finish applying defib pads to [onto].") + user.visible_message("[user] applies [pad_name] to [onto].", + "You finish applying [pad_name] to [onto].") + + +//can_defib() check is where all of the qualifying conditions should go +//Could probably toss in checks here for damage, organs, etc, but for now I'll leave it as just this +/obj/item/device/defib_kit/proc/can_defib(var/mob/living/carbon/human/target) + var/mob/living/carbon/human/user = usr + if(use_on_synthetic && !target.isSynthetic()) + to_chat(user, "[src] isn't designed for organics!") + return 0 + else if(!use_on_synthetic && target.isSynthetic()) + to_chat(user, "[src] isn't designed for synthetics!") + return 0 + else if(!target.isSynthetic() && ((world.time - target.timeofdeath) > (10 MINUTES)))//Can only revive organics within a few minutes + to_chat(user, "There is no spark of life in [target.name], they've been dead too long to revive this way.") + return 0 + return 1 + /obj/item/device/defib_kit/attackby(var/obj/item/A as obj, mob/living/user as mob) ..() @@ -94,7 +114,7 @@ //Patient moved too far if(patient && !(get_dist(src,patient) <= 1)) //You separated the kit and pads too far - audible_message("There's a clatter as the defib pads are yanked off of [patient].") + audible_message("There is a clatter as the [pad_name] are yanked off of [patient].") statechange(0) patient = null return @@ -111,7 +131,7 @@ patient.visible_message("[patient] convulses!") playsound(src.loc, 'sound/effects/sparks2.ogg', 75, 1) //Actual rezzing code - if(prob(chance) && ((world.time - patient.timeofdeath) < (10 MINUTES))) //Can only revive within a few minutes + if(prob(chance)) if(!patient.client && patient.mind) //Don't force the dead person to come back if they don't want to. for(var/mob/observer/dead/ghost in player_list) if(ghost.mind == patient.mind) @@ -155,3 +175,10 @@ break return + +/obj/item/device/defib_kit/jumper_kit + name = "jumper cable kit" + desc = "This Morpheus-branded FBP defib kit is a semi-automated model. Apply cables, step back, wait." + icon_state = "jumper_kit" + use_on_synthetic = 1 + pad_name = "jumper cables" diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 27ee923a1b..9b573a2cf1 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -181,6 +181,38 @@ else return ..() +/obj/item/device/flashlight/MouseDrop(obj/over_object as obj) + if(!canremove) + return + + if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist + + if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why? + return + + if (!( istype(over_object, /obj/screen) )) + return ..() + + //makes sure that the thing is equipped, so that we can't drag it into our hand from miles away. + //there's got to be a better way of doing this. + if (!(src.loc == usr) || (src.loc && src.loc.loc == usr)) + return + + if (( usr.restrained() ) || ( usr.stat )) + return + + if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src)) + return + + switch(over_object.name) + if("r_hand") + usr.u_equip(src) + usr.put_in_r_hand(src) + if("l_hand") + usr.u_equip(src) + usr.put_in_l_hand(src) + src.add_fingerprint(usr) + /obj/item/device/flashlight/attackby(obj/item/weapon/W, mob/user as mob) if(power_use) if(istype(W, /obj/item/weapon/cell)) @@ -210,6 +242,26 @@ w_class = ITEMSIZE_TINY power_use = 0 +/obj/item/device/flashlight/color //Default color is blue, just roll with it. + name = "blue flashlight" + desc = "A hand-held emergency light. This one is blue." + icon_state = "flashlight_blue" + +/obj/item/device/flashlight/color/red + name = "red flashlight" + desc = "A hand-held emergency light. This one is red." + icon_state = "flashlight_red" + +/obj/item/device/flashlight/color/orange + name = "orange flashlight" + desc = "A hand-held emergency light. This one is orange." + icon_state = "flashlight_orange" + +/obj/item/device/flashlight/color/yellow + name = "yellow flashlight" + desc = "A hand-held emergency light. This one is yellow." + icon_state = "flashlight_yellow" + /obj/item/device/flashlight/maglight name = "maglight" desc = "A very, very heavy duty flashlight." diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index f08585da31..7bec1014d7 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -19,6 +19,12 @@ origin_tech = list(TECH_ILLEGAL = 3) syndie = 1//Signifies that it de-crypts Syndicate transmissions +/obj/item/device/encryptionkey/raider + icon_state = "cypherkey" + channels = list("Raider" = 1) + origin_tech = list(TECH_ILLEGAL = 2) + syndie = 1 + /obj/item/device/encryptionkey/binary icon_state = "cypherkey" translate_binary = 1 diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index fce4ec3175..a56ea4fa98 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -75,6 +75,15 @@ syndie = 1 ks1type = /obj/item/device/encryptionkey/syndicate +/obj/item/device/radio/headset/raider + origin_tech = list(TECH_ILLEGAL = 2) + syndie = 1 + ks1type = /obj/item/device/encryptionkey/raider + +/obj/item/device/radio/headset/raider/initialize() + ..() + set_frequency(RAID_FREQ) + /obj/item/device/radio/headset/binary origin_tech = list(TECH_ILLEGAL = 3) ks1type = /obj/item/device/encryptionkey/binary @@ -289,6 +298,7 @@ desc = "The headset of the boss's boss." icon_state = "com_headset" item_state = "headset" + centComm = 1 // freerange = 1 ks2type = /obj/item/device/encryptionkey/ert diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index c480d2dd16..8e9a72d203 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -27,6 +27,8 @@ /obj/item/device/radio/intercom/specops name = "\improper Spec Ops intercom" frequency = ERT_FREQ + subspace_transmission = 1 + centComm = 1 /obj/item/device/radio/intercom/department canhear_range = 5 @@ -81,6 +83,17 @@ ..() internal_channels[num2text(SYND_FREQ)] = list(access_syndicate) +/obj/item/device/radio/intercom/raider + name = "illicit intercom" + desc = "Pirate radio, but not in the usual sense of the word." + frequency = RAID_FREQ + subspace_transmission = 1 + syndie = 1 + +/obj/item/device/radio/intercom/raider/New() + ..() + internal_channels[num2text(RAID_FREQ)] = list(access_syndicate) + /obj/item/device/radio/intercom/Destroy() processing_objects -= src ..() diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index cec23e818f..1bd7f9349a 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -40,6 +40,7 @@ var/global/list/default_medbay_channels = list( var/list/channels = list() //see communications.dm for full list. First channel is a "default" for :h var/subspace_transmission = 0 var/syndie = 0//Holder to see if it's a syndicate encrypted radio + var/centComm = 0//Holder to see if it's a CentComm encrypted radio flags = CONDUCT slot_flags = SLOT_BELT throw_speed = 2 @@ -508,6 +509,9 @@ var/global/list/default_medbay_channels = list( if(freq in ANTAG_FREQS) if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys return -1 + if(freq in CENT_FREQS) + if(!(src.centComm))//Checks to see if it's allowed on that frequency, based on the encryption keys + return -1 if (!on) return -1 if (!freq) //recieved on main frequency diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm index dde6814494..525c5d1255 100644 --- a/code/game/objects/items/devices/t_scanner.dm +++ b/code/game/objects/items/devices/t_scanner.dm @@ -4,9 +4,9 @@ name = "\improper T-ray scanner" desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." icon_state = "t-ray0" + item_state = "t-ray" slot_flags = SLOT_BELT w_class = ITEMSIZE_SMALL - item_state = "electronic" matter = list(DEFAULT_WALL_MATERIAL = 150) origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 0533b207c5..7baf73270f 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -21,6 +21,7 @@ name = "robotic module reset board" desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot." icon_state = "cyborg_upgrade1" + item_state = "cyborg_upgrade" require_module = 1 /obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R) @@ -43,6 +44,7 @@ name = "robot reclassification board" desc = "Used to rename a cyborg." icon_state = "cyborg_upgrade1" + item_state = "cyborg_upgrade" var/heldname = "default name" /obj/item/borg/upgrade/rename/attack_self(mob/user as mob) @@ -61,6 +63,7 @@ name = "robot emergency restart module" desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online." icon_state = "cyborg_upgrade1" + item_state = "cyborg_upgrade" /obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R) @@ -84,6 +87,7 @@ name = "robotic VTEC Module" desc = "Used to kick in a robot's VTEC systems, increasing their speed." icon_state = "cyborg_upgrade2" + item_state = "cyborg_upgrade" require_module = 1 /obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R) @@ -100,6 +104,7 @@ name = "robotic Rapid Taser Cooling Module" desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate." icon_state = "cyborg_upgrade3" + item_state = "cyborg_upgrade" require_module = 1 @@ -134,6 +139,7 @@ name = "mining robot jetpack" desc = "A carbon dioxide jetpack suitable for low-gravity mining operations." icon_state = "cyborg_upgrade3" + item_state = "cyborg_upgrade" require_module = 1 /obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R) @@ -155,6 +161,7 @@ name = "illegal equipment module" desc = "Unlocks the hidden, deadlier functions of a robot" icon_state = "cyborg_upgrade3" + item_state = "cyborg_upgrade" require_module = 1 /obj/item/borg/upgrade/syndicate/action(var/mob/living/silicon/robot/R) diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 6d04184785..76c4f9e768 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -87,6 +87,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/icon_on var/type_butt = null var/chem_volume = 0 + var/max_smoketime = 0 //Related to sprites var/smoketime = 0 var/is_pipe = 0 //Prevents a runtime with pipes var/matchmes = "USER lights NAME with FLAME" @@ -100,8 +101,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM ..() flags |= NOREACT // so it doesn't react until you light it create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15 + if(smoketime && !max_smoketime) + max_smoketime = smoketime /obj/item/clothing/mask/smokable/proc/smoke(amount) + if(smoketime > max_smoketime) + smoketime = max_smoketime smoketime -= amount if(reagents && reagents.total_volume) // check if it has any reagents at all if(ishuman(loc)) @@ -120,11 +125,29 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(location) location.hotspot_expose(700, 5) +/obj/item/clothing/mask/smokable/update_icon() + if(lit) + icon_state = "[initial(icon_state)]_on" + item_state = "[initial(item_state)]_on" + else if(smoketime < max_smoketime) + if(is_pipe) + icon_state = initial(icon_state) + item_state = initial(item_state) + else + icon_state = "[initial(icon_state)]_burnt" + item_state = "[initial(item_state)]_burnt" + if(ismob(loc)) + var/mob/living/M = loc + M.update_inv_wear_mask(0) + M.update_inv_l_hand(0) + M.update_inv_r_hand(1) + ..() + /obj/item/clothing/mask/smokable/examine(mob/user) ..() if(is_pipe) return - var/smoke_percent = round((smoketime / initial(smoketime)) * 100) + var/smoke_percent = round((smoketime / max_smoketime) * 100) switch(smoke_percent) if(90 to INFINITY) user << "[src] is still fresh." @@ -156,15 +179,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM return flags &= ~NOREACT // allowing reagents to react after being lit reagents.handle_reactions() - icon_state = icon_on - item_state = icon_on - if(ismob(loc)) - var/mob/living/M = loc - M.update_inv_wear_mask(0) - M.update_inv_l_hand(0) - M.update_inv_r_hand(1) var/turf/T = get_turf(src) T.visible_message(flavor_text) + update_icon() set_light(2, 0.25, "#E38F46") processing_objects.Add(src) @@ -205,14 +222,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/proc/quench() lit = 0 processing_objects.Remove(src) - icon_state = initial(icon_state) - item_state = initial(item_state) - - if(ismob(loc)) - var/mob/living/M = loc - M.update_inv_wear_mask(0) - M.update_inv_l_hand(0) - M.update_inv_r_hand(1) + update_icon() /obj/item/clothing/mask/smokable/attack(mob/living/carbon/human/H, mob/user, def_zone) if(lit && H == user && istype(H)) @@ -259,15 +269,15 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette name = "cigarette" desc = "A roll of tobacco and nicotine." - icon_state = "cigoff" + icon_state = "cig" + item_state = "cig" throw_speed = 0.5 - item_state = "cigoff" w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS | SLOT_MASK attack_verb = list("burnt", "singed") - icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi type_butt = /obj/item/weapon/cigbutt chem_volume = 15 + max_smoketime = 300 smoketime = 300 matchmes = "USER lights their NAME with their FLAME." lightermes = "USER manages to light their NAME with FLAME." @@ -315,11 +325,11 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/cigar name = "premium cigar" desc = "A brown roll of tobacco and... well, you're not quite sure. This thing's huge!" - icon_state = "cigar2off" - icon_on = "cigar2on" + icon_state = "cigar2" type_butt = /obj/item/weapon/cigbutt/cigarbutt throw_speed = 0.5 - item_state = "cigaroff" + item_state = "cigar" + max_smoketime = 1500 smoketime = 1500 chem_volume = 20 matchmes = "USER lights their NAME with their FLAME." @@ -331,14 +341,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba name = "\improper Cohiba Robusto cigar" desc = "There's little more you could want from a cigar." - icon_state = "cigar2off" - icon_on = "cigar2on" + icon_state = "cigar2" /obj/item/clothing/mask/smokable/cigarette/cigar/havana name = "premium Havanian cigar" desc = "A cigar fit for only the best of the best." - icon_state = "cigar2off" - icon_on = "cigar2on" + icon_state = "cigar2" + max_smoketime = 7200 smoketime = 7200 chem_volume = 30 @@ -375,9 +384,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/pipe name = "smoking pipe" desc = "A pipe, for smoking. Made of fine, stained cherry wood." - icon_state = "pipeoff" - item_state = "pipeoff" - icon_on = "pipeon" //Note - these are in masks.dmi + icon_state = "pipe" + item_state = "pipe" smoketime = 0 chem_volume = 50 matchmes = "USER lights their NAME with their FLAME." @@ -429,6 +437,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if (smoketime) user << "[src] is already packed." return + max_smoketime = 1000 smoketime = 1000 if(G.reagents) G.reagents.trans_to_obj(src, G.reagents.total_volume) @@ -455,9 +464,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/pipe/cobpipe name = "corn cob pipe" desc = "A nicotine delivery system popularized by folksy backwoodsmen, kept popular in the modern age and beyond by space hipsters." - icon_state = "cobpipeoff" - item_state = "cobpipeoff" - icon_on = "cobpipeon" //Note - these are in masks.dmi + icon_state = "cobpipe" + item_state = "cobpipe" chem_volume = 35 ///////// diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm index d6cb806586..83a651a201 100644 --- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm +++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm @@ -8,7 +8,6 @@ name = "circuit board" icon = 'icons/obj/module.dmi' icon_state = "id_mod" - item_state = "electronic" origin_tech = list(TECH_DATA = 2) density = 0 anchored = 0 @@ -47,7 +46,7 @@ var/comp_amt = req_components[comp_path] if(!comp_amt) continue - + if(ispath(comp_path, /obj/item/stack)) M.component_parts += new comp_path(contain_parts ? M : null, comp_amt) else diff --git a/code/game/objects/items/weapons/circuitboards/machinery/engineering.dm b/code/game/objects/items/weapons/circuitboards/machinery/engineering.dm new file mode 100644 index 0000000000..91aefbf6a5 --- /dev/null +++ b/code/game/objects/items/weapons/circuitboards/machinery/engineering.dm @@ -0,0 +1,13 @@ +#ifndef T_BOARD +#error T_BOARD macro is not defined but we need it! +#endif + +/obj/item/weapon/circuitboard/pipelayer + name = T_BOARD("pipe layer") + build_path = /obj/machinery/pipelayer + board_type = new /datum/frame/frame_types/machine + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + req_components = list( + /obj/item/weapon/stock_parts/motor = 1, + /obj/item/weapon/stock_parts/gear = 1, + /obj/item/weapon/stock_parts/matter_bin = 1) diff --git a/code/game/objects/items/weapons/circuitboards/mecha.dm b/code/game/objects/items/weapons/circuitboards/mecha.dm index ac4d83d98c..1415edea84 100644 --- a/code/game/objects/items/weapons/circuitboards/mecha.dm +++ b/code/game/objects/items/weapons/circuitboards/mecha.dm @@ -7,7 +7,6 @@ name = "exosuit circuit board" icon = 'icons/obj/module.dmi' icon_state = "std_mod" - item_state = "electronic" board_type = "other" /obj/item/weapon/circuitboard/mecha/ripley diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index c3ddb4fb39..6554e80f8b 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -452,23 +452,27 @@ the implant may become unstable and either pre-maturely inject the subject or si var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) ) //give the syndies a bit of stealth - a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Security") - a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Medical") + a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "General") +// a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Security") +// a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Medical") else - a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Security") - a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Medical") + a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "General") +// a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Security") +// a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Medical") qdel(a) processing_objects.Remove(src) if ("emp") var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) var/name = prob(50) ? t.name : pick(teleportlocs) - a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Security") - a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Medical") + a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "General") +// a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Security") +// a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Medical") qdel(a) else var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) - a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Security") - a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Medical") + a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "General") +// a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Security") +// a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Medical") qdel(a) processing_objects.Remove(src) diff --git a/code/game/objects/items/weapons/improvised_components.dm b/code/game/objects/items/weapons/improvised_components.dm index 5d89707e62..9e6e05a807 100644 --- a/code/game/objects/items/weapons/improvised_components.dm +++ b/code/game/objects/items/weapons/improvised_components.dm @@ -67,41 +67,4 @@ qdel(I) qdel(src) user.put_in_hands(finished) - update_icon(user) - -/obj/item/woodcirclet - name = "wood circlet" - desc = "A small wood circlet for making a flower crown." - icon = 'icons/obj/buildingobject.dmi' - icon_state = "woodcirclet" - w_class = ITEMSIZE_SMALL - -/obj/item/woodcirclet/attackby(obj/item/W as obj, mob/user as mob) - var/obj/item/complete - if(istype(W,/obj/item/seeds/poppyseed)) - user << "You attach the poppy to the circlet and create a beautiful flower crown." - complete = new /obj/item/clothing/head/poppy_crown(get_turf(user)) - user.drop_from_inventory(W) - user.drop_from_inventory(src) - qdel(W) - qdel(src) - user.put_in_hands(complete) - return - else if(istype(W,/obj/item/seeds/sunflowerseed)) - user << "You attach the sunflower to the circlet and create a beautiful flower crown." - complete = new /obj/item/clothing/head/sunflower_crown(get_turf(user)) - user.drop_from_inventory(W) - user.drop_from_inventory(src) - qdel(W) - qdel(src) - user.put_in_hands(complete) - return - else if(istype(W,/obj/item/seeds/lavenderseed)) - user << "You attach the lavender to the circlet and create a beautiful flower crown." - complete = new /obj/item/clothing/head/lavender_crown(get_turf(user)) - user.drop_from_inventory(W) - user.drop_from_inventory(src) - qdel(W) - qdel(src) - user.put_in_hands(complete) - return \ No newline at end of file + update_icon(user) \ No newline at end of file diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index a70a253579..8ebf5697c9 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -35,6 +35,13 @@ icon_state = "switchblade" unbreakable = 1 +/obj/item/weapon/material/butterfly/boxcutter + name = "box cutter" + desc = "A thin, inexpensive razor-blade knife designed to open cardboard boxes." + icon_state = "boxcutter" + force_divisor = 0.1 // 6 when wielded with hardness 60 (steel) + thrown_force_divisor = 0.2 // 4 when thrown with weight 20 (steel) + /obj/item/weapon/material/butterfly/attack_self(mob/user) active = !active if(active) diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index 78ee869604..92cb782e8a 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -90,7 +90,7 @@ if(affecting.take_damage(force, 0)) H.UpdateDamageIcon() H.updatehealth() - if(affecting.can_feel_pain()) + if(affecting.organ_can_feel_pain()) H.Weaken(3) return check -= picked diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 1c77e1f6cb..61a9a99f96 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -126,6 +126,7 @@ new /obj/item/weapon/storage/pill_bottle/dylovene(src) new /obj/item/weapon/storage/pill_bottle/tramadol(src) new /obj/item/weapon/storage/pill_bottle/spaceacillin(src) + new /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting(src) new /obj/item/stack/medical/splint(src) return @@ -150,6 +151,19 @@ new /obj/item/stack/medical/advanced/bruise_pack(src) return +/obj/item/weapon/storage/firstaid/clotting + name = "clotting kit" + desc = "Contains chemicals to stop bleeding." + max_storage_space = ITEMSIZE_COST_SMALL * 7 + +/obj/item/weapon/storage/firstaid/clotting/New() + ..() + if (empty) + return + for(var/i = 1 to 8) + new /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting(src) + return + /* * Pill Bottles */ diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index a5b03264d6..2f4b2f3a8c 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -28,6 +28,38 @@ update_icon() return +/obj/item/weapon/melee/baton/MouseDrop(obj/over_object as obj) + if(!canremove) + return + + if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist + + if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why? + return + + if (!( istype(over_object, /obj/screen) )) + return ..() + + //makes sure that the thing is equipped, so that we can't drag it into our hand from miles away. + //there's got to be a better way of doing this. + if (!(src.loc == usr) || (src.loc && src.loc.loc == usr)) + return + + if (( usr.restrained() ) || ( usr.stat )) + return + + if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src)) + return + + switch(over_object.name) + if("r_hand") + usr.u_equip(src) + usr.put_in_r_hand(src) + if("l_hand") + usr.u_equip(src) + usr.put_in_l_hand(src) + src.add_fingerprint(usr) + /obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed. ..() bcell = new/obj/item/weapon/cell/device/weapon(src) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index c39053b5aa..1080e1b8fb 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -172,7 +172,8 @@ /obj/item/weapon/weldingtool/examine(mob/user) if(..(user, 0)) - user << text("\icon[] [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel ) + if(max_fuel) + user << text("\icon[] [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel ) /obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/living/user as mob) @@ -234,18 +235,22 @@ /obj/item/weapon/weldingtool/afterattack(obj/O as obj, mob/user as mob, proximity) if(!proximity) return - if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && !src.welding) - O.reagents.trans_to_obj(src, max_fuel) - user << "Welder refueled" - playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) - return - else if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && src.welding) - message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.") - log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.") - user << "You begin welding on the fueltank and with a moment of lucidity you realize, this might not have been the smartest thing you've ever done." - var/obj/structure/reagent_dispensers/fueltank/tank = O - tank.explode() - return + if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && !welding) + if(!welding && max_fuel) + O.reagents.trans_to_obj(src, max_fuel) + user << "Welder refueled" + playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) + return + else if(!welding) + user << "[src] doesn't use fuel." + return + else + message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.") + log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.") + user << "You begin welding on the fueltank and with a moment of lucidity you realize, this might not have been the smartest thing you've ever done." + var/obj/structure/reagent_dispensers/fueltank/tank = O + tank.explode() + return if (src.welding) remove_fuel(1) var/turf/location = get_turf(user) @@ -286,12 +291,44 @@ /obj/item/weapon/weldingtool/update_icon() ..() - icon_state = welding ? "welder1" : "welder" + icon_state = welding ? "[icon_state]1" : "[initial(icon_state)]" var/mob/M = loc if(istype(M)) M.update_inv_l_hand() M.update_inv_r_hand() +/obj/item/weapon/weldingtool/MouseDrop(obj/over_object as obj) + if(!canremove) + return + + if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist + + if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why? + return + + if (!( istype(over_object, /obj/screen) )) + return ..() + + //makes sure that the thing is equipped, so that we can't drag it into our hand from miles away. + //there's got to be a better way of doing this. + if (!(src.loc == usr) || (src.loc && src.loc.loc == usr)) + return + + if (( usr.restrained() ) || ( usr.stat )) + return + + if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src)) + return + + switch(over_object.name) + if("r_hand") + usr.u_equip(src) + usr.put_in_r_hand(src) + if("l_hand") + usr.u_equip(src) + usr.put_in_l_hand(src) + src.add_fingerprint(usr) + //Sets the welding state of the welding tool. If you see W.welding = 1 anywhere, please change it to W.setWelding(1) //so that the welding tool updates accordingly /obj/item/weapon/weldingtool/proc/setWelding(var/set_welding, var/mob/M) @@ -313,7 +350,8 @@ processing_objects |= src else if(M) - M << "You need more welding fuel to complete this task." + var/msg = max_fuel ? "welding fuel" : "charge" + M << "You need more [msg] to complete this task." return //Otherwise else if(!set_welding && welding) @@ -370,7 +408,6 @@ user.disabilities &= ~NEARSIGHTED return - /obj/item/weapon/weldingtool/largetank name = "industrial welding tool" max_fuel = 40 @@ -405,6 +442,113 @@ if(get_fuel() < max_fuel && nextrefueltick < world.time) nextrefueltick = world.time + 10 reagents.add_reagent("fuel", 1) + +/* + * Electric/Arc Welder + */ + +/obj/item/weapon/weldingtool/electric //AND HIS WELDING WAS ELECTRIC + name = "electric welding tool" + icon_state = "arcwelder" + max_fuel = 0 //We'll handle the consumption later. + var/obj/item/weapon/cell/power_supply //What type of power cell this uses + var/charge_cost = 24 //The rough equivalent of 1 unit of fuel, based on us wanting 10 welds per battery + var/cell_type = /obj/item/weapon/cell/device + var/use_external_power = 0 //If in a borg or hardsuit, this needs to = 1 + +/obj/item/weapon/weldingtool/electric/New() + ..() + if(cell_type == null) + update_icon() + else if(cell_type) + power_supply = new cell_type(src) + else + power_supply = new /obj/item/weapon/cell/device(src) + update_icon() + +/obj/item/weapon/weldingtool/electric/unloaded/New() + cell_type = null + +/obj/item/weapon/weldingtool/electric/examine(mob/user) + ..() + if(power_supply) + user << text("\icon[] [] has [] charge left.", src, src.name, get_fuel()) + else + user << text("\icon[] [] has power for no power cell!", src, src.name) + +/obj/item/weapon/weldingtool/electric/get_fuel() + if(use_external_power) + var/obj/item/weapon/cell/external = get_external_power_supply() + return external.charge + else if(power_supply) + return power_supply.charge + else + return 0 + +/obj/item/weapon/weldingtool/electric/remove_fuel(var/amount = 1, var/mob/M = null) + if(!welding) + return 0 + if(get_fuel() >= amount) + power_supply.checked_use(charge_cost) + if(use_external_power) + var/obj/item/weapon/cell/external = get_external_power_supply() + if(!external || !external.use(charge_cost)) //Take power from the borg... + power_supply.give(charge_cost) //Give it back to the cell. + if(M) + eyecheck(M) + return 1 + else + if(M) + M << "You need more energy to complete this task." + return 0 + +/obj/item/weapon/weldingtool/electric/attack_hand(mob/user as mob) + if(user.get_inactive_hand() == src) + if(power_supply) + power_supply.update_icon() + user.put_in_hands(power_supply) + power_supply = null + user << "You remove the cell from the [src]." + setWelding(0) + update_icon() + return + ..() + else + return ..() + +/obj/item/weapon/weldingtool/electric/attackby(obj/item/weapon/W, mob/user as mob) + if(istype(W, /obj/item/weapon/cell)) + if(istype(W, /obj/item/weapon/cell/device)) + if(!power_supply) + user.drop_item() + W.loc = src + power_supply = W + user << "You install a cell in \the [src]." + update_icon() + else + user << "\The [src] already has a cell." + else + user << "\The [src] cannot use that type of cell." + else + ..() + +/obj/item/weapon/weldingtool/electric/proc/get_external_power_supply() + if(isrobot(src.loc)) + var/mob/living/silicon/robot/R = src.loc + return R.cell + if(istype(src.loc, /obj/item/rig_module)) + var/obj/item/rig_module/module = src.loc + if(module.holder && module.holder.wearer) + var/mob/living/carbon/human/H = module.holder.wearer + if(istype(H) && H.back) + var/obj/item/weapon/rig/suit = H.back + if(istype(suit)) + return suit.cell + return null + +/obj/item/weapon/weldingtool/electric/mounted + use_external_power = 1 + /* * Crowbar */ diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index e5a655d7f9..cd11af3400 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -77,11 +77,15 @@ //armour var/blocked = L.run_armor_check(target_zone, "melee") + var/soaked = L.get_armor_soak(target_zone, "melee") if(blocked >= 100) return - if(!L.apply_damage(30, BRUTE, target_zone, blocked, used_weapon=src)) + if(soaked >= 30) + return + + if(!L.apply_damage(30, BRUTE, target_zone, blocked, soaked, used_weapon=src)) return 0 //trap the victim in place diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index f4e7f4d056..928246b2b5 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -174,7 +174,7 @@ return 0 if (user.stat || user.paralysis || user.sleeping || user.lying || user.weakened) return 0 - if (issilicon(user)) + if (isAI(user)) user << "You need hands for this." return 0 return 1 diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index a4a1f8d97a..c93f68a82a 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -45,7 +45,7 @@ /obj/structure/closet/chefcloset/New() ..() - new /obj/item/clothing/under/dress/sundress(src) + new /obj/item/clothing/under/sundress(src) new /obj/item/clothing/under/waiter(src) new /obj/item/clothing/under/waiter(src) new /obj/item/device/radio/headset/headset_service(src) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index ae4fe4d740..0e6064785d 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -150,20 +150,22 @@ var/def_zone = ran_zone() var/blocked = occupant.run_armor_check(def_zone, "melee") + var/soaked = occupant.get_armor_soak(def_zone, "melee") occupant.throw_at(A, 3, propelled) occupant.apply_effect(6, STUN, blocked) occupant.apply_effect(6, WEAKEN, blocked) occupant.apply_effect(6, STUTTER, blocked) - occupant.apply_damage(10, BRUTE, def_zone, blocked) + occupant.apply_damage(10, BRUTE, def_zone, blocked, soaked) playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) if(istype(A, /mob/living)) var/mob/living/victim = A def_zone = ran_zone() blocked = victim.run_armor_check(def_zone, "melee") + soaked = victim.get_armor_soak(def_zone, "melee") victim.apply_effect(6, STUN, blocked) victim.apply_effect(6, WEAKEN, blocked) victim.apply_effect(6, STUTTER, blocked) - victim.apply_damage(10, BRUTE, def_zone, blocked) + victim.apply_damage(10, BRUTE, def_zone, blocked, soaked) occupant.visible_message("[occupant] crashed into \the [A]!") /obj/structure/bed/chair/office/light diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 2bcbf8aa87..9ae19769eb 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -149,20 +149,22 @@ var/def_zone = ran_zone() var/blocked = occupant.run_armor_check(def_zone, "melee") + var/soaked = occupant.get_armor_soak(def_zone, "melee") occupant.throw_at(A, 3, propelled) occupant.apply_effect(6, STUN, blocked) occupant.apply_effect(6, WEAKEN, blocked) occupant.apply_effect(6, STUTTER, blocked) - occupant.apply_damage(10, BRUTE, def_zone) + occupant.apply_damage(10, BRUTE, def_zone, soaked) playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) if(istype(A, /mob/living)) var/mob/living/victim = A def_zone = ran_zone() blocked = victim.run_armor_check(def_zone, "melee") + soaked = victim.get_armor_soak(def_zone, "melee") victim.apply_effect(6, STUN, blocked) victim.apply_effect(6, WEAKEN, blocked) victim.apply_effect(6, STUTTER, blocked) - victim.apply_damage(10, BRUTE, def_zone) + victim.apply_damage(10, BRUTE, def_zone, soaked) if(pulling) occupant.visible_message("[pulling] has thrusted \the [name] into \the [A], throwing \the [occupant] out of it!") diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 08da1a66dd..25ad0ce9cd 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -178,3 +178,5 @@ this.blood_DNA["UNKNOWN BLOOD"] = "X*" else if( istype(M, /mob/living/silicon/robot )) new /obj/effect/decal/cleanable/blood/oil(src) + else if(ishuman(M)) + add_blood(M) \ No newline at end of file diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 874b6f3998..ec84ee4232 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -26,7 +26,7 @@ if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))" return - suiciding = 1 + suiciding = 15 does_not_breathe = 0 //Prevents ling-suicide zombies, or something var/obj/item/held_item = get_active_hand() if(held_item) @@ -73,10 +73,16 @@ return log_and_message_admins("[key_name(src)] commited suicide") - viewers(src) << pick("[src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \ + + var/suicidemsg + suicidemsg = pick("[src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \ "[src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \ "[src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \ "[src] is holding \his breath! It looks like \he's trying to commit suicide.") + if(isSynthetic()) + suicidemsg = "[src] is attempting to switch \his power off! It looks like \he's trying to commit suicide." + visible_message(suicidemsg) + adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() @@ -172,7 +178,7 @@ var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") if(confirm == "Yes") - suiciding = 1 + suiciding = 30 setOxyLoss(100) adjustBruteLoss(100 - getBruteLoss()) setToxLoss(100) diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 536a107374..acf6f2d95f 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -218,7 +218,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O ++ind if(ind > 1) . += ", " - . += "\tSynthetic [organ_name]" + switch(organ_name) + if ("brain") + . += "\tPositronic [organ_name]" + else + . += "\tSynthetic [organ_name]" else if(status == "digital") ++ind if(ind > 1) @@ -612,15 +616,23 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O organ = O_LUNGS if("Brain") if(pref.organ_data[BP_HEAD] != "cyborg") - user << "You may only select an assisted or synthetic brain if you have a full prosthetic body." + user << "You may only select a cybernetic or synthetic brain if you have a full prosthetic body." return organ = "brain" - var/list/organ_choices = list("Normal","Assisted","Mechanical") + var/list/organ_choices = list("Normal") if(pref.organ_data[BP_TORSO] == "cyborg") organ_choices -= "Normal" if(organ_name == "Brain") - organ_choices += "Digital" + organ_choices += "Cybernetic" + organ_choices += "Positronic" + organ_choices += "Drone" + else + organ_choices += "Assisted" + organ_choices += "Mechanical" + else + organ_choices += "Assisted" + organ_choices += "Mechanical" var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in organ_choices if(!new_state) return @@ -630,10 +642,15 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.organ_data[organ] = null if("Assisted") pref.organ_data[organ] = "assisted" - if("Mechanical") + if("Cybernetic") + pref.organ_data[organ] = "assisted" + if ("Mechanical") pref.organ_data[organ] = "mechanical" - if("Digital") + if("Drone") pref.organ_data[organ] = "digital" + if("Positronic") + pref.organ_data[organ] = "mechanical" + return TOPIC_REFRESH else if(href_list["disabilities"]) diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index de8e06419e..2c602bcc6d 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -356,6 +356,22 @@ ..() gear_tweaks = list(gear_tweak_free_color_choice) -/datum/gear/suit/miscellaneous/redandblackjacket - display_name = "red and black jacket" - path = /obj/item/clothing/suit/storage/toggle/redandblackjacket \ No newline at end of file +/datum/gear/suit/miscellaneous/sec_dep_jacket + display_name = "department jacket, security" + path = /obj/item/clothing/suit/storage/toggle/sec_dep_jacket + +/datum/gear/suit/miscellaneous/engi_dep_jacket + display_name = "department jacket, engineering" + path = /obj/item/clothing/suit/storage/toggle/engi_dep_jacket + +/datum/gear/suit/miscellaneous/supply_dep_jacket + display_name = "department jacket, supply" + path = /obj/item/clothing/suit/storage/toggle/supply_dep_jacket + +/datum/gear/suit/miscellaneous/sci_dep_jacket + display_name = "department jacket, science" + path = /obj/item/clothing/suit/storage/toggle/sci_dep_jacket + +/datum/gear/suit/miscellaneous/med_dep_jacket + display_name = "department jacket, medical" + path = /obj/item/clothing/suit/storage/toggle/med_dep_jacket \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index 0b64950f05..ccc5214b55 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -273,11 +273,11 @@ /datum/gear/uniform/sundress display_name = "sundress" - path = /obj/item/clothing/under/dress/sundress + path = /obj/item/clothing/under/sundress /datum/gear/uniform/sundress/white display_name = "sundress, white" - path = /obj/item/clothing/under/dress/sundress/white + path = /obj/item/clothing/under/sundress_white /datum/gear/uniform/dress_fire display_name = "flame dress" @@ -446,10 +446,10 @@ display_name = "jumpsuit, hephaestus" path = /obj/item/clothing/under/hephaestus -/datum/gear/uniform/yoga +/datum/gear/uniform/yogapants display_name = "yoga pants" - path = /obj/item/clothing/under/pants/yoga + path = /obj/item/clothing/under/pants/yogapants -/datum/gear/uniform/yoga/New() +/datum/gear/uniform/yogapants/New() ..() gear_tweaks = list(gear_tweak_free_color_choice) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index ebc2e87ec1..253f843306 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -46,6 +46,22 @@ display_name = "flashlight" path = /obj/item/device/flashlight +/datum/gear/utility/flashlight_blue + display_name = "flashlight, blue" + path = /obj/item/device/flashlight/color + +/datum/gear/utility/flashlight_orange + display_name = "flashlight, orange" + path = /obj/item/device/flashlight/color/orange + +/datum/gear/utility/flashlight_red + display_name = "flashlight, red" + path = /obj/item/device/flashlight/color/red + +/datum/gear/utility/flashlight_yellow + display_name = "flashlight, yellow" + path = /obj/item/device/flashlight/color/yellow + /datum/gear/utility/maglight display_name = "flashlight, maglight" path = /obj/item/device/flashlight/maglight diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno.dm b/code/modules/client/preference_setup/loadout/loadout_xeno.dm index 8e5428c199..fee486a659 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno.dm @@ -39,32 +39,24 @@ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(bandtypes)) /datum/gear/ears/skrell/cloth/male - display_name = "male headtail cloth selection (Skrell)" - path = /obj/item/clothing/ears/skrell/cloth_male + display_name = "male headtail cloth (Skrell)" + path = /obj/item/clothing/ears/skrell/cloth_male/black sort_category = "Xenowear" whitelisted = "Skrell" /datum/gear/ears/skrell/cloth/male/New() ..() - var/list/clothtypes = list() - for(var/cloth_style in typesof(/obj/item/clothing/ears/skrell/cloth_male)) - var/obj/item/clothing/ears/skrell/cloth_male/cloth = cloth_style - clothtypes[initial(cloth.name)] = cloth - gear_tweaks += new/datum/gear_tweak/path(sortAssoc(clothtypes)) + gear_tweaks = list(gear_tweak_free_color_choice) /datum/gear/ears/skrell/cloth/female - display_name = "female headtail cloth selection (Skrell)" - path = /obj/item/clothing/ears/skrell/cloth_female + display_name = "female headtail cloth (Skrell)" + path = /obj/item/clothing/ears/skrell/cloth_female/black sort_category = "Xenowear" whitelisted = "Skrell" /datum/gear/ears/skrell/cloth/female/New() ..() - var/list/clothtypes = list() - for(var/cloth_style in typesof(/obj/item/clothing/ears/skrell/cloth_female)) - var/obj/item/clothing/ears/skrell/cloth_female/cloth = cloth_style - clothtypes[initial(cloth.name)] = cloth - gear_tweaks += new/datum/gear_tweak/path(sortAssoc(clothtypes)) + gear_tweaks = list(gear_tweak_free_color_choice) /datum/gear/ears/skrell/colored/band display_name = "Colored bands (Skrell)" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 188b98cdbb..f7a1f85446 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -525,10 +525,6 @@ var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled sprite_sheets = list( - "Human" = 'icons/mob/uniforms/uniform.dmi', - "Skrell" = 'icons/mob/species/skrell/uniforms/uniform.dmi', - "Tajaran" = 'icons/mob/species/tajaran/uniforms/uniform.dmi', - "Unathi" = 'icons/mob/species/unathi/uniforms/uniform.dmi', "Teshari" = 'icons/mob/species/seromi/uniform.dmi', "Vox" = 'icons/mob/species/vox/uniform.dmi' ) @@ -539,6 +535,9 @@ valid_accessory_slots = list("utility","armband","decor","over") restricted_accessory_slots = list("utility", "armband") + var/icon/rolled_down_icon = 'icons/mob/uniform_rolled_down.dmi' + var/icon/rolled_down_sleeves_icon = 'icons/mob/uniform_sleeves_rolled.dmi' + /obj/item/clothing/under/attack_hand(var/mob/user) if(accessories && accessories.len) @@ -558,7 +557,7 @@ //autodetect rollability if(rolled_down < 0) - if((worn_state + "_d_s") in icon_states('icons/mob/uniform.dmi')) + if(("[worn_state]_d_s" in icon_states(INV_W_UNIFORM_DEF_ICON)) || ("[worn_state]_s" in icon_states(rolled_down_icon)) || ("[worn_state]_d_s" in icon_states(icon_override))) rolled_down = 0 /obj/item/clothing/under/proc/update_rolldown_status() @@ -573,11 +572,13 @@ under_icon = sprite_sheets[H.species.get_bodytype(H)] else if(item_icons && item_icons[slot_w_uniform_str]) under_icon = item_icons[slot_w_uniform_str] + else if ("[worn_state]_s" in icon_states(rolled_down_icon)) + under_icon = rolled_down_icon else under_icon = INV_W_UNIFORM_DEF_ICON // The _s is because the icon update procs append it. - if(("[worn_state]_d_s") in icon_states(under_icon)) + if((under_icon == rolled_down_icon && "[worn_state]_s" in icon_states(under_icon)) || ("[worn_state]_d_s" in icon_states(under_icon))) if(rolled_down != 1) rolled_down = 0 else @@ -596,11 +597,13 @@ under_icon = sprite_sheets[H.species.get_bodytype(H)] else if(item_icons && item_icons[slot_w_uniform_str]) under_icon = item_icons[slot_w_uniform_str] + else if ("[worn_state]_s" in icon_states(rolled_down_sleeves_icon)) + under_icon = rolled_down_sleeves_icon else under_icon = INV_W_UNIFORM_DEF_ICON // The _s is because the icon update procs append it. - if(("[worn_state]_r_s") in icon_states(under_icon)) + if((under_icon == rolled_down_sleeves_icon && "[worn_state]_s" in icon_states(under_icon)) || ("[worn_state]_r_s" in icon_states(under_icon))) if(rolled_sleeves != 1) rolled_sleeves = 0 else @@ -682,10 +685,17 @@ if(rolled_down) body_parts_covered = initial(body_parts_covered) body_parts_covered &= ~(UPPER_TORSO|ARMS) - item_state_slots[slot_w_uniform_str] = "[worn_state]_d" + if("[worn_state]_s" in icon_states(rolled_down_icon)) + icon_override = rolled_down_icon + item_state_slots[slot_w_uniform_str] = "[worn_state]" + else + item_state_slots[slot_w_uniform_str] = "[worn_state]_d" + usr << "You roll down your [src]." else body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_icon) + icon_override = initial(icon_override) item_state_slots[slot_w_uniform_str] = "[worn_state]" usr << "You roll up your [src]." update_clothing_icon() @@ -708,10 +718,16 @@ rolled_sleeves = !rolled_sleeves if(rolled_sleeves) body_parts_covered &= ~(ARMS) - item_state_slots[slot_w_uniform_str] = "[worn_state]_r" + if("[worn_state]_s" in icon_states(rolled_down_sleeves_icon)) + icon_override = rolled_down_sleeves_icon + item_state_slots[slot_w_uniform_str] = "[worn_state]" + else + item_state_slots[slot_w_uniform_str] = "[worn_state]_r" usr << "You roll up your [src]'s sleeves." else body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_sleeves_icon) + icon_override = initial(icon_override) item_state_slots[slot_w_uniform_str] = "[worn_state]" usr << "You roll down your [src]'s sleeves." update_clothing_icon() diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 53678c13e4..137cab1a01 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -197,7 +197,7 @@ BLIND // can't see anything name = "welding goggles" desc = "Protects the eyes from welders, approved by the mad scientist association." icon_state = "welding-g" - item_state_slots = list(slot_r_hand_str = "g", slot_l_hand_str = "g") + item_state_slots = list(slot_r_hand_str = "welding-g", slot_l_hand_str = "welding-g") action_button_name = "Flip Welding Goggles" matter = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 1000) var/up = 0 diff --git a/code/modules/clothing/head/flowercrowns.dm b/code/modules/clothing/head/flowercrowns.dm new file mode 100644 index 0000000000..6c6469de73 --- /dev/null +++ b/code/modules/clothing/head/flowercrowns.dm @@ -0,0 +1,56 @@ +/obj/item/clothing/head/woodcirclet + name = "wood circlet" + desc = "A small wood circlet for making a flower crown." + icon_state = "woodcirclet" + w_class = ITEMSIZE_SMALL + body_parts_covered = 0 + +/obj/item/clothing/head/woodcirclet/attackby(obj/item/W as obj, mob/user as mob) + var/obj/item/complete + if(istype(W,/obj/item/seeds/poppyseed)) + user << "You attach the poppy to the circlet and create a beautiful flower crown." + complete = new /obj/item/clothing/head/poppy_crown(get_turf(user)) + user.drop_from_inventory(W) + user.drop_from_inventory(src) + qdel(W) + qdel(src) + user.put_in_hands(complete) + return + else if(istype(W,/obj/item/seeds/sunflowerseed)) + user << "You attach the sunflower to the circlet and create a beautiful flower crown." + complete = new /obj/item/clothing/head/sunflower_crown(get_turf(user)) + user.drop_from_inventory(W) + user.drop_from_inventory(src) + qdel(W) + qdel(src) + user.put_in_hands(complete) + return + else if(istype(W,/obj/item/seeds/lavenderseed)) + user << "You attach the lavender to the circlet and create a beautiful flower crown." + complete = new /obj/item/clothing/head/lavender_crown(get_turf(user)) + user.drop_from_inventory(W) + user.drop_from_inventory(src) + qdel(W) + qdel(src) + user.put_in_hands(complete) + return + +//Flower crowns + +/obj/item/clothing/head/sunflower_crown + name = "sunflower crown" + desc = "A flower crown weaved with sunflowers." + icon_state = "sunflower_crown" + body_parts_covered = 0 + +/obj/item/clothing/head/lavender_crown + name = "lavender crown" + desc = "A flower crown weaved with lavender." + icon_state = "lavender_crown" + body_parts_covered = 0 + +/obj/item/clothing/head/poppy_crown + name = "poppy crown" + desc = "A flower crown weaved with poppies." + icon_state = "poppy_crown" + body_parts_covered = 0 \ No newline at end of file diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index b044ba949a..89dde52fbc 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -346,25 +346,4 @@ name = "sombrero" desc = "A wide-brimmed hat popularly worn in Mexico." icon_state = "sombrero" - body_parts_covered = 0 - - -//Flower crowns - -/obj/item/clothing/head/sunflower_crown - name = "sunflower crown" - desc = "A flower crown weaved with sunflowers." - icon_state = "sunflower_crown" - body_parts_covered = 0 - -/obj/item/clothing/head/lavender_crown - name = "lavender crown" - desc = "A flower crown weaved with lavender." - icon_state = "lavender_crown" - body_parts_covered = 0 - -/obj/item/clothing/head/poppy_crown - name = "poppy crown" - desc = "A flower crown weaved with poppies." - icon_state = "poppy_crown" body_parts_covered = 0 \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index bcd8163853..820543f082 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -157,6 +157,7 @@ list("antibiotics", "spaceacillin", 0, 20), list("antitoxins", "anti_toxin", 0, 20), list("nutrients", "glucose", 0, 80), + list("clotting agent", "myelamine", 0, 80), list("hyronalin", "hyronalin", 0, 20), list("radium", "radium", 0, 20) ) @@ -246,6 +247,7 @@ list("hyperzine", "hyperzine", 0, 30), list("oxycodone", "oxycodone", 0, 30), list("nutrients", "glucose", 0, 80), + list("clotting agent", "myelamine", 0, 80) ) interface_name = "combat chem dispenser" @@ -263,6 +265,20 @@ interface_name = "mounted chem injector" interface_desc = "Dispenses loaded chemicals via an arm-mounted injector." +/obj/item/rig_module/chem_dispenser/injector/advanced + + charges = list( + list("tricordrazine", "tricordrazine", 0, 80), + list("tramadol", "tramadol", 0, 80), + list("dexalin plus", "dexalinp", 0, 80), + list("antibiotics", "spaceacillin", 0, 80), + list("antitoxins", "anti_toxin", 0, 80), + list("nutrients", "glucose", 0, 80), + list("hyronalin", "hyronalin", 0, 80), + list("radium", "radium", 0, 80), + list("clotting agent", "myelamine", 0, 80) + ) + /obj/item/rig_module/voice name = "hardsuit voice synthesiser" diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 0bd14ef9d1..855aa49c7e 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -161,6 +161,7 @@ piece.permeability_coefficient = permeability_coefficient piece.unacidable = unacidable if(islist(armor)) piece.armor = armor.Copy() + if(islist(armorsoak)) piece.armorsoak = armorsoak.Copy() update_icon(1) diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm index 8b13a57c8d..5d0dd4cb8f 100644 --- a/code/modules/clothing/spacesuits/rig/suits/ert.dm +++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm @@ -49,7 +49,7 @@ /obj/item/rig_module/ai_container, /obj/item/rig_module/maneuvering_jets, /obj/item/rig_module/device/healthscanner, - /obj/item/rig_module/chem_dispenser/injector + /obj/item/rig_module/chem_dispenser/injector/advanced ) /obj/item/weapon/rig/ert/security diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index dd732d0f7c..00ea330892 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -574,12 +574,6 @@ obj/item/clothing/suit/kimono icon_state = "smw_hoodie" item_state_slots = list(slot_r_hand_str = "suit_black", slot_l_hand_str = "suit_black") -/obj/item/clothing/suit/storage/toggle/redandblackjacket - name = "red and black jacket" - desc = "A cool red and black jacket to keep you stylish and cozy." - icon_state = "redandblackjacket" - flags_inv = HIDEHOLSTER - /obj/item/clothing/suit/whitedress name = "white dress" desc = "A fancy white dress." @@ -776,6 +770,44 @@ obj/item/clothing/suit/kimono name = "brown varsity jacket" icon_state = "varsity_brown" +/* + * Department Jackets + */ +/obj/item/clothing/suit/storage/toggle/sec_dep_jacket + name = "department jacket, security" + desc = "A cozy jacket in security's colors. Show your department pride!" + icon_state = "sec_dep_jacket" + item_state_slots = list(slot_r_hand_str = "sec_dep_jacket", slot_l_hand_str = "sec_dep_jacket") + flags_inv = HIDEHOLSTER + +/obj/item/clothing/suit/storage/toggle/engi_dep_jacket + name = "department jacket, engineering" + desc = "A cozy jacket in engineering's colors. Show your department pride!" + icon_state = "engi_dep_jacket" + item_state_slots = list(slot_r_hand_str = "engi_dep_jacket", slot_l_hand_str = "engi_dep_jacket") + flags_inv = HIDEHOLSTER + +/obj/item/clothing/suit/storage/toggle/supply_dep_jacket + name = "department jacket, supply" + desc = "A cozy jacket in supply's colors. Show your department pride!" + icon_state = "supply_dep_jacket" + item_state_slots = list(slot_r_hand_str = "supply_dep_jacket", slot_l_hand_str = "supply_dep_jacket") + flags_inv = HIDEHOLSTER + +/obj/item/clothing/suit/storage/toggle/sci_dep_jacket + name = "department jacket, science" + desc = "A cozy jacket in science's colors. Show your department pride!" + icon_state = "sci_dep_jacket" + item_state_slots = list(slot_r_hand_str = "sci_dep_jacket", slot_l_hand_str = "sci_dep_jacket") + flags_inv = HIDEHOLSTER + +/obj/item/clothing/suit/storage/toggle/med_dep_jacket + name = "department jacket, medical" + desc = "A cozy jacket in medical's colors. Show your department pride!" + icon_state = "med_dep_jacket" + item_state_slots = list(slot_r_hand_str = "med_dep_jacket", slot_l_hand_str = "med_dep_jacket") + flags_inv = HIDEHOLSTER + /* * Track Jackets */ diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 4a4835f2bc..7452b35aab 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -1,11 +1,3 @@ -/obj/item/clothing/under/color - sprite_sheets = list( - "Human" = 'icons/mob/uniforms/color.dmi', - "Skrell" = 'icons/mob/species/skrell/uniforms/color.dmi', - "Tajara" = 'icons/mob/species/tajaran/uniforms/color.dmi', - "Unathi" = 'icons/mob/species/unathi/uniforms/color.dmi', - "Diona" = 'icons/mob/species/diona/uniforms/color.dmi' - ) /obj/item/clothing/under/color/black name = "black jumpsuit" icon_state = "black" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 9718427907..cd7c47fb3d 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -255,13 +255,6 @@ */ /obj/item/clothing/under/dress body_parts_covered = UPPER_TORSO|LOWER_TORSO - sprite_sheets = list( - "Human" = 'icons/mob/uniforms/dresses.dmi', - "Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi', - "Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi', - "Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi', - "Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi' - ) /obj/item/clothing/under/dress/blacktango name = "black tango dress" @@ -353,14 +346,6 @@ */ /obj/item/clothing/under/wedding body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS - sprite_sheets = list( - "Human" = 'icons/mob/uniforms/dresses.dmi', - "Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi', - "Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi', - "Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi', - "Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi' - ) - /obj/item/clothing/under/wedding/bride_orange name = "orange wedding dress" @@ -393,13 +378,13 @@ flags_inv = HIDESHOES body_parts_covered = UPPER_TORSO|LOWER_TORSO -/obj/item/clothing/under/dress/sundress +/obj/item/clothing/under/sundress name = "sundress" desc = "Makes you want to frolic in a field of daisies." icon_state = "sundress" body_parts_covered = UPPER_TORSO|LOWER_TORSO -/obj/item/clothing/under/dress/sundress/white +/obj/item/clothing/under/sundress_white name = "white sundress" desc = "A white sundress decorated with purple lilies." icon_state = "sundress_white" @@ -474,13 +459,6 @@ /obj/item/clothing/under/cheongsam name = "white cheongsam" desc = "It is a white cheongsam dress." - sprite_sheets = list( - "Human" = 'icons/mob/uniforms/dresses.dmi', - "Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi', - "Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi', - "Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi', - "Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi' - ) icon_state = "mai_yang" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS @@ -508,13 +486,6 @@ /obj/item/clothing/under/croptop name = "crop top" desc = "A shirt that has had the top cropped. This one is NT sponsored." - sprite_sheets = list( - "Human" = 'icons/mob/uniforms/dresses.dmi', - "Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi', - "Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi', - "Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi', - "Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi' - ) icon_state = "croptop" item_state_slots = list(slot_r_hand_str = "grey", slot_l_hand_str = "grey") diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm index a36e126b14..322115cc0b 100644 --- a/code/modules/clothing/under/pants.dm +++ b/code/modules/clothing/under/pants.dm @@ -2,13 +2,6 @@ /obj/item/clothing/under/pants name = "jeans" desc = "A nondescript pair of tough blue jeans." - sprite_sheets = list( - "Human" = 'icons/mob/uniforms/pants.dmi', - "Skrell" = 'icons/mob/species/skrell/uniforms/pants.dmi', - "Tajara" = 'icons/mob/species/tajaran/uniforms/pants.dmi', - "Unathi" = 'icons/mob/species/unathi/uniforms/pants.dmi', - "Diona" = 'icons/mob/species/diona/uniforms/pants.dmi' - ) icon_state = "jeans" gender = PLURAL body_parts_covered = LOWER_TORSO|LEGS @@ -124,10 +117,10 @@ desc = "A pair of sexy, tight black leather chaps." icon_state = "chapsbl" -/obj/item/clothing/under/pants/yoga +/obj/item/clothing/under/pants/yogapants name = "yoga pants" desc = "A pair of tight-fitting yoga pants for those lazy days." - icon_state = "yoga" + icon_state = "yogapants" /* * Baggy Pants diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index 7df4f018d2..4ac2ad5f2e 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -2,13 +2,6 @@ /obj/item/clothing/under/shorts name = "athletic shorts" desc = "95% Polyester, 5% Spandex!" - sprite_sheets = list( - "Human" = 'icons/mob/uniforms/pants.dmi', - "Skrell" = 'icons/mob/species/skrell/uniforms/pants.dmi', - "Tajara" = 'icons/mob/species/tajaran/uniforms/pants.dmi', - "Unathi" = 'icons/mob/species/unathi/uniforms/pants.dmi', - "Diona" = 'icons/mob/species/diona/uniforms/pants.dmi' - ) gender = PLURAL body_parts_covered = LOWER_TORSO @@ -103,13 +96,6 @@ /obj/item/clothing/under/skirt name = "short black skirt" desc = "A skirt that is a shiny black." - sprite_sheets = list( - "Human" = 'icons/mob/uniforms/dresses.dmi', - "Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi', - "Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi', - "Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi', - "Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi' - ) icon_state = "skirt_short_black" body_parts_covered = LOWER_TORSO rolled_sleeves = -1 @@ -168,8 +154,6 @@ icon_state = "plaid_purple" item_state_slots = list(slot_r_hand_str = "purple", slot_l_hand_str = "purple") -//Job skirts - /obj/item/clothing/under/rank/cargo/skirt name = "quartermaster's jumpskirt" desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper." diff --git a/code/modules/clothing/under/solgov.dm b/code/modules/clothing/under/solgov.dm index c40dc14675..114f386b76 100644 --- a/code/modules/clothing/under/solgov.dm +++ b/code/modules/clothing/under/solgov.dm @@ -4,12 +4,6 @@ /obj/item/clothing/under/pt name = "pt uniform" desc = "Shorts! Shirt! Miami! Sexy!" - sprite_sheets = list( - "Human" = 'icons/mob/uniforms/military.dmi', - "Skrell" = 'icons/mob/species/skrell/uniforms/military.dmi', - "Tajara" = 'icons/mob/species/tajaran/uniforms/military.dmi', - "Unathi" = 'icons/mob/species/unathi/uniforms/military.dmi' - ) icon_state = "miami" worn_state = "miami" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) @@ -40,13 +34,6 @@ /obj/item/clothing/under/utility name = "utility uniform" desc = "A comfortable turtleneck and black utility trousers." - sprite_sheets = list( - "Human" = 'icons/mob/uniforms/military.dmi', - "Skrell" = 'icons/mob/species/skrell/uniforms/military.dmi', - "Tajara" = 'icons/mob/species/tajaran/uniforms/military.dmi', - "Unathi" = 'icons/mob/species/unathi/uniforms/military.dmi', - "Diona" = 'icons/mob/species/diona/uniforms/military.dmi' - ) icon_state = "blackutility" worn_state = "blackutility" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) @@ -107,6 +94,7 @@ icon_state = "blackutility_com" worn_state = "blackutility_com" + /obj/item/clothing/under/utility/fleet name = "fleet coveralls" desc = "The utility uniform of the SCG Fleet, made from an insulated material." @@ -145,6 +133,7 @@ icon_state = "navyutility_com" worn_state = "navyutility_com" + /obj/item/clothing/under/utility/marine name = "marine fatigues" desc = "The utility uniform of the SCG Marine Corps, made from durable material." @@ -199,13 +188,6 @@ /obj/item/clothing/under/service name = "service uniform" desc = "A service uniform of some kind." - sprite_sheets = list( - "Human" = 'icons/mob/uniforms/military.dmi', - "Skrell" = 'icons/mob/species/skrell/uniforms/military.dmi', - "Tajara" = 'icons/mob/species/tajaran/uniforms/military.dmi', - "Unathi" = 'icons/mob/species/unathi/uniforms/military.dmi', - "Diona" = 'icons/mob/species/diona/uniforms/military.dmi' - ) icon_state = "whiteservice" worn_state = "whiteservice" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) @@ -233,13 +215,6 @@ /obj/item/clothing/under/mildress name = "dress uniform" desc = "A dress uniform of some kind." - sprite_sheets = list( - "Human" = 'icons/mob/uniforms/military.dmi', - "Skrell" = 'icons/mob/species/skrell/uniforms/military.dmi', - "Tajara" = 'icons/mob/species/tajaran/uniforms/military.dmi', - "Unathi" = 'icons/mob/species/unathi/uniforms/military.dmi', - "Diona" = 'icons/mob/species/diona/uniforms/military.dmi' - ) icon_state = "greydress" worn_state = "greydress" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 3d63261a95..756aab62e4 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -105,7 +105,7 @@ I said no! /datum/recipe/xenoburger items = list( /obj/item/weapon/reagent_containers/food/snacks/bun, - /obj/item/weapon/reagent_containers/food/snacks/xenomeat + /obj/item/weapon/reagent_containers/food/snacks/spidermeat // /obj/item/weapon/reagent_containers/food/snacks/xenomeat ) result = /obj/item/weapon/reagent_containers/food/snacks/xenoburger @@ -224,9 +224,9 @@ I said no! /obj/item/weapon/reagent_containers/food/snacks/dough, /obj/item/weapon/reagent_containers/food/snacks/dough, /obj/item/weapon/reagent_containers/food/snacks/dough, - /obj/item/weapon/reagent_containers/food/snacks/xenomeat, - /obj/item/weapon/reagent_containers/food/snacks/xenomeat, - /obj/item/weapon/reagent_containers/food/snacks/xenomeat, + /obj/item/weapon/reagent_containers/food/snacks/spidermeat, //xenomeat, + /obj/item/weapon/reagent_containers/food/snacks/spidermeat, //xenomeat, + /obj/item/weapon/reagent_containers/food/snacks/spidermeat, //xenomeat, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index f6388e0190..1d92705dec 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -114,8 +114,11 @@ if(!target_limb) target_limb = pick(BP_ALL) var/blocked = target.run_armor_check(target_limb, "melee") + var/soaked = target.get_armor_soak(target_limb, "melee") + if(blocked >= 100) return + var/obj/item/organ/external/affecting = target.get_organ(target_limb) var/damage = 0 var/has_edge = 0 @@ -125,7 +128,7 @@ if(affecting) to_chat(target, "\The [fruit]'s thorns pierce your [affecting.name] greedily!") - target.apply_damage(damage, BRUTE, target_limb, blocked, "Thorns", sharp=1, edge=has_edge) + target.apply_damage(damage, BRUTE, target_limb, blocked, soaked, "Thorns", sharp=1, edge=has_edge) else to_chat(target, "\The [fruit]'s thorns pierce your flesh greedily!") target.adjustBruteLoss(damage) diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm index 21a56f014d..8220162be7 100644 --- a/code/modules/integrated_electronics/core/tools.dm +++ b/code/modules/integrated_electronics/core/tools.dm @@ -11,6 +11,7 @@ used for power or data transmission." icon = 'icons/obj/electronic_assemblies.dmi' icon_state = "wirer-wire" + item_state = "wirer" flags = CONDUCT w_class = 2 var/datum/integrated_io/selected_io = null diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index e7c7d0ecd9..79e0ce03ae 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -120,7 +120,7 @@ /material/wood/generate_recipes() ..() recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1) - recipes += new/datum/stack_recipe("wood circlet", /obj/item/woodcirclet, 1) + recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1) recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1) recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20) recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index c422a35530..fdb0b012ef 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -101,9 +101,9 @@ /mob/living/silicon/ai/special_mentions() return list("AI") // AI door! -// Converts specific characters, like *, /, and _ to formatted output. +// Converts specific characters, like *, |, and _ to formatted output. /mob/proc/say_emphasis(var/message) - message = encode_html_emphasis(message, "/", "i") + message = encode_html_emphasis(message, "|", "i") message = encode_html_emphasis(message, "+", "b") message = encode_html_emphasis(message, "_", "u") return message diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index cb889b570f..3f41f21ce5 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -71,15 +71,11 @@ /mob/living/carbon/brain/handle_chemicals_in_body() chem_effects.Cut() - analgesic = 0 if(touching) touching.metabolize() if(ingested) ingested.metabolize() if(bloodstr) bloodstr.metabolize() - if(CE_PAINKILLER in chem_effects) - analgesic = chem_effects[CE_PAINKILLER] - confused = max(0, confused - 1) // decrement dizziness counter, clamped to 0 if(resting) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index db59f6bc83..66ba7ecd51 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -4,7 +4,7 @@ return null ..() -/mob/living/carbon/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone) +/mob/living/carbon/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone) if(!effective_force || blocked >= 100) return 0 @@ -12,6 +12,10 @@ if(HULK in user.mutations) effective_force *= 2 + //If the armor soaks all of the damage, it just skips the rest of the checks + if(effective_force <= soaked) + return 0 + //Apply weapon damage var/weapon_sharp = is_sharp(I) var/weapon_edge = has_edge(I) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index d6deb9b964..532b2daa7c 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -7,8 +7,7 @@ var/last_eating = 0 //Not sure what this does... I found it hidden in food.dm var/life_tick = 0 // The amount of life ticks that have processed on this mob. - var/analgesic = 0 // when this is set, the mob isn't affected by shock or pain - // life should decrease this by 1 every tick + // total amount of wounds on mob, used to spread out healing and the like over all wounds var/number_wounds = 0 var/obj/item/handcuffed = null //Whether or not the mob is handcuffed diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index fba467a6a8..98f0e8450c 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -282,7 +282,7 @@ msg += "[T.He] [T.is] twitching ever so slightly.\n" //splints - for(var/organ in list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM)) + for(var/organ in BP_ALL) var/obj/item/organ/external/o = get_organ(organ) if(o && o.splinted && o.splinted.loc == o) msg += "[T.He] [T.has] \a [o.splinted] on [T.his] [o.name]!\n" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b06a95597e..881663e1dd 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1071,7 +1071,7 @@ "A spike of pain jolts your [organ.name] as you bump [O] inside.", \ "Your movement jostles [O] in your [organ.name] painfully.", \ "Your movement jostles [O] in your [organ.name] painfully.") - src << msg + custom_pain(msg, 40) organ.take_damage(rand(1,3), 0, 0) if(!(organ.robotic >= ORGAN_ROBOT) && (should_have_organ(O_HEART))) //There is no blood in protheses. @@ -1473,6 +1473,7 @@ if(stat) return var/datum/category_group/underwear/UWC = input(usr, "Choose underwear:", "Show/hide underwear") as null|anything in global_underwear.categories + if(!UWC) return var/datum/category_item/underwear/UWI = all_underwear[UWC.name] if(!UWI || UWI.name == "None") src << "You do not have [UWC.gender==PLURAL ? "[UWC.display_name]" : "\a [UWC.display_name]"]." @@ -1510,7 +1511,7 @@ if(check_organ) if(!istype(check_organ)) return 0 - return check_organ.can_feel_pain() + return check_organ.organ_can_feel_pain() return !(species.flags & NO_PAIN) /mob/living/carbon/human/is_muzzled() diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index c92d0dd938..e193909359 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -30,7 +30,7 @@ // Should this all be in Touch()? if(istype(H)) - if(get_accuracy_penalty(H)) //Should only trigger if they're not aiming well + if(get_accuracy_penalty(H) && H != src) //Should only trigger if they're not aiming well var/hit_zone = get_zone_with_miss_chance(H.zone_sel.selecting, src, get_accuracy_penalty(H)) if(!hit_zone) H.do_attack_animation(src) @@ -51,6 +51,7 @@ return 0 var/obj/item/organ/external/affecting = get_organ(ran_zone(H.zone_sel.selecting)) var/armor_block = run_armor_check(affecting, "melee") + var/armor_soak = get_armor_soak(affecting, "melee") if(HULK in H.mutations) damage += 5 @@ -59,7 +60,10 @@ visible_message("\red [H] has punched [src]!") - apply_damage(damage, HALLOSS, affecting, armor_block) + if(armor_soak >= damage) + return + + apply_damage(damage, HALLOSS, affecting, armor_block, armor_soak) if(damage >= 9) visible_message("\red [H] has weakened [src]!") apply_effect(4, WEAKEN, armor_block) @@ -258,11 +262,12 @@ real_damage = max(1, real_damage) var/armour = run_armor_check(affecting, "melee") + var/soaked = get_armor_soak(affecting, "melee") // Apply additional unarmed effects. attack.apply_effects(H, src, armour, rand_damage, hit_zone) // Finally, apply damage to target - apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), affecting, armour, sharp=attack.sharp, edge=attack.edge) + apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), affecting, armour, soaked, sharp=attack.sharp, edge=attack.edge) if(I_DISARM) M.attack_log += text("\[[time_stamp()]\] Disarmed [src.name] ([src.ckey])") @@ -338,7 +343,8 @@ var/dam_zone = pick(organs_by_name) var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone)) var/armor_block = run_armor_check(affecting, "melee") - apply_damage(damage, BRUTE, affecting, armor_block) + var/armor_soak = get_armor_soak(affecting, "melee") + apply_damage(damage, BRUTE, affecting, armor_block, armor_soak) updatehealth() return 1 diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 50b2732eeb..fa3d19ebab 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -376,7 +376,7 @@ This function restores all organs. if((damagetype != BRUTE) && (damagetype != BURN)) if(damagetype == HALLOSS) if((damage > 25 && prob(20)) || (damage > 50 && prob(60))) - if(organ && organ.can_feel_pain()) + if(organ && organ.organ_can_feel_pain()) emote("scream") ..(damage, damagetype, def_zone, blocked) return 1 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index a6471c4aeb..86bbdebc15 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -67,7 +67,7 @@ emp_act emote("me", 1, "drops what they were holding, their [affected.name] malfunctioning!") else var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ") - emote("me", 1, "[affected.can_feel_pain() ? "" : emote_scream]drops what they were holding in their [affected.name]!") + emote("me", 1, "[affected.organ_can_feel_pain() ? "" : emote_scream] drops what they were holding in their [affected.name]!") ..(stun_amount, agony_amount, def_zone) @@ -93,6 +93,29 @@ emp_act total += weight return (armorval/max(total, 1)) +//Like getarmor, but the value it returns will be numerical damage reduction +/mob/living/carbon/human/getsoak(var/def_zone, var/type) + var/soakval = 0 + var/total = 0 + + if(def_zone) + if(isorgan(def_zone)) + return getsoak_organ(def_zone, type) + var/obj/item/organ/external/affecting = get_organ(def_zone) + if(affecting) + return getsoak_organ(affecting, type) + //If a specific bodypart is targetted, check how that bodypart is protected and return the value. + + //If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values + for(var/organ_name in organs_by_name) + if (organ_name in organ_rel_size) + var/obj/item/organ/external/organ = organs_by_name[organ_name] + if(organ) + var/weight = organ_rel_size[organ_name] + soakval += getsoak_organ(organ, type) * weight + total += weight + return (soakval/max(total, 1)) + //this proc returns the Siemens coefficient of electrical resistivity for a particular external organ. /mob/living/carbon/human/proc/get_siemens_coefficient_organ(var/obj/item/organ/external/def_zone) if (!def_zone) @@ -119,6 +142,17 @@ emp_act protection += C.armor[type] return protection +/mob/living/carbon/human/proc/getsoak_organ(var/obj/item/organ/external/def_zone, var/type) + if(!type || !def_zone) return 0 + var/soaked = 0 + var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) + for(var/gear in protective_gear) + if(gear && istype(gear ,/obj/item/clothing)) + var/obj/item/clothing/C = gear + if(istype(C) && C.body_parts_covered & def_zone.body_part) + soaked += C.armorsoak[type] + return soaked + /mob/living/carbon/human/proc/check_head_coverage() var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform) @@ -195,25 +229,35 @@ emp_act visible_message("[src] has been [I.attack_verb.len? pick(I.attack_verb) : "attacked"] in the [affecting.name] with [I.name] by [user]!") + var/soaked = get_armor_soak(hit_zone, "melee", I.armor_penetration) + + if(soaked >= effective_force) + src << "Your armor absorbs the force of [I.name]!" + return + var/blocked = run_armor_check(hit_zone, "melee", I.armor_penetration, "Your armor has protected your [affecting.name].", "Your armor has softened the blow to your [affecting.name].") - standard_weapon_hit_effects(I, user, effective_force, blocked, hit_zone) + + standard_weapon_hit_effects(I, user, effective_force, blocked, soaked, hit_zone) return blocked -/mob/living/carbon/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone) +/mob/living/carbon/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone) var/obj/item/organ/external/affecting = get_organ(hit_zone) if(!affecting) return 0 + if(soaked >= effective_force) + return 0 + // Handle striking to cripple. if(user.a_intent == I_DISARM) effective_force *= 0.5 //reduced effective force... - if(!..(I, user, effective_force, blocked, hit_zone)) + if(!..(I, user, effective_force, blocked, soaked, hit_zone)) return 0 //set the dislocate mult less than the effective force mult so that //dislocating limbs on disarm is a bit easier than breaking limbs on harm - attack_joint(affecting, I, effective_force, 0.75, blocked) //...but can dislocate joints + attack_joint(affecting, I, effective_force, 0.75, blocked, soaked) //...but can dislocate joints else if(!..()) return 0 @@ -243,7 +287,7 @@ emp_act switch(hit_zone) if("head")//Harder to score a stun but if you do it lasts a bit longer if(prob(effective_force)) - apply_effect(20, PARALYZE, blocked) + apply_effect(20, PARALYZE, blocked, soaked) visible_message("\The [src] has been knocked unconscious!") if(bloody)//Apply blood if(wear_mask) @@ -257,15 +301,15 @@ emp_act update_inv_glasses(0) if("chest")//Easier to score a stun but lasts less time if(prob(effective_force + 10)) - apply_effect(6, WEAKEN, blocked) + apply_effect(6, WEAKEN, blocked, soaked) visible_message("\The [src] has been knocked down!") if(bloody) bloody_body(src) return 1 -/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked) - if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100) +/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked, var/soaked) + if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100 || soaked > effective_force) return 0 if(W.damtype != BRUTE) @@ -338,10 +382,6 @@ emp_act var/hit_area = affecting.name src.visible_message("\red [src] has been hit in the [hit_area] by [O].") - var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here - - if(armor < 100) - apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O) if(ismob(O.thrower)) var/mob/M = O.thrower @@ -352,12 +392,25 @@ emp_act if(!istype(src,/mob/living/simple_animal/mouse)) msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (JMP)") + //If the armor absorbs all of the damage, skip the rest of the calculations + var/soaked = get_armor_soak(affecting, "melee", O.armor_penetration) + if(soaked >= throw_damage) + src << "Your armor absorbs the force of [O.name]!" + return + + var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here + if(armor < 100) + apply_damage(throw_damage, dtype, zone, armor, soaked, is_sharp(O), has_edge(O), O) + + //thrown weapon embedded object code. if(dtype == BRUTE && istype(O,/obj/item)) var/obj/item/I = O if (!is_robot_module(I)) var/sharp = is_sharp(I) var/damage = throw_damage + if (soaked) + damage -= soaked if (armor) damage /= armor+1 diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index a4a08305cd..4fa6ae1117 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -56,7 +56,7 @@ if (!lying && !buckled && world.time - l_move_time < 15) //Moving around with fractured ribs won't do you any good - if (prob(10) && !stat && can_feel_pain() && analgesic < 50 && E.is_broken() && E.internal_organs.len) + if (prob(10) && !stat && can_feel_pain() && chem_effects[CE_PAINKILLER] < 50 && E.is_broken() && E.internal_organs.len) custom_pain("Pain jolts through your broken [E.encased ? E.encased : E.name], staggering you!", 50) drop_item(loc) Stun(2) @@ -100,7 +100,7 @@ else if (E.is_dislocated()) stance_damage += 0.5 - if(E) limb_pain = E.can_feel_pain() + if(E) limb_pain = E.organ_can_feel_pain() // Canes and crutches help you stand (if the latter is ever added) // One cane mitigates a broken leg+foot, or a missing foot. @@ -159,7 +159,7 @@ drop_from_inventory(r_hand) var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ") - emote("me", 1, "[(E.can_feel_pain()) ? "" : emote_scream ]drops what they were holding in their [E.name]!") + emote("me", 1, "[(can_feel_pain()) ? "" : emote_scream ]drops what they were holding in their [E.name]!") else if(E.is_malfunctioning()) switch(E.body_part) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index e7a0a27bc2..ecd1ef7567 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -187,7 +187,7 @@ var/rn = rand(0, 200) if(getBrainLoss() >= 5) if(0 <= rn && rn <= 3) - custom_pain("Your head feels numb and painful.") + custom_pain("Your head feels numb and painful.", 10) if(getBrainLoss() >= 15) if(4 <= rn && rn <= 6) if(eye_blurry <= 0) src << "It becomes hard to see for some reason." @@ -329,17 +329,20 @@ if(status_flags & GODMODE) return + if(suiciding) + failed_last_breath = 1 + adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster + oxygen_alert = max(oxygen_alert, 1) + suiciding -- + return 0 + if(does_not_breathe) failed_last_breath = 0 adjustOxyLoss(-5) return - if(!breath || (breath.total_moles == 0) || suiciding) + if(!breath || (breath.total_moles == 0)) failed_last_breath = 1 - if(suiciding) - adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster - oxygen_alert = max(oxygen_alert, 1) - return 0 if(health > config.health_threshold_crit) adjustOxyLoss(HUMAN_MAX_OXYLOSS) else @@ -350,10 +353,6 @@ if(!L.is_bruised() && prob(8)) rupture_lung() - if(should_have_organ("brain")) - if(prob(5)) - adjustBrainLoss(0.02 * oxyloss) //2% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage - oxygen_alert = max(oxygen_alert, 1) return 0 @@ -372,8 +371,9 @@ safe_pressure_min *= 1.25 else if(breath) if(breath.total_moles < BREATH_MOLES / 10 || breath.total_moles > BREATH_MOLES * 5) - if (prob(8)) - rupture_lung() + if(is_below_sound_pressure(get_turf(src))) //No more popped lungs from choking/drowning + if (prob(8)) + rupture_lung() var/safe_exhaled_max = 10 var/safe_toxins_max = 0.2 @@ -794,7 +794,6 @@ if(reagents) chem_effects.Cut() - analgesic = 0 if(!isSynthetic()) @@ -802,9 +801,6 @@ if(ingested) ingested.metabolize() if(bloodstr) bloodstr.metabolize() - if(CE_PAINKILLER in chem_effects) - analgesic = chem_effects[CE_PAINKILLER] - var/total_phoronloss = 0 for(var/obj/item/I in src) if(I.contaminated) @@ -923,6 +919,14 @@ for(var/atom/a in hallucinations) qdel(a) + //Brain damage from Oxyloss + if(should_have_organ("brain")) + var/brainOxPercent = 0.02 //Default2% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage + if(CE_STABLE in chem_effects) + brainOxPercent = 0.01 //Halved in effect + if(oxyloss >= 20 && prob(5)) + adjustBrainLoss(brainOxPercent * oxyloss) + if(halloss >= species.total_health) src << "You're in too much pain to keep going..." src.visible_message("[src] slumps to the ground, too weak to continue fighting.") @@ -1155,7 +1159,7 @@ see_invisible = SEE_INVISIBLE_LIVING if(healths) - if (analgesic > 100) + if (chem_effects[CE_PAINKILLER] > 100) healths.icon_state = "health_numb" else // Generate a by-limb health display. @@ -1443,8 +1447,11 @@ shock_stage = max(shock_stage-1, 0) return + if(stat) + return 0 + if(shock_stage == 10) - src << "[pick("It hurts so much", "You really need some painkillers", "Dear god, the pain")]!" + custom_pain("[pick("It hurts so much", "You really need some painkillers", "Dear god, the pain")]!", 40) if(shock_stage >= 30) if(shock_stage == 30) emote("me",1,"is having trouble keeping their eyes open.") diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 6ea0ed6889..ff16d332fe 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -72,6 +72,7 @@ var/toxins_mod = 1 // Toxloss modifier var/radiation_mod = 1 // Radiation modifier var/flash_mod = 1 // Stun from blindness modifier. + var/chemOD_mod = 1 // Damage modifier for overdose var/vision_flags = SEE_SELF // Same flags as glasses. // Death vars. 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 ac9cb9d9c7..7a0181b167 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -174,6 +174,7 @@ darksight = 4 flash_mod = 1.2 + chemOD_mod = 0.9 ambiguous_genders = TRUE diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index af3e65b091..2de060887f 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -97,7 +97,7 @@ var/global/list/sparring_attack_cache = list() if(eyes) eyes.take_damage(rand(3,4), 1) user.visible_message("[user] presses \his [eye_attack_text] into [target]'s [eyes.name]!") - var/eye_pain = eyes.can_feel_pain() + var/eye_pain = eyes.organ_can_feel_pain() target << "You experience[(eye_pain) ? "" : " immense pain as you feel" ] [eye_attack_text_victim] being pressed into your [eyes.name][(eye_pain)? "." : "!"]" return user.visible_message("[user] attempts to press \his [eye_attack_text] into [target]'s eyes, but they don't have any!") diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index 69ddb59038..7bbc4110dd 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -67,15 +67,11 @@ /mob/living/carbon/slime/handle_chemicals_in_body() chem_effects.Cut() - analgesic = 0 if(touching) touching.metabolize() if(ingested) ingested.metabolize() if(bloodstr) bloodstr.metabolize() - if(CE_PAINKILLER in chem_effects) - analgesic = chem_effects[CE_PAINKILLER] - src.updatehealth() return //TODO: DEFERRED diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm index 2e1cc29595..933596ef5e 100644 --- a/code/modules/mob/living/carbon/metroid/powers.dm +++ b/code/modules/mob/living/carbon/metroid/powers.dm @@ -60,7 +60,7 @@ var/painMes = pick("You can feel your body becoming weak!", "You feel like you're about to die!", "You feel every part of your body screaming in agony!", "A low, rolling pain passes through your body!", "Your body feels as if it's falling apart!", "You feel extremely weak!", "A sharp, deep pain bathes every inch of your body!") if (ishuman(M)) var/mob/living/carbon/human/H = M - H.custom_pain(painMes) + H.custom_pain(painMes, 100) else if (istype(M, /mob/living/carbon)) var/mob/living/carbon/C = M if (C.can_feel_pain()) diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm index a742bc8959..894a0a98b0 100644 --- a/code/modules/mob/living/carbon/shock.dm +++ b/code/modules/mob/living/carbon/shock.dm @@ -14,7 +14,7 @@ 1.2 * src.getShockBruteLoss() + \ 1.7 * src.getCloneLoss() + \ 2 * src.halloss + \ - -1 * src.analgesic + -1 * src.chem_effects[CE_PAINKILLER] if(src.slurring) src.traumatic_shock -= 20 diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index f09eb3741f..552319e6fe 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -8,11 +8,13 @@ Returns standard 0 if fail */ -/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0) +/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/soaked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0) if(Debug2) world.log << "## DEBUG: apply_damage() was called on [src], with [damage] damage, and an armor value of [blocked]." - if(!damage || (blocked >= 100)) + if(!damage || (blocked >= 100) || soaked >= damage) return 0 + if(soaked) + damage -= soaked blocked = (100-blocked)/100 switch(damagetype) if(BRUTE) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 3293cfb615..56b680ab76 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -733,11 +733,20 @@ default behaviour is: src << "You feel like you are about to throw up!" sleep(100) //and you have 10 more for mad dash to the bucket + //Damaged livers cause you to vomit blood. + if(!blood_vomit) + if(ishuman(src)) + var/mob/living/carbon/human/H = src + if(!H.isSynthetic()) + var/obj/item/organ/internal/liver/L = H.internal_organs_by_name["liver"] + if(L.is_broken()) + blood_vomit = 1 + Stun(5) src.visible_message("[src] throws up!","You throw up!") playsound(loc, 'sound/effects/splat.ogg', 50, 1) - var/turf/simulated/T = get_turf(src) + var/turf/simulated/T = get_turf(src) //TODO: Make add_blood_floor remove blood from human mobs if(istype(T)) if(blood_vomit) T.add_blood_floor(src) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 17eff101bb..c52311820e 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -77,10 +77,20 @@ return 0 */ +//Certain pieces of armor actually absorb flat amounts of damage from income attacks +/mob/living/proc/get_armor_soak(var/def_zone = null, var/attack_flag = "melee", var/armour_pen = 0) + var/soaked = getsoak(def_zone, attack_flag) + //5 points of armor pen negate one point of soak + if(armour_pen) + soaked = max(soaked - (armour_pen/5), 0) + return soaked + //if null is passed for def_zone, then this should return something appropriate for all zones (e.g. area effect damage) /mob/living/proc/getarmor(var/def_zone, var/type) return 0 +/mob/living/proc/getsoak(var/def_zone, var/type) + return 0 /mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone) @@ -93,6 +103,7 @@ signaler.signal() //Armor + var/soaked = get_armor_soak(def_zone, P.check_armour, P.armor_penetration) var/absorb = run_armor_check(def_zone, P.check_armour, P.armor_penetration) var/proj_sharp = is_sharp(P) var/proj_edge = has_edge(P) @@ -105,13 +116,13 @@ stun_effect_act(0, P.agony, def_zone, P) src <<"\red You have been hit by [P]!" if(!P.nodamage) - apply_damage(P.damage, P.damage_type, def_zone, absorb, 0, P, sharp=proj_sharp, edge=proj_edge) + apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, P, sharp=proj_sharp, edge=proj_edge) qdel(P) return if(!P.nodamage) - apply_damage(P.damage, P.damage_type, def_zone, absorb, 0, P, sharp=proj_sharp, edge=proj_edge) - P.on_hit(src, absorb, def_zone) + apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, P, sharp=proj_sharp, edge=proj_edge) + P.on_hit(src, absorb, soaked, def_zone) if(absorb == 100) return 2 @@ -153,17 +164,21 @@ /mob/living/proc/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) visible_message("[src] has been [I.attack_verb.len? pick(I.attack_verb) : "attacked"] with [I.name] by [user]!") + var/soaked = get_armor_soak(hit_zone, "melee") var/blocked = run_armor_check(hit_zone, "melee") - standard_weapon_hit_effects(I, user, effective_force, blocked, hit_zone) - if(I.damtype == BRUTE && prob(33)) // Added blood for whacking non-humans too - var/turf/simulated/location = get_turf(src) - if(istype(location)) location.add_blood_floor(src) + //If the armor absorbs all of the damage, skip the damage calculation and the blood + if(!soaked > effective_force) + standard_weapon_hit_effects(I, user, effective_force, blocked, soaked, hit_zone) + + if(I.damtype == BRUTE && prob(33)) // Added blood for whacking non-humans too + var/turf/simulated/location = get_turf(src) + if(istype(location)) location.add_blood_floor(src) return blocked //returns 0 if the effects failed to apply for some reason, 1 otherwise. -/mob/living/proc/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone) +/mob/living/proc/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone) if(!effective_force || blocked >= 100) return 0 @@ -171,6 +186,10 @@ if(HULK in user.mutations) effective_force *= 2 + //Armor soak + if(soaked >= effective_force) + return 0 + //Apply weapon damage var/weapon_sharp = is_sharp(I) var/weapon_edge = has_edge(I) @@ -178,7 +197,7 @@ weapon_sharp = 0 weapon_edge = 0 - apply_damage(effective_force, I.damtype, hit_zone, blocked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I) + apply_damage(effective_force, I.damtype, hit_zone, blocked, soaked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I) return 1 @@ -200,8 +219,10 @@ src.visible_message("\red [src] has been hit by [O].") var/armor = run_armor_check(null, "melee") + var/soaked = get_armor_soak(null, "melee") - apply_damage(throw_damage, dtype, null, armor, is_sharp(O), has_edge(O), O) + + apply_damage(throw_damage, dtype, null, armor, soaked, is_sharp(O), has_edge(O), O) O.throwing = 0 //it hit, so stop moving @@ -230,6 +251,9 @@ if(!O || !src) return if(O.sharp) //Projectile is suitable for pinning. + if(soaked >= throw_damage) //Don't embed if it didn't actually damage + return + //Handles embedding for non-humans and simple_animals. embed(O) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index e912cc31ec..ec0f40be09 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -11,6 +11,7 @@ var/list/department_radio_keys = list( ":s" = "Security", ".s" = "Security", ":w" = "whisper", ".w" = "whisper", ":t" = "Mercenary", ".t" = "Mercenary", + ":x" = "Raider", ".x" = "Raider", ":u" = "Supply", ".u" = "Supply", ":v" = "Service", ".v" = "Service", ":p" = "AI Private", ".p" = "AI Private", @@ -26,6 +27,7 @@ var/list/department_radio_keys = list( ":S" = "Security", ".S" = "Security", ":W" = "whisper", ".W" = "whisper", ":T" = "Mercenary", ".T" = "Mercenary", + ":X" = "Raider", ".X" = "Raider", ":U" = "Supply", ".U" = "Supply", ":V" = "Service", ".V" = "Service", ":P" = "AI Private", ".P" = "AI Private", diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index d90fe28d53..765acb837a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -548,7 +548,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c var/choice = alert("Would you like to select a hologram based on a (visible) crew member, switch to unique avatar, or load your character from your character slot?",,"Crew Member","Unique","My Character") switch(choice) - if("Crew Member") + if("Crew Member") //A seeable crew member (or a dog) var/list/targets = trackable_mobs() if(targets.len) input = input("Select a crew member:") as null|anything in targets //The definition of "crew member" is a little loose... @@ -561,7 +561,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c else alert("No suitable records found. Aborting.") - if("My Character") + if("My Character") //Loaded character slot if(!client || !client.prefs) return var/mob/living/carbon/human/dummy/dummy = new () //This doesn't include custom_items because that's ... hard. @@ -574,25 +574,30 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c qdel(dummy) holo_icon = new_holo - else //One from the dmi. + else //A premade from the dmi var/icon_list[] = list( - "default", - "floating face", - "carp", - "ian", - "runtime", - "poly", - "pun pun", - "male human", - "female human", - "male unathi", - "female unathi", - "male tajara", - "female tajara", - "male tesharii", - "female tesharii", - "male skrell", - "female skrell" + "default", + "floating face", + "singularity", + "drone", + "carp", + "spider", + "bear", + "slime", + "ian", + "runtime", + "poly", + "pun pun", + "male human", + "female human", + "male unathi", + "female unathi", + "male tajara", + "female tajara", + "male tesharii", + "female tesharii", + "male skrell", + "female skrell" ) input = input("Please select a hologram:") as null|anything in icon_list if(input) @@ -602,8 +607,18 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1")) if("floating face") holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo2")) + if("singularity") + holo_icon = getHologramIcon(icon('icons/obj/singularity.dmi',"singularity_s1")) + if("drone") + holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"drone0")) if("carp") holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4")) + if("spider") + holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"nurse")) + if("bear") + holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"brownbear")) + if("slime") + holo_icon = getHologramIcon(icon('icons/mob/slimes.dmi',"cerulean adult slime")) if("ian") holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"corgi")) if("runtime") diff --git a/code/modules/mob/living/silicon/ai/icons.dm b/code/modules/mob/living/silicon/ai/icons.dm index ebd47cc02d..2d8bc0d002 100644 --- a/code/modules/mob/living/silicon/ai/icons.dm +++ b/code/modules/mob/living/silicon/ai/icons.dm @@ -28,11 +28,14 @@ var/list/datum/ai_icon/ai_icons name = "Red" alive_icon = "ai-red" alive_light = "#F04848" + dead_icon = "ai-red_dead" + dead_light = "#F04848" /datum/ai_icon/green name = "Green" alive_icon = "ai-wierd" alive_light = "#00FF99" + dead_icon = "ai-weird_dead" /datum/ai_icon/blue name = "Blue" @@ -44,6 +47,11 @@ var/list/datum/ai_icon/ai_icons alive_icon = "ai-angryface" alive_light = "#FFFF33" +/datum/ai_icon/angel + name = "Angel" + alive_icon = "ai-angel" + dead_icon = "ai-angel_dead" + /datum/ai_icon/bliss name = "Bliss" alive_icon = "ai-bliss" @@ -57,6 +65,7 @@ var/list/datum/ai_icon/ai_icons /datum/ai_icon/database name = "Database" alive_icon = "ai-database" + dead_icon = "ai-database_dead" /datum/ai_icon/dorf name = "Dorf" @@ -80,6 +89,8 @@ var/list/datum/ai_icon/ai_icons name = "Goon" alive_icon = "ai-goon" alive_light = "#3E5C80" + dead_icon = "ai-goon-crash" + dead_light = "#3E5C80" /datum/ai_icon/heartline name = "Heartline" @@ -91,6 +102,10 @@ var/list/datum/ai_icon/ai_icons alive_icon = "ai-helios" alive_light = "#F2CF73" +/datum/ai_icon/hourglass + name = "Hourglass" + alive_icon = "ai-hourglass" + /datum/ai_icon/inverted name = "Inverted" alive_icon = "ai-u" @@ -100,6 +115,7 @@ var/list/datum/ai_icon/ai_icons name = "Lonestar" alive_icon = "ai-lonestar" alive_light = "#58751C" + dead_icon = "ai-lonestar_dead" /datum/ai_icon/matrix name = "Matrix" @@ -110,6 +126,7 @@ var/list/datum/ai_icon/ai_icons name = "Monochrome" alive_icon = "ai-mono" alive_light = "#585858" + dead_icon = "ai-mono_dead" /datum/ai_icon/nanotrasen name = "NanoTrasen" @@ -128,13 +145,16 @@ var/list/datum/ai_icon/ai_icons /datum/ai_icon/soviet name = "Soviet" - alive_icon = "ai-redoctober" + alive_icon = "ai-soviet" alive_light = "#FF4307" + dead_icon = "ai-soviet_dead" + dead_light = "#FF4307" /datum/ai_icon/Static name = "Static" alive_icon = "ai-static" alive_light = "#4784C1" + alive_icon = "ai-static_dead" /datum/ai_icon/text name = "Text" @@ -143,6 +163,7 @@ var/list/datum/ai_icon/ai_icons /datum/ai_icon/trapped name = "Trapped" alive_icon = "ai-hades" + dead_icon = "ai-hades_dead" /datum/ai_icon/triumvirate_static name = "Triumvirate" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index b391168e7e..d3b70b7456 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -158,9 +158,19 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/standard name = "standard robot module" - sprites = list( "Basic" = "robot_old", + sprites = list( + "M-USE NanoTrasen" = "robot", + "Cabeiri" = "eyebot-standard", + "CUPCAKE" = "Noble-STD", + "Haruka" = "marinaSD", + "Usagi" = "tallflower", + "Telemachus" = "toiletbot", + "WTOperator" = "sleekstandard", + "WTOmni" = "omoikane", + "XI-GUS" = "spider", + "XI-ALP" = "heavyStandard", + "Basic" = "robot_old", "Android" = "droid", - "Default" = "robot", "Drone" = "drone-standard" ) @@ -181,8 +191,16 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/medical/surgeon name = "surgeon robot module" sprites = list( + "M-USE NanoTrasen" = "robotMedi", + "Cabeiri" = "eyebot-medical", + "CUPCAKE" = "Noble-MED", + "Haruka" = "marinaMD", + "Minako" = "arachne", + "Usagi" = "tallwhite", + "Telemachus" = "toiletbotsurgeon", + "WTOperator" = "sleekcmo", + "XI-ALP" = "heavyMed", "Basic" = "Medbot", - "Standard" = "surgeon", "Advanced Droid" = "droid-medical", "Needles" = "medicalrobot", "Drone" = "drone-surgery" @@ -230,8 +248,16 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/medical/crisis name = "crisis robot module" sprites = list( + "M-USE NanoTrasen" = "robotMedi", + "Cabeiri" = "eyebot-medical", + "CUPCAKE" = "Noble-MED", + "Haruka" = "marinaMD", + "Minako" = "arachne", + "Usagi" = "tallwhite", + "Telemachus" = "toiletbotmedical", + "WTOperator" = "sleekmedic", + "XI-ALP" = "heavyMed", "Basic" = "Medbot", - "Standard" = "surgeon", "Advanced Droid" = "droid-medical", "Needles" = "medicalrobot", "Drone - Medical" = "drone-medical", @@ -295,6 +321,15 @@ var/global/list/robot_modules = list( networks = list(NETWORK_ENGINEERING) subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor) sprites = list( + "M-USE NanoTrasen" = "robotEngi", + "Cabeiri" = "eyebot-engineering", + "CUPCAKE" = "Noble-ENG", + "Haruka" = "marinaENG", + "Usagi" = "tallyellow", + "Telemachus" = "toiletbotengineering", + "WTOperator" = "sleekce", + "XI-GUS" = "spidereng", + "XI-ALP" = "heavyEng", "Basic" = "Engineering", "Antique" = "engineerrobot", "Landmate" = "landmate", @@ -312,7 +347,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/rcd/borg(src) src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/wrench(src) - src.modules += new /obj/item/weapon/weldingtool/largetank(src) + src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src) src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) src.modules += new /obj/item/device/pipe_painter(src) src.modules += new /obj/item/device/floor_painter(src) @@ -348,7 +383,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/engineering/general/New() ..() src.modules += new /obj/item/borg/sight/meson(src) - src.modules += new /obj/item/weapon/weldingtool/largetank(src) + src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src) src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/wrench(src) src.modules += new /obj/item/weapon/wirecutters(src) @@ -408,11 +443,19 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/security/general sprites = list( + "M-USE NanoTrasen" = "robotSecy", + "Cabeiri" = "eyebot-security", + "Cerberus" = "bloodhound", + "Cerberus - Treaded" = "treadhound", + "CUPCAKE" = "Noble-SEC", + "Haruka" = "marinaSC", + "Usagi" = "tallred", + "Telemachus" = "toiletbotsecurity", + "WTOperator" = "sleeksecurity", + "XI-GUS" = "spidersec", + "XI-ALP" = "heavySec", "Basic" = "secborg", - "Red Knight" = "Security", "Black Knight" = "securityrobot", - "Bloodhound" = "bloodhound", - "Bloodhound - Treaded" = "secborg+tread", "Drone" = "drone-sec" ) @@ -448,6 +491,13 @@ var/global/list/robot_modules = list( name = "janitorial robot module" channels = list("Service" = 1) sprites = list( + "M-USE NanoTrasen" = "robotJani", + "Cabeiri" = "eyebot-janitor", + "CUPCAKE" = "Noble-CLN", + "Haruka" = "marinaJN", + "Telemachus" = "toiletbotjanitor", + "WTOperator" = "sleekjanitor", + "XI-ALP" = "heavyRes", "Basic" = "JanBot2", "Mopbot" = "janitorrobot", "Mop Gear Rex" = "mopgearrex", @@ -488,11 +538,21 @@ var/global/list/robot_modules = list( ) /obj/item/weapon/robot_module/robot/clerical/butler - sprites = list( "Waitress" = "Service", - "Kent" = "toiletbot", + sprites = list( + "M-USE NanoTrasen" = "robotServ", + "Cabeiri" = "eyebot-standard", + "CUPCAKE" = "Noble-SRV", + "Haruka" = "marinaSV", + "Usagi" = "tallgreen", + "Telemachus" = "toiletbot", + "WTOperator" = "sleekservice", + "WTOmni" = "omoikane", + "XI-GUS" = "spider", + "XI-ALP" = "heavyServ", + "Standard" = "Service2", + "Waitress" = "Service", "Bro" = "Brobot", "Rich" = "maximillion", - "Default" = "Service2", "Drone - Service" = "drone-service", "Drone - Hydro" = "drone-hydro" ) @@ -532,12 +592,21 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/clerical/general name = "clerical robot module" sprites = list( + "M-USE NanoTrasen" = "robotCler", + "Cabeiri" = "eyebot-standard", + "CUPCAKE" = "Noble-SRV", + "Haruka" = "marinaSV", + "Usagi" = "tallgreen", + "Telemachus" = "toiletbot", + "WTOperator" = "sleekclerical", + "WTOmni" = "omoikane", + "XI-GUS" = "spidercom", + "XI-ALP" = "heavyServ", "Waitress" = "Service", - "Kent" = "toiletbot", "Bro" = "Brobot", "Rich" = "maximillion", "Default" = "Service2", - "Drone" = "drone-service" + "Drone" = "drone-blu" ) /obj/item/weapon/robot_module/robot/clerical/general/New() @@ -563,6 +632,14 @@ var/global/list/robot_modules = list( channels = list("Supply" = 1) networks = list(NETWORK_MINE) sprites = list( + "NM-USE NanoTrasen" = "robotMine", + "Cabeiri" = "eyebot-miner", + "CUPCAKE" = "Noble-DIG", + "Haruka" = "marinaMN", + "Telemachus" = "toiletbotminer", + "WTOperator" = "sleekminer", + "XI-GUS" = "spidermining", + "XI-ALP" = "heavyMiner", "Basic" = "Miner_old", "Advanced Droid" = "droid-miner", "Treadhead" = "Miner", @@ -586,6 +663,10 @@ var/global/list/robot_modules = list( name = "research module" channels = list("Science" = 1) sprites = list( + "L'Ouef" = "peaceborg", + "Cabeiri" = "eyebot-science", + "Haruka" = "marinaSCI", + "WTOperator" = "sleekscience", "Droid" = "droid-science", "Drone" = "drone-science" ) @@ -599,7 +680,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/gripper/no_use/loader(src) src.modules += new /obj/item/device/robotanalyzer(src) src.modules += new /obj/item/weapon/card/robot(src) - src.modules += new /obj/item/weapon/weldingtool/largetank(src) + src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src) src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/wrench(src) src.modules += new /obj/item/weapon/wirecutters(src) @@ -641,7 +722,13 @@ var/global/list/robot_modules = list( LANGUAGE_SIGN = 0 ) sprites = list( - "Dread" = "securityrobot", + "Cerberus" = "syndie_bloodhound", + "Cerberus - Treaded" = "syndie_treadhound", + "Ares" = "squats", + "Telemachus" = "toiletbotantag", + "WTOperator" = "hosborg", + "XI-GUS" = "spidersyndi", + "XI-ALP" = "syndi-heavy" ) var/id @@ -666,7 +753,10 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/security/combat name = "combat robot module" hide_on_manifest = 1 - sprites = list("Combat Android" = "droid-combat") + sprites = list( + "Haruka" = "marinaCB", + "Combat Android" = "droid-combat" + ) /obj/item/weapon/robot_module/robot/security/combat/New() ..() @@ -686,7 +776,8 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/drone/New(var/mob/living/silicon/robot/robot) ..() - src.modules += new /obj/item/weapon/weldingtool(src) + src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src) src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/wrench(src) src.modules += new /obj/item/weapon/crowbar(src) @@ -774,4 +865,4 @@ var/global/list/robot_modules = list( var/obj/item/device/lightreplacer/LR = locate() in src.modules LR.Charge(R, amount) ..() - return + return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/animals/bear.dm b/code/modules/mob/living/simple_animal/animals/bear.dm index 9d1da5e08b..776783fadf 100644 --- a/code/modules/mob/living/simple_animal/animals/bear.dm +++ b/code/modules/mob/living/simple_animal/animals/bear.dm @@ -115,7 +115,7 @@ var/mob/living/carbon/human/H = target_mob var/dam_zone = pick(BP_TORSO, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG) var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone)) - H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1, edge=1) + H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), H.get_armor_soak(affecting, "melee"), sharp=1, edge=1) return H else if(isliving(target_mob)) var/mob/living/L = target_mob diff --git a/code/modules/mob/living/simple_animal/animals/fish.dm b/code/modules/mob/living/simple_animal/animals/fish.dm new file mode 100644 index 0000000000..b2778d3c33 --- /dev/null +++ b/code/modules/mob/living/simple_animal/animals/fish.dm @@ -0,0 +1,73 @@ +// Different types of fish! They are all subtypes of this tho +/mob/living/simple_animal/fish + name = "fish" + desc = "Its a fishy. No touchy fishy." + icon = 'icons/mob/fish.dmi' + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + + // By defautl they can be in any water turf. Subtypes might restrict to deep/shallow etc + var/global/list/suitable_turf_types = list( + /turf/simulated/floor/beach/water, + /turf/simulated/floor/beach/coastline, + /turf/simulated/floor/holofloor/beach/water, + /turf/simulated/floor/holofloor/beach/coastline, + /turf/simulated/floor/water + ) + +// Don't swim out of the water +/mob/living/simple_animal/fish/handle_wander_movement() + if(isturf(src.loc) && !resting && !buckled && canmove) //Physically capable of moving? + lifes_since_move++ //Increment turns since move (turns are life() cycles) + if(lifes_since_move >= turns_per_move) + if(!(stop_when_pulled && pulledby)) //Some animals don't move when pulled + var/moving_to = 0 // otherwise it always picks 4, fuck if I know. Did I mention fuck BYOND + moving_to = pick(cardinal) + dir = moving_to //How about we turn them the direction they are moving, yay. + var/turf/T = get_step(src,moving_to) + if(T && is_type_in_list(T, suitable_turf_types)) + Move(T) + lifes_since_move = 0 + +// Take damage if we are not in water +/mob/living/simple_animal/fish/handle_breathing() + var/turf/T = get_turf(src) + if(T && !is_type_in_list(T, suitable_turf_types)) + if(prob(50)) + say(pick("Blub", "Glub", "Burble")) + adjustBruteLoss(unsuitable_atoms_damage) + +/mob/living/simple_animal/fish/bass + name = "bass" + icon_state = "bass-swim" + icon_living = "bass-swim" + icon_dead = "bass-dead" + +/mob/living/simple_animal/fish/trout + name = "trout" + icon_state = "trout-swim" + icon_living = "trout-swim" + icon_dead = "trout-dead" + +/mob/living/simple_animal/fish/salmon + name = "salmon" + icon_state = "salmon-swim" + icon_living = "salmon-swim" + icon_dead = "salmon-dead" + +/mob/living/simple_animal/fish/perch + name = "perch" + icon_state = "perch-swim" + icon_living = "perch-swim" + icon_dead = "perch-dead" + +/mob/living/simple_animal/fish/pike + name = "pike" + icon_state = "pike-swim" + icon_living = "pike-swim" + icon_dead = "pike-dead" + +/mob/living/simple_animal/fish/koi + name = "koi" + icon_state = "koi-swim" + icon_living = "koi-swim" + icon_dead = "koi-dead" diff --git a/code/modules/mob/living/simple_animal/animals/giant_spider.dm b/code/modules/mob/living/simple_animal/animals/giant_spider.dm index ed692ab237..acb1d7a1b7 100644 --- a/code/modules/mob/living/simple_animal/animals/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/animals/giant_spider.dm @@ -36,7 +36,7 @@ speak_emote = list("chitters") emote_hear = list("chitters") - meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat + meat_type = /obj/item/weapon/reagent_containers/food/snacks/spidermeat var/busy = 0 var/poison_per_bite = 5 diff --git a/code/modules/mob/living/simple_animal/animals/parrot.dm b/code/modules/mob/living/simple_animal/animals/parrot.dm index d388939fcd..a2adba345b 100644 --- a/code/modules/mob/living/simple_animal/animals/parrot.dm +++ b/code/modules/mob/living/simple_animal/animals/parrot.dm @@ -481,7 +481,7 @@ var/mob/living/carbon/human/H = parrot_interest var/obj/item/organ/external/affecting = H.get_organ(ran_zone(pick(parrot_dam_zone))) - H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1) + H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), H.get_armor_soak(affecting, "melee"), sharp=1) visible_emote(pick("pecks [H]'s [affecting].", "cuts [H]'s [affecting] with its talons.")) else diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 5797bf8c8e..a68a90e9ef 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -904,7 +904,7 @@ mob/proc/yank_out_object() if(prob(selection.w_class * 5) && (affected.robotic < ORGAN_ROBOT)) //I'M SO ANEMIC I COULD JUST -DIE-. var/datum/wound/internal_bleeding/I = new (min(selection.w_class * 5, 15)) affected.wounds += I - H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1) + H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 50) if (ishuman(U)) var/mob/living/carbon/human/human_user = U diff --git a/code/modules/mob/mob_grab_specials.dm b/code/modules/mob/mob_grab_specials.dm index e7b75a2e5d..735d35fe7c 100644 --- a/code/modules/mob/mob_grab_specials.dm +++ b/code/modules/mob/mob_grab_specials.dm @@ -20,7 +20,7 @@ user << "You must stand still to feel [E] for fractures." else if(E.status & ORGAN_BROKEN) user << "The [E.encased ? E.encased : "bone in the [E.name]"] moves slightly when you poke it!" - H.custom_pain("Your [E.name] hurts where it's poked.") + H.custom_pain("Your [E.name] hurts where it's poked.", 40) else user << "The [E.encased ? E.encased : "bones in the [E.name]"] seem to be fine." @@ -56,7 +56,8 @@ return var/armor = target.run_armor_check(target, "melee") - if(armor < 60) + var/soaked = target.get_armor_soak(target, "melee") + if(armor + soaked < 60) target << "You feel extreme pain!" var/max_halloss = round(target.species.total_health * 0.8) //up to 80% of passing out @@ -100,8 +101,9 @@ damage += hat.force * 3 var/armor = target.run_armor_check(BP_HEAD, "melee") - target.apply_damage(damage, BRUTE, BP_HEAD, armor) - attacker.apply_damage(10, BRUTE, BP_HEAD, attacker.run_armor_check(BP_HEAD, "melee")) + var/soaked = target.get_armor_soak(BP_HEAD, "melee") + target.apply_damage(damage, BRUTE, BP_HEAD, armor, soaked) + attacker.apply_damage(10, BRUTE, BP_HEAD, attacker.run_armor_check(BP_HEAD), attacker.get_armor_soak(BP_HEAD), "melee") if(!armor && target.headcheck(BP_HEAD) && prob(damage)) target.apply_effect(20, PARALYZE) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index f47097aed0..e7023cb519 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -715,15 +715,25 @@ species_allowed = list("Unathi") //Skrell 'hairstyles' - skr_tentacle_m - name = "Skrell Male Tentacles" - icon_state = "skrell_hair_m" + skr_tentacle_veryshort + name = "Skrell Very Short Tentacles" + icon_state = "skrell_hair_veryshort" species_allowed = list("Skrell") gender = MALE - skr_tentacle_f - name = "Skrell Female Tentacles" - icon_state = "skrell_hair_f" + skr_tentacle_short + name = "Skrell Short Tentacles" + icon_state = "skrell_hair_short" + species_allowed = list("Skrell") + + skr_tentacle_average + name = "Skrell Average Tentacles" + icon_state = "skrell_hair_average" + species_allowed = list("Skrell") + + skr_tentacle_verylong + name = "Skrell Long Tentacles" + icon_state = "skrell_hair_verylong" species_allowed = list("Skrell") gender = FEMALE @@ -1032,21 +1042,31 @@ name = "Socks Coloration (Generic)" icon_state = "pawsocks" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + species_allowed = list("Tajara", "Unathi") paw_socks_belly name = "Socks,Belly Coloration (Generic)" icon_state = "pawsocksbelly" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + species_allowed = list("Tajara", "Unathi") belly_hands_feet name = "Hands,Feet,Belly Color (Minor)" icon_state = "bellyhandsfeetsmall" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + species_allowed = list("Tajara", "Unathi") hands_feet_belly_full name = "Hands,Feet,Belly Color (Major)" icon_state = "bellyhandsfeet" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + species_allowed = list("Tajara", "Unathi") + + hands_feet_belly_full_female + name = "Hands,Feet,Belly Color (Major, Female)" + icon_state = "bellyhandsfeet_female" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + species_allowed = list("Tajara") patches name = "Color Patches" diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 169aec42f7..b7f61f28fa 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -6,6 +6,7 @@ var/const/BLOOD_VOLUME_SAFE = 85 var/const/BLOOD_VOLUME_OKAY = 75 var/const/BLOOD_VOLUME_BAD = 60 var/const/BLOOD_VOLUME_SURVIVE = 40 +var/const/CE_STABLE_THRESHOLD = 0.5 /mob/living/carbon/human/var/datum/reagents/vessel // Container for blood and BLOOD ONLY. Do not transfer other chems here. /mob/living/carbon/human/var/var/pale = 0 // Should affect how mob sprite is drawn, but currently doesn't. @@ -68,14 +69,24 @@ var/const/BLOOD_VOLUME_SURVIVE = 40 if(!heart) blood_volume = 0 - else if(heart.damage > 1 && heart.damage < heart.min_bruised_damage) - blood_volume *= 0.8 - else if(heart.damage >= heart.min_bruised_damage && heart.damage < heart.min_broken_damage) - blood_volume *= 0.6 - else if(heart.damage >= heart.min_broken_damage && heart.damage < INFINITY) + else if(heart.is_broken()) blood_volume *= 0.3 + else if(heart.is_bruised()) + blood_volume *= 0.7 + else if(heart.damage) + blood_volume *= 0.8 //Effects of bloodloss + var/dmg_coef = 1 //Lower means less damage taken + var/threshold_coef = 1 //Lower means the damage caps off lower + + if(CE_STABLE in chem_effects) + dmg_coef = 0.5 + threshold_coef = 0.75 +// These are Bay bits, do some sort of calculation. +// dmg_coef = min(1, 10/chem_effects[CE_STABLE]) //TODO: add effect for increased damage +// threshold_coef = min(dmg_coef / CE_STABLE_THRESHOLD, 1) + if(blood_volume >= BLOOD_VOLUME_SAFE) if(pale) pale = 0 @@ -89,23 +100,23 @@ var/const/BLOOD_VOLUME_SURVIVE = 40 if(prob(1)) var/word = pick("dizzy","woosey","faint") src << "\red You feel [word]" - if(oxyloss < 20) - oxyloss += 3 + if(getOxyLoss() < 20 * threshold_coef) + adjustOxyLoss(3 * dmg_coef) else if(blood_volume >= BLOOD_VOLUME_BAD) if(!pale) pale = 1 update_body() eye_blurry = max(eye_blurry,6) - if(oxyloss < 50) - oxyloss += 10 - oxyloss += 1 + if(getOxyLoss() < 50 * threshold_coef) + adjustOxyLoss(10 * dmg_coef) + adjustOxyLoss(1 * dmg_coef) if(prob(15)) Paralyse(rand(1,3)) var/word = pick("dizzy","woosey","faint") src << "\red You feel extremely [word]" else if(blood_volume >= BLOOD_VOLUME_SURVIVE) - oxyloss += 5 - toxloss += 3 + adjustOxyLoss(5 * dmg_coef) + adjustToxLoss(3 * dmg_coef) if(prob(15)) var/word = pick("dizzy","woosey","faint") src << "\red You feel extremely [word]" @@ -115,8 +126,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 40 update_body() eye_blurry = max(eye_blurry,6) Paralyse(3) - toxloss += 3 - oxyloss += 75 // 15 more than dexp fixes (also more than dex+dexp+tricord) + adjustToxLoss(3 * dmg_coef) + adjustOxyLoss(75 * dmg_coef) // 15 more than dexp fixes (also more than dex+dexp+tricord) // Without enough blood you slowly go hungry. if(blood_volume < BLOOD_VOLUME_SAFE) @@ -144,6 +155,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 40 blood_loss_divisor += 5 else if((temp.organ_tag == BP_L_HAND) || (temp.organ_tag == BP_R_HAND) || (temp.organ_tag == BP_L_FOOT) || (temp.organ_tag == BP_R_FOOT)) blood_loss_divisor += 10 + if(CE_STABLE in chem_effects) //Inaprov slows bloodloss + blood_loss_divisor += 10 if(temp.applied_pressure) if(ishuman(temp.applied_pressure)) var/mob/living/carbon/human/H = temp.applied_pressure diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index 6e4c15f752..c00d5df7a8 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -24,7 +24,7 @@ /obj/item/organ/internal/lungs/proc/rupture() var/obj/item/organ/external/parent = owner.get_organ(parent_organ) if(istype(parent)) - owner.custom_pain("You feel a stabbing pain in your [parent.name]!", 1) + owner.custom_pain("You feel a stabbing pain in your [parent.name]!", 50) bruise() /obj/item/organ/internal/lungs/handle_germ_effects() diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 30a80b6599..4639369c7c 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -256,7 +256,7 @@ var/list/organ_cache = list() if(owner && parent_organ && amount > 0) var/obj/item/organ/external/parent = owner.get_organ(parent_organ) if(parent && !silent) - owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1) + owner.custom_pain("Something inside your [parent.name] hurts a lot.", amount) /obj/item/organ/proc/bruise() damage = max(damage, min_bruised_damage) @@ -372,5 +372,11 @@ var/list/organ_cache = list() bitten(user) return -/obj/item/organ/proc/can_feel_pain() - return !(robotic >= (ORGAN_ROBOT|ORGAN_DESTROYED)) && !(species.flags & NO_PAIN) +/obj/item/organ/proc/organ_can_feel_pain() + if(species.flags & NO_PAIN) + return 0 + if(status & ORGAN_DESTROYED) + return 0 + if(robotic && robotic < ORGAN_LIFELIKE) //Super fancy humanlike robotics probably have sensors, or something? + return 0 + return 1 \ No newline at end of file diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 2b7188462d..bdda698472 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -268,7 +268,7 @@ if(status & ORGAN_BROKEN && brute) jostle_bone(brute) - if(can_feel_pain() && prob(40)) + if(organ_can_feel_pain() && prob(40)) owner.emote("scream") //getting hit on broken hand hurts if(used_weapon) add_autopsy_data("[used_weapon]", brute + burn) @@ -488,7 +488,7 @@ This function completely restores a damaged organ to perfect condition. if((damage > 15) && (type != BURN) && (local_damage > 30) && prob(damage) && (robotic < ORGAN_ROBOT)) var/datum/wound/internal_bleeding/I = new (min(damage - 15, 15)) wounds += I - owner.custom_pain("You feel something rip in your [name]!", 1) + owner.custom_pain("You feel something rip in your [name]!", 50) //Burn damage can cause fluid loss due to blistering and cook-off if((damage > 5 || damage + burn_dam >= 15) && type == BURN && (robotic < ORGAN_ROBOT) && !istype(owner.loc,/mob/living) && !istype(owner.loc,/obj/item/device/dogborg/sleeper)) // VOREStation Edit @@ -699,14 +699,13 @@ Note that amputating the affected organ does in fact remove the infection from t if(W.internal && owner.bodytemperature >= 170) var/bicardose = owner.reagents.get_reagent_amount("bicaridine") var/inaprovaline = owner.reagents.get_reagent_amount("inaprovaline") - if(!(W.can_autoheal() || (bicardose && inaprovaline))) //bicaridine and inaprovaline stop internal wounds from growing bigger with time, unless it is so small that it is already healing + var/myeldose = owner.reagents.get_reagent_amount("myelamine") + if(!(W.can_autoheal() || (bicardose && inaprovaline) || myeldose)) //bicaridine and inaprovaline stop internal wounds from growing bigger with time, unless it is so small that it is already healing W.open_wound(0.1 * wound_update_accuracy) - if(bicardose >= 30) //overdose of bicaridine begins healing IB - W.damage = max(0, W.damage - 0.2) owner.vessel.remove_reagent("blood", wound_update_accuracy * W.damage/40) //line should possibly be moved to handle_blood, so all the bleeding stuff is in one place. if(prob(1 * wound_update_accuracy)) - owner.custom_pain("You feel a stabbing pain in your [name]!",1) + owner.custom_pain("You feel a stabbing pain in your [name]!", 50) // slow healing var/heal_amt = 0 @@ -1011,7 +1010,7 @@ Note that amputating the affected organ does in fact remove the infection from t "Something feels like it shattered in your [name]!",\ "You hear a sickening crack.") jostle_bone() - if(can_feel_pain()) + if(organ_can_feel_pain()) owner.emote("scream") playsound(src.loc, "fracture", 10, 1, -2) diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 6975e747d0..244c0b7971 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -248,20 +248,23 @@ if(inflamed == 1) if(prob(5)) - owner << "You feel a stinging pain in your abdomen!" - owner.emote("me", 1, "winces slightly.") + if(owner.can_feel_pain()) + owner.custom_pain("You feel a stinging pain in your abdomen!", 25) if(inflamed > 1) if(prob(3)) - owner << "You feel a stabbing pain in your abdomen!" - owner.emote("me", 1, "winces painfully.") + if(owner.can_feel_pain()) + owner.custom_pain("You feel a stabbing pain in your abdomen!", 50) owner.adjustToxLoss(1) if(inflamed > 2) if(prob(1)) owner.vomit() + if(owner.can_feel_pain()) + owner.custom_pain("You feel a horrible pain in your abdomen!", 70) if(inflamed > 3) if(prob(1)) - owner << "Your abdomen is a world of pain!" - owner.Weaken(10) + if(owner.can_feel_pain()) + owner.custom_pain("You feel a stinging pain in your abdomen!", 100) + owner.Weaken(10) var/obj/item/organ/external/groin = owner.get_organ(BP_GROIN) var/datum/wound/W = new /datum/wound/internal_bleeding(20) diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm index ea9499fc43..5f3980d608 100644 --- a/code/modules/organs/pain.dm +++ b/code/modules/organs/pain.dm @@ -5,118 +5,73 @@ mob/var/list/pain_stored = list() mob/var/last_pain_message = "" mob/var/next_pain_time = 0 -// partname is the name of a body part -// amount is a num from 1 to 100 -mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0) - if(stat >= 1) - return - if(!can_feel_pain()) - return - if(analgesic > 40) - return - if(world.time < next_pain_time && !force) - return - if(amount > 10 && istype(src,/mob/living/carbon/human)) - if(src:paralysis) - src:paralysis = max(0, src:paralysis-round(amount/10)) - if(amount > 50 && prob(amount / 5)) - src:drop_item() - var/msg - if(burning) - switch(amount) - if(1 to 10) - msg = "Your [partname] burns." - if(11 to 90) - flash_weak_pain() - msg = "Your [partname] burns badly!" - if(91 to 10000) - flash_pain() - msg = "OH GOD! Your [partname] is on fire!" - else - switch(amount) - if(1 to 10) - msg = "Your [partname] hurts." - if(11 to 90) - flash_weak_pain() - msg = "Your [partname] hurts badly." - if(91 to 10000) - flash_pain() - msg = "OH GOD! Your [partname] is hurting terribly!" - if(msg && (msg != last_pain_message || prob(10))) - last_pain_message = msg - src << msg - next_pain_time = world.time + (100 - amount) - - // message is the custom message to be displayed -// flash_strength is 0 for weak pain flash, 1 for strong pain flash -mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength) - if(stat >= 1) - return - if(!can_feel_pain()) - return - if(reagents.has_reagent("tramadol")) - return - if(reagents.has_reagent("oxycodone")) - return - if(analgesic) - return - var/msg = "[message]" - if(flash_strength >= 1) - msg = "[message]" +// power decides how much painkillers will stop the message +// force means it ignores anti-spam timer +mob/living/carbon/proc/custom_pain(message, power, force) + if(!message || stat || !can_feel_pain() || chem_effects[CE_PAINKILLER] > power) + return 0 + message = "[message]" + if(power >= 50) + message = "[message]" // Anti message spam checks - if(msg && ((msg != last_pain_message) || (world.time >= next_pain_time))) - last_pain_message = msg - src << msg - next_pain_time = world.time + 100 + if(force || (message != last_pain_message) || (world.time >= next_pain_time)) + last_pain_message = message + src << message + next_pain_time = world.time + (100-power) mob/living/carbon/human/proc/handle_pain() - // not when sleeping + if(stat) + return - if(!can_feel_pain()) return + if(!can_feel_pain()) + return - if(stat >= 2) return - if(analgesic > 70) + if(world.time < next_pain_time) return var/maxdam = 0 var/obj/item/organ/external/damaged_organ = null for(var/obj/item/organ/external/E in organs) - if((E.status & ORGAN_DEAD) || E.robotic >= ORGAN_ROBOT) continue + if(!E.organ_can_feel_pain()) continue var/dam = E.get_damage() // make the choice of the organ depend on damage, // but also sometimes use one of the less damaged ones if(dam > maxdam && (maxdam == 0 || prob(70)) ) damaged_organ = E maxdam = dam - if(damaged_organ) - pain(damaged_organ.name, maxdam, 0) + if(damaged_organ && chem_effects[CE_PAINKILLER] < maxdam) + if(maxdam > 10 && paralysis) + paralysis = max(0, paralysis - round(maxdam/10)) + if(maxdam > 50 && prob(maxdam / 5)) + drop_item() + var/burning = damaged_organ.burn_dam > damaged_organ.brute_dam + var/msg + switch(maxdam) + if(1 to 10) + msg = "Your [damaged_organ.name] [burning ? "burns" : "hurts"]." + if(11 to 90) + flash_weak_pain() + msg = "Your [damaged_organ.name] [burning ? "burns" : "hurts"] badly!" + if(91 to 10000) + flash_pain() + msg = "OH GOD! Your [damaged_organ.name] is [burning ? "on fire" : "hurting terribly"]!" + custom_pain(msg, maxdam, prob(10)) // Damage to internal organs hurts a lot. for(var/obj/item/organ/I in internal_organs) if((I.status & ORGAN_DEAD) || I.robotic >= ORGAN_ROBOT) continue if(I.damage > 2) if(prob(2)) var/obj/item/organ/external/parent = get_organ(I.parent_organ) - src.custom_pain("You feel a sharp pain in your [parent.name]", 1) + src.custom_pain("You feel a sharp pain in your [parent.name]", 50) - var/toxDamageMessage = null - var/toxMessageProb = 1 - switch(getToxLoss()) - if(1 to 5) - toxMessageProb = 1 - toxDamageMessage = "Your body stings slightly." - if(6 to 10) - toxMessageProb = 2 - toxDamageMessage = "Your whole body hurts a little." - if(11 to 15) - toxMessageProb = 2 - toxDamageMessage = "Your whole body hurts." - if(15 to 25) - toxMessageProb = 3 - toxDamageMessage = "Your whole body hurts badly." - if(26 to INFINITY) - toxMessageProb = 5 - toxDamageMessage = "Your body aches all over, it's driving you mad." - - if(toxDamageMessage && prob(toxMessageProb)) - src.custom_pain(toxDamageMessage, getToxLoss() >= 15) \ No newline at end of file + if(prob(2)) + switch(getToxLoss()) + if(1 to 10) + custom_pain("Your body stings slightly.", getToxLoss()) + if(11 to 30) + custom_pain("Your body hurts a little.", getToxLoss()) + if(31 to 60) + custom_pain("Your whole body hurts badly.", getToxLoss()) + if(61 to INFINITY) + custom_pain("Your body aches all over, it's driving you mad.", getToxLoss()) \ No newline at end of file diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/subtypes/diona.dm index 4ae5e964ac..cdb963e35b 100644 --- a/code/modules/organs/subtypes/diona.dm +++ b/code/modules/organs/subtypes/diona.dm @@ -52,7 +52,7 @@ name = "left upper tendril" organ_tag = "l_arm" icon_name = "l_arm" - max_damage = 50 + max_damage = 30 min_broken_damage = 20 w_class = ITEMSIZE_NORMAL body_part = ARM_LEFT @@ -69,7 +69,7 @@ name = "left lower tendril" organ_tag = "l_leg" icon_name = "l_leg" - max_damage = 50 + max_damage = 30 min_broken_damage = 20 w_class = ITEMSIZE_NORMAL body_part = LEG_LEFT @@ -88,7 +88,7 @@ name = "left foot" organ_tag = "l_foot" icon_name = "l_foot" - max_damage = 35 + max_damage = 25 min_broken_damage = 10 w_class = ITEMSIZE_SMALL body_part = FOOT_LEFT @@ -110,7 +110,7 @@ name = "left grasper" organ_tag = "l_hand" icon_name = "l_hand" - max_damage = 40 + max_damage = 25 min_broken_damage = 15 w_class = ITEMSIZE_SMALL body_part = HAND_LEFT diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 350aab3414..29a62f6f36 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -180,7 +180,7 @@ update_icon() else usr << "You need to hold it in hands!" - if (istype(src.loc, /mob) ||istype(src.loc.loc, /mob)) + if (src.loc && istype(src.loc, /mob) ||istype(src.loc.loc, /mob)) src.attack_self(usr) updateUsrDialog() diff --git a/code/modules/planet/weather.dm b/code/modules/planet/weather.dm index c6543fb4a1..3c06b350df 100644 --- a/code/modules/planet/weather.dm +++ b/code/modules/planet/weather.dm @@ -265,11 +265,15 @@ var/target_zone = pick(BP_ALL) var/amount_blocked = L.run_armor_check(target_zone, "melee") + var/amount_soaked = L.get_armor_soak(target_zone, "melee") if(amount_blocked >= 100) return // No need to apply damage. - L.apply_damage(rand(5, 10), BRUTE, target_zone, amount_blocked, used_weapon = "hail") + if(amount_soaked >= 10) + return // No need to apply damage. + + L.apply_damage(rand(5, 10), BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail") to_chat(L, "The hail raining down on you [L.can_feel_pain() ? "hurts" : "damages you"]!") /datum/weather/sif/blood_moon diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index c71f0e35e7..de0c339c7c 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -345,7 +345,10 @@ usr << "\red You have disassembled the SMES cell!" var/obj/structure/frame/M = new /obj/structure/frame(src.loc) - M.frame_type = "machine" + M.frame_type = new /datum/frame/frame_types/machine + M.anchored = 1 + var/obj/item/weapon/circuitboard/C = new /obj/item/weapon/circuitboard/smes + M.circuit = C M.state = 2 M.icon_state = "machine_1" for(var/obj/I in component_parts) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 98dd1f987c..75d574ed63 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -223,6 +223,38 @@ attached_lock.stored_dna = list() return 1 +/obj/item/weapon/gun/MouseDrop(obj/over_object as obj) + if(!canremove) + return + + if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist + + if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why? + return + + if (!( istype(over_object, /obj/screen) )) + return ..() + + //makes sure that the thing is equipped, so that we can't drag it into our hand from miles away. + //there's got to be a better way of doing this. + if (!(src.loc == usr) || (src.loc && src.loc.loc == usr)) + return + + if (( usr.restrained() ) || ( usr.stat )) + return + + if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src)) + return + + switch(over_object.name) + if("r_hand") + usr.u_equip(src) + usr.put_in_r_hand(src) + if("l_hand") + usr.u_equip(src) + usr.put_in_l_hand(src) + src.add_fingerprint(usr) + /obj/item/weapon/gun/proc/Fire(atom/target, mob/living/user, clickparams, pointblank=0, reflex=0) if(!user || !target) return diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 5be9ed93c2..78b33ef36e 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -372,9 +372,6 @@ src.updateUsrDialog() return 0 -/obj/machinery/reagentgrinder/attack_ai(mob/user as mob) - return 0 - /obj/machinery/reagentgrinder/attack_hand(mob/user as mob) user.set_machine(src) interact(user) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 9e7fbd461f..723db2ace7 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -26,7 +26,8 @@ var/touch_met = 0 var/dose = 0 var/max_dose = 0 - var/overdose = 0 + var/overdose = 0 //Amount at which overdose starts + var/overdose_mod = 2 //Modifier to overdose damage var/scannable = 0 // Shows up on health analyzers. var/affects_dead = 0 var/cup_icon_state = null @@ -60,8 +61,6 @@ return if(!affects_dead && M.stat == DEAD) return - if(overdose && (volume > overdose) && (location != CHEM_TOUCH)) - overdose(M, alien) var/removed = metabolism if(!mrate_static == TRUE) removed *= M.species.metabolic_rate @@ -80,6 +79,8 @@ affect_ingest(M, alien, removed) if(CHEM_TOUCH) affect_touch(M, alien, removed) + if(overdose && (volume > overdose) && (location != CHEM_TOUCH)) + overdose(M, alien, removed) remove_self(removed) return @@ -93,9 +94,13 @@ /datum/reagent/proc/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) return -/datum/reagent/proc/overdose(var/mob/living/carbon/M, var/alien) // Overdose effect. Doesn't happen instantly. - M.adjustToxLoss(REM) - return +/datum/reagent/proc/overdose(var/mob/living/carbon/M, var/alien, var/removed) // Overdose effect. Doesn't happen instantly. + if(alien == IS_DIONA) + return + if(ishuman(M)) + var/mob/living/carbon/human/H = M + overdose_mod *= H.species.chemOD_mod + M.adjustToxLoss(removed * overdose_mod) /datum/reagent/proc/initialize_data(var/newdata) // Called when the reagent is created. if(!isnull(newdata)) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index 44ad6f24a2..091842663d 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -349,7 +349,7 @@ if(affecting.take_damage(0, removed * power * 0.1)) H.UpdateDamageIcon() if(prob(100 * removed / meltdose)) // Applies disfigurement - if (affecting.can_feel_pain()) + if (affecting.organ_can_feel_pain()) H.emote("scream") H.status_flags |= DISFIGURED else diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index c049f3c0e9..6760f8a9d9 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -14,8 +14,8 @@ /datum/reagent/inaprovaline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) - M.add_chemical_effect(CE_STABLE) - M.add_chemical_effect(CE_PAINKILLER, 25) + M.add_chemical_effect(CE_STABLE, 15) + M.add_chemical_effect(CE_PAINKILLER, 10) /datum/reagent/bicaridine name = "Bicaridine" @@ -32,6 +32,23 @@ if(alien != IS_DIONA) M.heal_organ_damage(6 * removed, 0) +/datum/reagent/bicaridine/overdose(var/mob/living/carbon/M, var/alien, var/removed) + ..() + var/wound_heal = 1.5 * removed + M.eye_blurry += (wound_heal) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + for(var/obj/item/organ/external/O in H.bad_external_organs) + for(var/datum/wound/W in O.wounds) + if(W.bleeding()) + W.damage = max(W.damage - wound_heal, 0) + if(W.damage <= 0) + O.wounds -= W + if(W.internal) + W.damage = max(W.damage - wound_heal, 0) + if(W.damage <= 0) + O.wounds -= W + /datum/reagent/kelotane name = "Kelotane" id = "kelotane" @@ -76,6 +93,29 @@ M.hallucination = max(0, M.hallucination - 9 * removed) M.adjustToxLoss(-4 * removed) +/datum/reagent/carthatoline + name = "carthatoline" + id = "carthatoline" + description = "Carthatoline is strong evacuant used to treat severe poisoning." + reagent_state = LIQUID + color = "#225722" + scannable = 1 + +/datum/reagent/carthatoline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) + return + if(M.getToxLoss() && prob(10)) + M.vomit(1) + M.adjustToxLoss(-8 * removed) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/internal/liver/L = H.internal_organs_by_name[O_LIVER] + if(istype(L)) + if(L.robotic >= ORGAN_ROBOT) + return + if(L.damage > 0) + L.damage = max(L.damage - 2 * removed, 0) + /datum/reagent/dexalin name = "Dexalin" id = "dexalin" @@ -109,7 +149,7 @@ if(alien == IS_VOX) M.adjustToxLoss(removed * 9) else if(alien != IS_DIONA) - M.adjustOxyLoss(-300 * removed) + M.adjustOxyLoss(-150 * removed) holder.remove_reagent("lexorin", 3 * removed) @@ -179,7 +219,7 @@ mrate_static = TRUE /datum/reagent/paracetamol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - M.add_chemical_effect(CE_PAINKILLER, 50) + M.add_chemical_effect(CE_PAINKILLER, 25) /datum/reagent/paracetamol/overdose(var/mob/living/carbon/M, var/alien) ..() @@ -217,6 +257,8 @@ /datum/reagent/oxycodone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.add_chemical_effect(CE_PAINKILLER, 200) + M.eye_blurry += 10 + M.confused += 5 /datum/reagent/oxycodone/overdose(var/mob/living/carbon/M, var/alien) ..() @@ -246,7 +288,7 @@ holder.remove_reagent("mindbreaker", 5) M.hallucination = max(0, M.hallucination - 10) M.adjustToxLoss(5 * removed) // It used to be incredibly deadly due to an oversight. Not anymore! - M.add_chemical_effect(CE_PAINKILLER, 40) + M.add_chemical_effect(CE_PAINKILLER, 20) /datum/reagent/alkysine name = "Alkysine" @@ -307,9 +349,62 @@ continue if(I.damage > 0) //Peridaxon heals only non-robotic organs I.damage = max(I.damage - removed, 0) + H.confused += 5 if(I.damage <= 5 && I.organ_tag == O_EYES) + H.eye_blurry += 10 //Eyes need to reset, or something H.sdisabilities &= ~BLIND +/datum/reagent/osteodaxon + name = "Osteodaxon" + id = "osteodaxon" + description = "An experimental drug used to heal bone fractures." + reagent_state = LIQUID + color = "#C9BCE3" + metabolism = REM * 0.5 + overdose = REAGENTS_OVERDOSE * 0.5 + scannable = 1 + +/datum/reagent/osteodaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) + return + M.heal_organ_damage(3 * removed, 0) //Gives the bones a chance to set properly even without other meds + if(ishuman(M)) + var/mob/living/carbon/human/H = M + for(var/obj/item/organ/external/O in H.bad_external_organs) + if(O.status & ORGAN_BROKEN) + O.mend_fracture() //Only works if the bone won't rebreak, as usual + H.custom_pain("You feel a terrible agony tear through your bones!",60) + H.AdjustWeakened(1) //Bones being regrown will knock you over + +/datum/reagent/myelamine + name = "Myelamine" + id = "myelamine" + description = "Used to rapidly clot internal hemorrhages by increasing the effectiveness of platelets." + reagent_state = LIQUID + color = "#4246C7" + metabolism = REM * 0.5 + overdose = REAGENTS_OVERDOSE * 0.5 + scannable = 1 + var/repair_strength = 3 + +/datum/reagent/myelamine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) + return + M.eye_blurry += (repair_strength * removed) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/wound_heal = removed * repair_strength + for(var/obj/item/organ/external/O in H.bad_external_organs) + for(var/datum/wound/W in O.wounds) + if(W.bleeding()) + W.damage = max(W.damage - wound_heal, 0) + if(W.damage <= 0) + O.wounds -= W + if(W.internal) + W.damage = max(W.damage - wound_heal, 0) + if(W.damage <= 0) + O.wounds -= W + /datum/reagent/ryetalyn name = "Ryetalyn" id = "ryetalyn" @@ -364,6 +459,8 @@ scannable = 1 /datum/reagent/hyronalin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) + return M.radiation = max(M.radiation - 30 * removed, 0) /datum/reagent/arithrazine @@ -378,6 +475,8 @@ scannable = 1 /datum/reagent/arithrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) + return M.radiation = max(M.radiation - 70 * removed, 0) M.adjustToxLoss(-10 * removed) if(prob(60)) @@ -432,11 +531,35 @@ scannable = 1 /datum/reagent/leporazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) + return if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (40 * TEMPERATURE_DAMAGE_COEFFICIENT)) else if(M.bodytemperature < 311) M.bodytemperature = min(310, M.bodytemperature + (40 * TEMPERATURE_DAMAGE_COEFFICIENT)) +/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." + reagent_state = SOLID + color = "#669900" + overdose = REAGENTS_OVERDOSE + scannable = 1 + +/datum/reagent/rezadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) + return + 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) + /* Antidepressants */ #define ANTIDEPRESSANT_MESSAGE_DELAY 5*60*10 diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 15ff2e4f80..6e34257e4a 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -43,6 +43,13 @@ color = "#003333" strength = 10 +/datum/reagent/toxin/spidertoxin + name = "Spidertoxin" + id = "spidertoxin" + description = "A liquifying toxin produced by giant spiders." + color = "#2CE893" + strength = 5 + /datum/reagent/toxin/phoron name = "Phoron" id = "phoron" @@ -381,6 +388,7 @@ color = "#000067" metabolism = REM * 0.5 overdose = REAGENTS_OVERDOSE * 0.5 + overdose_mod = 5 //For that good, lethal feeling /datum/reagent/chloralhydrate/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -406,6 +414,11 @@ if(effective_dose > 1 * threshold) M.adjustToxLoss(removed) +/datum/reagent/chloralhydrate/overdose(var/mob/living/carbon/M, var/alien, var/removed) + ..() + M.losebreath = (min(M.losebreath + 1, 10)) + M.adjustOxyLoss(removed * overdose_mod) + /datum/reagent/chloralhydrate/beer2 //disguised as normal beer for use by emagged brobots name = "Beer" id = "beer2" diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 9a3b324b30..a0a6a89cb2 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -160,6 +160,14 @@ required_reagents = list("silicon" = 1, "potassium" = 1, "nitrogen" = 1) result_amount = 3 +/datum/chemical_reaction/carthatoline + name = "Carthatoline" + id = "carthatoline" + result = "carthatoline" + required_reagents = list("dylovene" = 1, "carbon" = 2, "phoron" = 0.1) + catalysts = list("phoron" = 1) + result_amount = 2 + /datum/chemical_reaction/tramadol name = "Tramadol" id = "tramadol" @@ -282,6 +290,15 @@ catalysts = list("phoron" = 5) result_amount = 2 +/datum/chemical_reaction/osteodaxon + name = "Osteodaxon" + id = "osteodaxon" + result = "osteodaxon" + required_reagents = list("bicaridine" = 2, "phoron" = 0.1, "carpotoxin" = 1) + catalysts = list("phoron" = 5) + inhibitors = list("clonexadone" = 1) // Messes with cryox + result_amount = 2 + /datum/chemical_reaction/virus_food name = "Virus Food" id = "virusfood" @@ -349,6 +366,13 @@ inhibitors = list("sugar" = 1) // Messes up with inaprovaline result_amount = 2 +/datum/chemical_reaction/myelamine + name = "Myelamine" + id = "myelamine" + result = "myelamine" + required_reagents = list("bicaridine" = 1, "iron" = 2, "spidertoxin" = 1) + result_amount = 2 + /datum/chemical_reaction/hyperzine name = "Hyperzine" id = "hyperzine" @@ -1783,35 +1807,35 @@ required_reagents = list("icetea" = 1, "lemonade" = 1) result_amount = 2 -/datum/chemical_reaction/minttea +/datum/chemical_reaction/drinks/minttea name = "Mint Tea" id = "minttea" result = "minttea" required_reagents = list("tea" = 5, "mint" = 1) result_amount = 6 -/datum/chemical_reaction/lemontea +/datum/chemical_reaction/drinks/lemontea name = "Lemon Tea" id = "lemontea" result = "lemontea" required_reagents = list("tea" = 5, "lemonjuice" = 1) result_amount = 6 -/datum/chemical_reaction/limetea +/datum/chemical_reaction/drinks/limetea name = "Lime Tea" id = "limetea" result = "limetea" required_reagents = list("tea" = 5, "limejuice" = 1) result_amount = 6 -/datum/chemical_reaction/limetea +/datum/chemical_reaction/drinks/limetea name = "Orange Tea" id = "orangetea" result = "orangetea" required_reagents = list("tea" = 5, "orangejuice" = 1) result_amount = 6 -/datum/chemical_reaction/berrytea +/datum/chemical_reaction/drinks/berrytea name = "Berry Tea" id = "berrytea" result = "berrytea" diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index a89e10a66a..dbfcc4a7c9 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -749,6 +749,19 @@ reagents.add_reagent("pacid",6) src.bitesize = 6 +/obj/item/weapon/reagent_containers/food/snacks/spidermeat + name = "meat" + desc = "A slab of green meat." + icon_state = "xenomeat" + filling_color = "#43DE18" + center_of_mass = list("x"=16, "y"=10) + +/obj/item/weapon/reagent_containers/food/snacks/spidermeat/New() + ..() + reagents.add_reagent("protein", 6) + reagents.add_reagent("spidertoxin",6) + src.bitesize = 6 + /obj/item/weapon/reagent_containers/food/snacks/meatball name = "meatball" desc = "A great meal all round." diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 771ce4cc27..e9e3c62dad 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -88,3 +88,33 @@ user << "It is currently loaded." else user << "It is spent." + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting + name = "clotting agent" + desc = "A rapid and safe way to administer clotting drugs by untrained or trained personnel." + icon_state = "autoinjector" + item_state = "autoinjector" + amount_per_transfer_from_this = 10 + volume = 10 + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting/New() + ..() + reagents.remove_reagent("inaprovaline", 5) + reagents.add_reagent("myelamine", 10) + update_icon() + return + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed + name = "bone repair injector" + desc = "A rapid and safe way to administer advanced drugs by untrained or trained personnel." + icon_state = "autoinjector" + item_state = "autoinjector" + amount_per_transfer_from_this = 10 + volume = 10 + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/New() + ..() + reagents.remove_reagent("inaprovaline", 5) + reagents.add_reagent("osteodaxon", 10) + update_icon() + return \ No newline at end of file diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index f89e8a20cd..53d534a619 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -242,6 +242,7 @@ var/obj/machinery/blackbox_recorder/blackbox var/list/msg_security = list() var/list/msg_deathsquad = list() var/list/msg_syndicate = list() + var/list/msg_raider = list() var/list/msg_cargo = list() var/list/msg_service = list() diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 7457b7790d..df9c900d38 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -50,7 +50,7 @@ var/public_alert = 0 //Stick to Engineering frequency except for big warnings when integrity bad var/warning_point = 100 var/warning_alert = "Danger! Crystal hyperstructure instability!" - var/emergency_point = 700 + var/emergency_point = 500 var/emergency_alert = "CRYSTAL DELAMINATION IMMINENT." var/explosion_point = 1000 diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index 015661351f..80a7a1f820 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -25,7 +25,7 @@ if (affected.stage == 0) user.visible_message("[user] starts applying medication to the damaged bones in [target]'s [affected.name] with \the [tool]." , \ "You start applying medication to the damaged bones in [target]'s [affected.name] with \the [tool].") - target.custom_pain("Something in your [affected.name] is causing you a lot of pain!",1) + target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -58,7 +58,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] is beginning to set the bone in [target]'s [affected.name] in place with \the [tool]." , \ "You are beginning to set the bone in [target]'s [affected.name] in place with \the [tool].") - target.custom_pain("The pain in your [affected.name] is going to make you pass out!",1) + target.custom_pain("The pain in your [affected.name] is going to make you pass out!", 50) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm index 51200b52bf..abcc0621da 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -38,7 +38,7 @@ user.visible_message("[user] begins to cut through [target]'s [affected.encased] with \the [tool].", \ "You begin to cut through [target]'s [affected.encased] with \the [tool].") - target.custom_pain("Something hurts horribly in your [affected.name]!",1) + target.custom_pain("Something hurts horribly in your [affected.name]!", 60) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -88,7 +88,7 @@ var/msg = "[user] starts to force open the [affected.encased] in [target]'s [affected.name] with \the [tool]." var/self_msg = "You start to force open the [affected.encased] in [target]'s [affected.name] with \the [tool]." user.visible_message(msg, self_msg) - target.custom_pain("Something hurts horribly in your [affected.name]!",1) + target.custom_pain("Something hurts horribly in your [affected.name]!", 40) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -145,7 +145,7 @@ var/msg = "[user] starts bending [target]'s [affected.encased] back into place with \the [tool]." var/self_msg = "You start bending [target]'s [affected.encased] back into place with \the [tool]." user.visible_message(msg, self_msg) - target.custom_pain("Something hurts horribly in your [affected.name]!",1) + target.custom_pain("Something hurts horribly in your [affected.name]!", 100) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -202,7 +202,7 @@ var/msg = "[user] starts applying \the [tool] to [target]'s [affected.encased]." var/self_msg = "You start applying \the [tool] to [target]'s [affected.encased]." user.visible_message(msg, self_msg) - target.custom_pain("Something hurts horribly in your [affected.name]!",1) + target.custom_pain("Something hurts horribly in your [affected.name]!", 100) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 81a105a544..513b6096dc 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -42,7 +42,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] starts the bloodless incision on [target]'s [affected.name] with \the [tool].", \ "You start the bloodless incision on [target]'s [affected.name] with \the [tool].") - target.custom_pain("You feel a horrible, searing pain in your [affected.name]!",1) + target.custom_pain("You feel a horrible, searing pain in your [affected.name]!", 50) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -81,7 +81,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] starts to construct a prepared incision on and within [target]'s [affected.name] with \the [tool].", \ "You start to construct a prepared incision on and within [target]'s [affected.name] with \the [tool].") - target.custom_pain("You feel a horrible, searing pain in your [affected.name] as it is pushed apart!",1) + target.custom_pain("You feel a horrible, searing pain in your [affected.name] as it is pushed apart!", 50) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -124,7 +124,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] starts the incision on [target]'s [affected.name] with \the [tool].", \ "You start the incision on [target]'s [affected.name] with \the [tool].") - target.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.name]!",1) + target.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.name]!", 40) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -163,7 +163,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] starts clamping bleeders in [target]'s [affected.name] with \the [tool].", \ "You start clamping bleeders in [target]'s [affected.name] with \the [tool].") - target.custom_pain("The pain in your [affected.name] is maddening!",1) + target.custom_pain("The pain in your [affected.name] is maddening!", 40) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -205,7 +205,7 @@ msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]." self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]." user.visible_message(msg, self_msg) - target.custom_pain("It feels like the skin on your [affected.name] is on fire!",1) + target.custom_pain("It feels like the skin on your [affected.name] is on fire!", 40) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -254,7 +254,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] is beginning to cauterize the incision on [target]'s [affected.name] with \the [tool]." , \ "You are beginning to cauterize the incision on [target]'s [affected.name] with \the [tool].") - target.custom_pain("Your [affected.name] is being burned!",1) + target.custom_pain("Your [affected.name] is being burned!", 40) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -295,7 +295,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] is beginning to amputate [target]'s [affected.name] with \the [tool]." , \ "You are beginning to cut through [target]'s [affected.amputation_point] with \the [tool].") - target.custom_pain("Your [affected.amputation_point] is being ripped apart!",1) + target.custom_pain("Your [affected.amputation_point] is being ripped apart!", 100) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 6abe4c3646..205089773d 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -56,7 +56,7 @@ user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \ "You start treating damage to [target]'s [I.name] with [tool_name]." ) - target.custom_pain("The pain in your [affected.name] is living hell!",1) + target.custom_pain("The pain in your [affected.name] is living hell!", 100) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -146,7 +146,7 @@ user.visible_message("[user] starts to separate [target]'s [target.op_stage.current_organ] with \the [tool].", \ "You start to separate [target]'s [target.op_stage.current_organ] with \the [tool]." ) - target.custom_pain("The pain in your [affected.name] is living hell!",1) + target.custom_pain("The pain in your [affected.name] is living hell!", 100) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -197,7 +197,7 @@ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user] starts removing [target]'s [target.op_stage.current_organ] with \the [tool].", \ "You start removing [target]'s [target.op_stage.current_organ] with \the [tool].") - target.custom_pain("Someone's ripping out your [target.op_stage.current_organ]!",1) + target.custom_pain("Someone's ripping out your [target.op_stage.current_organ]!", 100) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -271,7 +271,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] starts transplanting \the [tool] into [target]'s [affected.name].", \ "You start transplanting \the [tool] into [target]'s [affected.name].") - target.custom_pain("Someone's rooting around in your [affected.name]!",1) + target.custom_pain("Someone's rooting around in your [affected.name]!", 100) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -322,7 +322,7 @@ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user] begins reattaching [target]'s [target.op_stage.current_organ] with \the [tool].", \ "You start reattaching [target]'s [target.op_stage.current_organ] with \the [tool].") - target.custom_pain("Someone's digging needles into your [target.op_stage.current_organ]!",1) + target.custom_pain("Someone's digging needles into your [target.op_stage.current_organ]!", 100) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 2b93139111..176724290f 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -33,7 +33,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] starts patching the damaged vein in [target]'s [affected.name] with \the [tool]." , \ "You start patching the damaged vein in [target]'s [affected.name] with \the [tool].") - target.custom_pain("The pain in [affected.name] is unbearable!",1) + target.custom_pain("The pain in [affected.name] is unbearable!", 100) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -81,7 +81,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] starts cutting away necrotic tissue in [target]'s [affected.name] with \the [tool]." , \ "You start cutting away necrotic tissue in [target]'s [affected.name] with \the [tool].") - target.custom_pain("The pain in [affected.name] is unbearable!",1) + target.custom_pain("The pain in [affected.name] is unbearable!", 100) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -133,7 +133,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] starts applying medication to the affected tissue in [target]'s [affected.name] with \the [tool]." , \ "You start applying medication to the affected tissue in [target]'s [affected.name] with \the [tool].") - target.custom_pain("Something in your [affected.name] is causing you a lot of pain!",1) + target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 8ca82b96a1..5243bae35f 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -121,13 +121,11 @@ stage = 4 badness = 3 activate(var/mob/living/carbon/mob,var/multiplier) - mob.suiciding = 1 + mob.suiciding = 30 //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while viewers(mob) << "\red [mob.name] is holding \his breath. It looks like \he's trying to commit suicide." mob.adjustOxyLoss(175 - mob.getToxLoss() - mob.getFireLoss() - mob.getBruteLoss() - mob.getOxyLoss()) mob.updatehealth() - spawn(200) //in case they get revived by cryo chamber or something stupid like that, let them suicide again in 20 seconds - mob.suiciding = 0 /datum/disease2/effect/killertoxins name = "Toxification Syndrome" diff --git a/html/changelog.html b/html/changelog.html index c5dc314b75..b75510ad4f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,19 +53,66 @@ -->
+

31 March 2017

+

Anewbe updated:

+ + +

30 March 2017

+

Anewbe updated:

+ +

Arokha updated:

+ +

MagmaRam updated:

+ + +

28 March 2017

+

Anewbe updated:

+ +

22 March 2017

Anewbe updated:

Arokha updated:

-

Anewbe updated:

-

24 February 2017

Anewbe updated:

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 56761cf29a..7d118ae5ab 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -3297,17 +3297,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. inform the adminhelper that someone is on the case. 2017-03-22: Anewbe: - - rscadd: You can now click+drag communicators to access them. - - rscadd: Added an ion pistol, has five shots. - - rscadd: Added Bay's Haywire rounds. - - tweak: EMP now works on four levels, instead of two. - - rscadd: Hephaistos Industries prosthetic disks can now be ordered again. - - wip: Hephaistos Industries is the correct spelling for that company, per the wiki. - Please submit a bug report if you find any references that don't match. - - tweak: Extinguishing a smokable on non-Harm intents no longer destroys it. - - rscadd: Space Vines should be more dangerous. - - rscadd: Tasers can hurt simple mobs. - - rscadd: Adds a universal translator device, courtesy of a downstream. + - tweak: Oxyloss now shows up as cyan in scanners. Arokha: - tweak: Having less than 30% blood (as a result of literally having that little blood, or a broken heart) causes 75 oxyloss per tick rather than 300 toxins @@ -3320,5 +3310,58 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Atermonera: - bugfix: EAL, Sign language, and emotes will no longer use autohiss - rscadd: Surgeon Borgs now have a proper medical hud module +2017-03-28: Anewbe: - - tweak: Oxyloss now shows up as cyan in scanners. + - spellcheck: Disregard the last changelog on the spelling of HI, the correct spelling + is Hephaestus. My bad. + - rscadd: Added a changelog editing system that should cause fewer conflicts and + more accurate timestamps. + - rscadd: Added Myelamine, a blood clotting chemical. This is available to antags, + and can be ordered from cargo or mixed. + - rscadd: Added Osteodaxon, a bone fixing medicine. This is available to antags, + and can be mixed. + - rscadd: Added Carthatoline, a stronger anti-toxin. + - rscadd: Added Spidertoxin, which comes from spiders (duh), and is used in making + Myelamine. + - rscadd: Death Alarms can now be ordered from cargo. + - rscdel: Dexalin Plus is half as strong (still pretty strong, though). + - rscadd: Ninja, Merc, and ERT-M Hardsuits can now inject myelamine. + - tweak: Inaprovaline now decreases the effects of bloodloss, and lessens brain + damage taken from OxyLoss. + - tweak: Prosthetic organs now take randomised damage when emp'd, this should roughly + average out to the old values. + - tweak: The effects of heart damage have been tweaked, should be slightly easier + to survive now. + - tweak: Some of the stronger chems have side effects, like confusion or blurry + vision. These should be fairly minor, and we may be tweaking them in the future. + - tweak: The suiciding var now wears off, making it possible to save suicide victims + if quick action is taken. + - tweak: Death Alarms now announce on General comms again. + - rscadd: Borgs can climb tables. + - tweak: Skrell can now be up to 130 years old. + - tweak: Skrell are more vulnerable to flashes, due to their large eyes. + - tweak: Tajaran no longer have appendicies. + - tweak: Tajaran are more vulnerable to flashes. + - tweak: Unathi have less brute resist, but some burn resist. + - tweak: Unathi gender is now unclear to non-Unathi. +2017-03-30: + Anewbe: + - tweak: Italics in chat are now trigged with | , rather than / . + - rscadd: Energy weapons, flashlights, stunbatons, and welders can now be moved + from hand to hand by click+dragging. + - rscadd: Flashlights can now be placed in wall rechargers. + - rscadd: Adds jumper cables, that act a bit like a defib for FBPs. + - bugfix: Bicaridine and Myelamine should now properly repair internal bleeding. + - rscadd: Overdoses are now more dangerous. + - rscadd: Chloral Hydrate overdoses are now even more dangerous. + Arokha: + - rscadd: Adds body markings and tattoos. + MagmaRam: + - bugfix: Borgs and assorted robits can now use grinders in chemistry and the kitchen. +2017-03-31: + Anewbe: + - rscadd: Added a number of crates to cargo. + - rscadd: Added the electric welder as a hidden autolathe recipe. + - rscadd: Added a few colored (in sprite, not in color) flashlights, to the loadout. + Sprites c/o Schnayy. + - rscadd: Maps in a pair of jumper cable kits. Use these to revive FBPs. diff --git a/html/changelogs/Anewbe - HI NAMING FOR REAL.yml b/html/changelogs/Anewbe - Flowercrowns.yml similarity index 92% rename from html/changelogs/Anewbe - HI NAMING FOR REAL.yml rename to html/changelogs/Anewbe - Flowercrowns.yml index a4015a952c..fee55236d5 100644 --- a/html/changelogs/Anewbe - HI NAMING FOR REAL.yml +++ b/html/changelogs/Anewbe - Flowercrowns.yml @@ -33,4 +33,4 @@ delete-after: True # 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: - - spellcheck: "Disregard the last changelog on the spelling of HI, the correct spelling is Hephaestus. My bad." \ No newline at end of file + - rscadd: "Wooden circlets can now be worn on the head." diff --git a/html/changelogs/Leshana-PR-3181.yml b/html/changelogs/Leshana-PR-3181.yml new file mode 100644 index 0000000000..dc15d267c9 --- /dev/null +++ b/html/changelogs/Leshana-PR-3181.yml @@ -0,0 +1,4 @@ +author: Leshana +delete-after: True +changes: + - rscadd: "Upgrades the automatic pipe layer to modernize its code and make it constructable! Constructs and deconstruts like other machines now. Circuits are buildable in the autolathe. Uses steel to make pipes." diff --git a/html/changelogs/Anewbe - Xeno Tweaks.yml b/html/changelogs/MagmaRam - Splints.yml similarity index 77% rename from html/changelogs/Anewbe - Xeno Tweaks.yml rename to html/changelogs/MagmaRam - Splints.yml index 21e507e009..07d627e02f 100644 --- a/html/changelogs/Anewbe - Xeno Tweaks.yml +++ b/html/changelogs/MagmaRam - Splints.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Anewbe +author: Magmaram # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,11 +33,4 @@ delete-after: True # 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: "Skrell can now be up to 130 years old." - - tweak: "Skrell are more vulnerable to flashes, due to their large eyes." - - tweak: "Tajaran no longer have appendicies." - - tweak: "Tajaran are more vulnerable to flashes." - - tweak: "Unathi have less brute resist, but some burn resist." - - tweak: "Unathi gender is now unclear to non-Unathi." - - + - bugfix: "Splints will now show up in examine text on hands and feet as well as arms and legs." diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi index 7fe7877cda..f5fbc438a7 100644 Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ diff --git a/icons/mob/ears.dmi b/icons/mob/ears.dmi index 7326be690e..14823c7801 100644 Binary files a/icons/mob/ears.dmi and b/icons/mob/ears.dmi differ diff --git a/icons/mob/fish.dmi b/icons/mob/fish.dmi new file mode 100644 index 0000000000..22978494dc Binary files /dev/null and b/icons/mob/fish.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index dff3abd7d7..7407aeefb5 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 201a8ffee5..d46f4cee25 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/human_races/markings.dmi b/icons/mob/human_races/markings.dmi index e1f77c077e..636c829bd5 100644 Binary files a/icons/mob/human_races/markings.dmi and b/icons/mob/human_races/markings.dmi differ diff --git a/icons/mob/human_races/r_def_skrell.dmi b/icons/mob/human_races/r_def_skrell.dmi index 1dd654054b..7b24ba3b4d 100644 Binary files a/icons/mob/human_races/r_def_skrell.dmi and b/icons/mob/human_races/r_def_skrell.dmi differ diff --git a/icons/mob/human_races/r_skrell.dmi b/icons/mob/human_races/r_skrell.dmi index 131fe57507..ea04d05b30 100644 Binary files a/icons/mob/human_races/r_skrell.dmi and b/icons/mob/human_races/r_skrell.dmi differ diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi index ad160c7247..5a63eb1c3d 100644 Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ diff --git a/icons/mob/items/lefthand_masks.dmi b/icons/mob/items/lefthand_masks.dmi index 316661dd36..f35288c06f 100644 Binary files a/icons/mob/items/lefthand_masks.dmi and b/icons/mob/items/lefthand_masks.dmi differ diff --git a/icons/mob/items/lefthand_material.dmi b/icons/mob/items/lefthand_material.dmi index 70127575ee..dc642311e5 100644 Binary files a/icons/mob/items/lefthand_material.dmi and b/icons/mob/items/lefthand_material.dmi differ diff --git a/icons/mob/items/lefthand_shoes.dmi b/icons/mob/items/lefthand_shoes.dmi index b2c266b146..b88be1fed7 100644 Binary files a/icons/mob/items/lefthand_shoes.dmi and b/icons/mob/items/lefthand_shoes.dmi differ diff --git a/icons/mob/items/lefthand_storage.dmi b/icons/mob/items/lefthand_storage.dmi index c3e04f0f66..9cd0cb1d52 100644 Binary files a/icons/mob/items/lefthand_storage.dmi and b/icons/mob/items/lefthand_storage.dmi differ diff --git a/icons/mob/items/lefthand_suits.dmi b/icons/mob/items/lefthand_suits.dmi index 9b85b8b0f5..3658248f88 100644 Binary files a/icons/mob/items/lefthand_suits.dmi and b/icons/mob/items/lefthand_suits.dmi differ diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi index 9eb88606ca..d2822ad021 100644 Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ diff --git a/icons/mob/items/righthand_masks.dmi b/icons/mob/items/righthand_masks.dmi index e69f1594d0..30fe71f2d2 100644 Binary files a/icons/mob/items/righthand_masks.dmi and b/icons/mob/items/righthand_masks.dmi differ diff --git a/icons/mob/items/righthand_material.dmi b/icons/mob/items/righthand_material.dmi index db11ee211f..44904c68c7 100644 Binary files a/icons/mob/items/righthand_material.dmi and b/icons/mob/items/righthand_material.dmi differ diff --git a/icons/mob/items/righthand_shoes.dmi b/icons/mob/items/righthand_shoes.dmi index ad77a54bd4..3dd044488f 100644 Binary files a/icons/mob/items/righthand_shoes.dmi and b/icons/mob/items/righthand_shoes.dmi differ diff --git a/icons/mob/items/righthand_storage.dmi b/icons/mob/items/righthand_storage.dmi index 3d100172b3..16cb0d762f 100644 Binary files a/icons/mob/items/righthand_storage.dmi and b/icons/mob/items/righthand_storage.dmi differ diff --git a/icons/mob/items/righthand_suits.dmi b/icons/mob/items/righthand_suits.dmi index bd842852bb..7b4f3eada5 100644 Binary files a/icons/mob/items/righthand_suits.dmi and b/icons/mob/items/righthand_suits.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 8e84c82060..00f14c373e 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 89392d81f7..2b3dfe51d8 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/mob/species/diona/uniforms/color.dmi b/icons/mob/species/diona/uniforms/color.dmi deleted file mode 100644 index 9f282d8d7d..0000000000 Binary files a/icons/mob/species/diona/uniforms/color.dmi and /dev/null differ diff --git a/icons/mob/species/diona/uniforms/dresses.dmi b/icons/mob/species/diona/uniforms/dresses.dmi deleted file mode 100644 index 0c49112a12..0000000000 Binary files a/icons/mob/species/diona/uniforms/dresses.dmi and /dev/null differ diff --git a/icons/mob/species/diona/uniforms/military.dmi b/icons/mob/species/diona/uniforms/military.dmi deleted file mode 100644 index a11c0618bf..0000000000 Binary files a/icons/mob/species/diona/uniforms/military.dmi and /dev/null differ diff --git a/icons/mob/species/diona/uniforms/pants.dmi b/icons/mob/species/diona/uniforms/pants.dmi deleted file mode 100644 index 9de1e49925..0000000000 Binary files a/icons/mob/species/diona/uniforms/pants.dmi and /dev/null differ diff --git a/icons/mob/species/diona/uniforms/uniform.dmi b/icons/mob/species/diona/uniforms/uniform.dmi deleted file mode 100644 index 0af5703cba..0000000000 Binary files a/icons/mob/species/diona/uniforms/uniform.dmi and /dev/null differ diff --git a/icons/mob/species/diona/uniforms/uniform_fat.dmi b/icons/mob/species/diona/uniforms/uniform_fat.dmi deleted file mode 100644 index c887239f1f..0000000000 Binary files a/icons/mob/species/diona/uniforms/uniform_fat.dmi and /dev/null differ diff --git a/icons/mob/species/skrell/uniforms/color.dmi b/icons/mob/species/skrell/uniforms/color.dmi deleted file mode 100644 index 9f282d8d7d..0000000000 Binary files a/icons/mob/species/skrell/uniforms/color.dmi and /dev/null differ diff --git a/icons/mob/species/skrell/uniforms/dresses.dmi b/icons/mob/species/skrell/uniforms/dresses.dmi deleted file mode 100644 index 0c49112a12..0000000000 Binary files a/icons/mob/species/skrell/uniforms/dresses.dmi and /dev/null differ diff --git a/icons/mob/species/skrell/uniforms/military.dmi b/icons/mob/species/skrell/uniforms/military.dmi deleted file mode 100644 index a11c0618bf..0000000000 Binary files a/icons/mob/species/skrell/uniforms/military.dmi and /dev/null differ diff --git a/icons/mob/species/skrell/uniforms/pants.dmi b/icons/mob/species/skrell/uniforms/pants.dmi deleted file mode 100644 index 9de1e49925..0000000000 Binary files a/icons/mob/species/skrell/uniforms/pants.dmi and /dev/null differ diff --git a/icons/mob/species/skrell/uniforms/uniform.dmi b/icons/mob/species/skrell/uniforms/uniform.dmi deleted file mode 100644 index 0af5703cba..0000000000 Binary files a/icons/mob/species/skrell/uniforms/uniform.dmi and /dev/null differ diff --git a/icons/mob/species/skrell/uniforms/uniform_fat.dmi b/icons/mob/species/skrell/uniforms/uniform_fat.dmi deleted file mode 100644 index c887239f1f..0000000000 Binary files a/icons/mob/species/skrell/uniforms/uniform_fat.dmi and /dev/null differ diff --git a/icons/mob/species/tajaran/uniforms/color.dmi b/icons/mob/species/tajaran/uniforms/color.dmi deleted file mode 100644 index 9f282d8d7d..0000000000 Binary files a/icons/mob/species/tajaran/uniforms/color.dmi and /dev/null differ diff --git a/icons/mob/species/tajaran/uniforms/dresses.dmi b/icons/mob/species/tajaran/uniforms/dresses.dmi deleted file mode 100644 index 0c49112a12..0000000000 Binary files a/icons/mob/species/tajaran/uniforms/dresses.dmi and /dev/null differ diff --git a/icons/mob/species/tajaran/uniforms/military.dmi b/icons/mob/species/tajaran/uniforms/military.dmi deleted file mode 100644 index a11c0618bf..0000000000 Binary files a/icons/mob/species/tajaran/uniforms/military.dmi and /dev/null differ diff --git a/icons/mob/species/tajaran/uniforms/pants.dmi b/icons/mob/species/tajaran/uniforms/pants.dmi deleted file mode 100644 index 9de1e49925..0000000000 Binary files a/icons/mob/species/tajaran/uniforms/pants.dmi and /dev/null differ diff --git a/icons/mob/species/tajaran/uniforms/uniform.dmi b/icons/mob/species/tajaran/uniforms/uniform.dmi deleted file mode 100644 index 0af5703cba..0000000000 Binary files a/icons/mob/species/tajaran/uniforms/uniform.dmi and /dev/null differ diff --git a/icons/mob/species/tajaran/uniforms/uniform_fat.dmi b/icons/mob/species/tajaran/uniforms/uniform_fat.dmi deleted file mode 100644 index c887239f1f..0000000000 Binary files a/icons/mob/species/tajaran/uniforms/uniform_fat.dmi and /dev/null differ diff --git a/icons/mob/species/unathi/uniforms/color.dmi b/icons/mob/species/unathi/uniforms/color.dmi deleted file mode 100644 index 9f282d8d7d..0000000000 Binary files a/icons/mob/species/unathi/uniforms/color.dmi and /dev/null differ diff --git a/icons/mob/species/unathi/uniforms/dresses.dmi b/icons/mob/species/unathi/uniforms/dresses.dmi deleted file mode 100644 index 0c49112a12..0000000000 Binary files a/icons/mob/species/unathi/uniforms/dresses.dmi and /dev/null differ diff --git a/icons/mob/species/unathi/uniforms/military.dmi b/icons/mob/species/unathi/uniforms/military.dmi deleted file mode 100644 index a11c0618bf..0000000000 Binary files a/icons/mob/species/unathi/uniforms/military.dmi and /dev/null differ diff --git a/icons/mob/species/unathi/uniforms/pants.dmi b/icons/mob/species/unathi/uniforms/pants.dmi deleted file mode 100644 index 9de1e49925..0000000000 Binary files a/icons/mob/species/unathi/uniforms/pants.dmi and /dev/null differ diff --git a/icons/mob/species/unathi/uniforms/uniform.dmi b/icons/mob/species/unathi/uniforms/uniform.dmi deleted file mode 100644 index 0af5703cba..0000000000 Binary files a/icons/mob/species/unathi/uniforms/uniform.dmi and /dev/null differ diff --git a/icons/mob/species/unathi/uniforms/uniform_fat.dmi b/icons/mob/species/unathi/uniforms/uniform_fat.dmi deleted file mode 100644 index c887239f1f..0000000000 Binary files a/icons/mob/species/unathi/uniforms/uniform_fat.dmi and /dev/null differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index a36a919e3c..d12ae0023e 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 3bac93b933..cad42f3b4f 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/mob/uniform_huge_old.dmi b/icons/mob/uniform_huge_old.dmi new file mode 100644 index 0000000000..3bac93b933 Binary files /dev/null and b/icons/mob/uniform_huge_old.dmi differ diff --git a/icons/mob/uniform_rolled_down.dmi b/icons/mob/uniform_rolled_down.dmi new file mode 100644 index 0000000000..e379946851 Binary files /dev/null and b/icons/mob/uniform_rolled_down.dmi differ diff --git a/icons/mob/uniform_sleeves_rolled.dmi b/icons/mob/uniform_sleeves_rolled.dmi new file mode 100644 index 0000000000..83a759ff80 Binary files /dev/null and b/icons/mob/uniform_sleeves_rolled.dmi differ diff --git a/icons/mob/uniforms/color.dmi b/icons/mob/uniforms/color.dmi deleted file mode 100644 index 9f282d8d7d..0000000000 Binary files a/icons/mob/uniforms/color.dmi and /dev/null differ diff --git a/icons/mob/uniforms/dresses.dmi b/icons/mob/uniforms/dresses.dmi deleted file mode 100644 index 0c49112a12..0000000000 Binary files a/icons/mob/uniforms/dresses.dmi and /dev/null differ diff --git a/icons/mob/uniforms/military.dmi b/icons/mob/uniforms/military.dmi deleted file mode 100644 index a11c0618bf..0000000000 Binary files a/icons/mob/uniforms/military.dmi and /dev/null differ diff --git a/icons/mob/uniforms/pants.dmi b/icons/mob/uniforms/pants.dmi deleted file mode 100644 index 9de1e49925..0000000000 Binary files a/icons/mob/uniforms/pants.dmi and /dev/null differ diff --git a/icons/mob/uniforms/uniform.dmi b/icons/mob/uniforms/uniform.dmi deleted file mode 100644 index 341d677593..0000000000 Binary files a/icons/mob/uniforms/uniform.dmi and /dev/null differ diff --git a/icons/mob/uniforms/uniform_fat.dmi b/icons/mob/uniforms/uniform_fat.dmi deleted file mode 100644 index c887239f1f..0000000000 Binary files a/icons/mob/uniforms/uniform_fat.dmi and /dev/null differ diff --git a/icons/obj/buildingobject.dmi b/icons/obj/buildingobject.dmi index d55e9ec99f..76fa0e4350 100644 Binary files a/icons/obj/buildingobject.dmi and b/icons/obj/buildingobject.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 920e73a891..9337d5127c 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index ad962d394c..b6b28fdfbe 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index bf334122ce..2325aa471e 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 948af3f9e1..3669a4702e 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index d9b7bd22aa..5e6d88e0a3 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index c0df5a707f..dc3456ba67 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index dbaf4a5890..736308440d 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 884b8ac41e..1e7a4ba8a7 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm index f44a3a2615..332a4ce4fe 100644 --- a/maps/northern_star/polaris-1.dmm +++ b/maps/northern_star/polaris-1.dmm @@ -8,13 +8,13 @@ "aah" = (/turf/simulated/mineral,/area/mine/unexplored/upper_level) "aai" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/airless,/area/mine/unexplored/upper_level) "aaj" = (/turf/simulated/shuttle/wall,/area/shuttle/cryo/station) -"aak" = (/turf/simulated/shuttle/wall{icon_state = "swall_t"; dir = 1},/area/shuttle/cryo/station) +"aak" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/cryo/station) "aal" = (/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/airless,/area/mine/unexplored/upper_level) -"aam" = (/turf/simulated/shuttle/wall{icon_state = "swall_t"; dir = 8},/area/shuttle/cryo/station) -"aan" = (/turf/simulated/shuttle/wall{icon_state = "swall15"; dir = 2},/area/shuttle/cryo/station) -"aao" = (/turf/simulated/shuttle/wall{icon_state = "swall_t"; dir = 4},/area/shuttle/cryo/station) -"aap" = (/turf/simulated/shuttle/wall{icon_state = "swall_t"; dir = 2},/area/shuttle/cryo/station) -"aaq" = (/turf/simulated/shuttle/wall{icon_state = "swall_straight"; dir = 1},/area/shuttle/cryo/station) +"aam" = (/turf/space,/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/cryo/station) +"aan" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/cryo/station) +"aao" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/research/station) +"aap" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/mining/station) +"aaq" = (/obj/machinery/cryopod/robot/door/dorms,/turf/simulated/shuttle/floor/white,/area/crew_quarters/sleep/elevator) "aar" = (/obj/structure/cryofeed{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/cryo/station) "aas" = (/obj/machinery/cryopod{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/cryo/station) "aat" = (/obj/effect/landmark{name = "JoinLateCryo"},/obj/machinery/requests_console{department = "Crew Quarters"; pixel_y = 30},/turf/simulated/shuttle/floor,/area/shuttle/cryo/station) @@ -31,10 +31,10 @@ "aaE" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light,/obj/structure/closet/emcloset,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/shuttle/floor,/area/shuttle/cryo/station) "aaF" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/closet/emcloset,/obj/machinery/light,/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/shuttle/floor,/area/shuttle/cryo/station) "aaG" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/shuttle/cryo/station) -"aaH" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/space,/area/shuttle/cryo/station) -"aaI" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/cryo/station) +"aaH" = (/turf/simulated/shuttle/wall/dark,/area/crew_quarters/sleep/elevator) +"aaI" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; invisibility = 60; layer = 1; name = "Blocker"},/turf/simulated/shuttle/floor/white,/area/crew_quarters/sleep/elevator) "aaJ" = (/obj/machinery/door/airlock/external{frequency = 1380; id_tag = "cryostorage_shuttle_hatch"; name = "Cryogenic Storage Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/cryo/station) -"aaK" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/space,/area/shuttle/cryo/station) +"aaK" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; invisibility = 60; layer = 1; name = "Blocker"},/obj/machinery/light,/turf/simulated/shuttle/floor/white,/area/crew_quarters/sleep/elevator) "aaL" = (/obj/machinery/door/airlock/glass{frequency = 1380; id_tag = "cryostorage_shuttle_berth_hatch"; name = "Cryogenic Storage"},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore) "aaM" = (/obj/machinery/door/airlock/glass{name = "Cryogenic Storage"},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_fore) "aaN" = (/turf/simulated/wall,/area/hallway/secondary/civilian_hallway_fore) @@ -108,8 +108,8 @@ "acd" = (/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/maintenance/library) "ace" = (/obj/structure/lattice,/obj/machinery/light/small{dir = 8},/turf/simulated/mineral/floor/ignore_mapgen,/area/hallway/secondary/civilian_hallway_fore) "acf" = (/obj/structure/lattice,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/mineral/floor/ignore_mapgen,/area/hallway/secondary/civilian_hallway_fore) -"acg" = (/turf/simulated/mineral/floor/ignore_mapgen,/turf/simulated/shuttle/wall{icon_state = "swall_c"; dir = 4},/area/shuttle/cryo/station) -"ach" = (/turf/simulated/mineral/floor/ignore_mapgen,/turf/simulated/shuttle/wall{icon_state = "swall_c"; dir = 2; layer = 2},/area/shuttle/cryo/station) +"acg" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/crew_quarters/sleep/elevator) +"ach" = (/obj/structure/table/standard,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera/network/research{c_tag = "SCI - Robotics Starboard"; dir = 8},/obj/item/device/defib_kit/jumper_kit,/obj/item/device/defib_kit/jumper_kit,/turf/simulated/floor/tiled,/area/assembly/robotics) "aci" = (/obj/machinery/lapvend,/turf/simulated/floor/tiled,/area/crew_quarters/locker) "acj" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/inflatable/door,/turf/simulated/floor,/area/maintenance/locker) "ack" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/random/maintenance/cargo,/obj/structure/closet/crate,/obj/random/maintenance/cargo,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/item/weapon/toy/xmas_cracker,/turf/simulated/floor,/area/maintenance/library) @@ -2358,9 +2358,7 @@ "aTr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_two) "aTs" = (/obj/structure/flora/ausbushes/lavendergrass,/turf/simulated/floor/grass,/area/hydroponics/garden) "aTt" = (/obj/item/inflatable/door/torn,/obj/item/weapon/screwdriver,/turf/simulated/floor,/area/maintenance/pool) -"aTu" = (/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/research/station) "aTv" = (/turf/simulated/shuttle/wall{hard_corner = 1},/area/shuttle/mining/station) -"aTw" = (/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/mining/station) "aTx" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "large_escape_pod_2"; pixel_x = 26; pixel_y = -26; tag_door = "large_escape_pod_2_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) "aTy" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/tiled,/area/security/security_equiptment_storage) "aTz" = (/obj/structure/closet/crate,/obj/random/maintenance/cargo,/turf/simulated/shuttle/floor{tag = "icon-floor_yellow"; icon_state = "floor_yellow"},/area/shuttle/mining/station) @@ -5370,7 +5368,6 @@ "bZn" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/security_space_law,/obj/item/device/taperecorder,/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bZo" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bZp" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bZq" = (/obj/structure/table/standard,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera/network/research{c_tag = "SCI - Robotics Starboard"; dir = 8},/turf/simulated/floor/tiled,/area/assembly/robotics) "bZr" = (/obj/structure/table/woodentable,/obj/machinery/computer/skills,/obj/item/weapon/hand_tele,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bZs" = (/obj/machinery/door/window/southright{name = "Captain's Desk Door"; req_access = list(20)},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bZt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos/storage) @@ -6327,8 +6324,6 @@ "crI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/port) "crJ" = (/obj/structure/flora/pottedplant{tag = "icon-plant-01"; icon_state = "plant-01"},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) "crK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/crew_quarters/sleep/elevator) -"crL" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/crew_quarters/sleep/elevator) -"crM" = (/obj/machinery/cryopod/robot/door/dorms,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/crew_quarters/sleep/elevator) "crN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/central_three) "crO" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway) "crP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway) @@ -6380,7 +6375,6 @@ "csJ" = (/obj/structure/table/glass,/obj/machinery/camera/network/northern_star{c_tag = "Hall - Port Primary 5"; dir = 8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/port) "csK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/docking_hallway) "csL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/bar) -"csM" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/crew_quarters/sleep/elevator) "csN" = (/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway2) "csO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/docking_hallway) "csP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway) @@ -6461,7 +6455,6 @@ "cum" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/docking_hallway) "cun" = (/turf/simulated/floor/tiled/dark,/area/crew_quarters/sleep/elevator) "cuo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/crew_quarters/sleep/elevator) -"cup" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/crew_quarters/sleep/elevator) "cuq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/crew_quarters/sleep/elevator) "cur" = (/obj/structure/curtain/open/shower,/obj/machinery/door/window/southright{name = "Shower"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_6) "cus" = (/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) @@ -9939,15 +9932,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadabxaeFaeFaeFabyaeFaeFaeFabyaeFaeFaeFabyaeFaeFaeFabyaeFaeFaeFabyaeFaeFaeFaeFdiMabAabzabCabBabMabFabOabNabQabvaddaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaaSabtaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaacNacNacNacNacNacNacNacNacNacNacNacNacNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadadxaadaaaaadadxaadaaaaadadxaadaaaaadadxaadaaaaadadxaadaaaaadaaaaaaablabmabmabRabVabUabWalqabXadVaddaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaaSacaaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaacNacNacNacNacNacNacNacNacNacNacNacNacNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaadabhacbabiaaaabhacbabiaaaabhacbabiaaaabhacbabiaaaabhacbabiaaaaadaaaaaaaaaaaaaadaccalqalqalqalqabXacdaddaahaahaahaahaahaahaahaahaahaahaahaaeacebkQbkQbkQbkQahybkQbkQacfaaeaahaahaahaahaahaahaahaahaaSabtaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaacNacNacNacNacNacNacNacNacNacNacNacNacNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhacbabiaaaabhacbabiaaaabhacbabiaaaabhacbabiaaaabhacbabiaaaaadaaaaaaaaaaadaadahybeubeubeuaddabXabPaddaahaahaahaahaahaahaahaahaahaahaahaaeahyacgaajaakaajaakaajachahyaaeaahaahaahaahaahaahaahaahaaSacjaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaacNacNacNacNacNacNacNacNacNacNacNacNacNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaabhacbabiaaaabhacbabiaaaabhacbabiaaaabhacbabiaaaabhacbabiaaaacAaaaaaaaadaadadyaddaddaddaddaddaclackaddaddaahaahaahaahaahaahaahaahaahaahaaeahyaamaajaanaajaanaajaaoahyaaeaahaahaahaahaahaahaahaahaaSaPZaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaacNacNacNacNacNacNacNacNacNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadabhacbabiaadabhacbabiaadabhacbabiaadabhacbabiaadabhacbabiaadacAaaaaadaadaaaadMadNadOadPadQadRacnacmacoaddaahaahaahaahaahaahaahaahaahaahaaeacgaapaajaapaajaapaajaapachaaeaahaahaahaahaahaahaahaahaaSabtaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNacNacNacNacNacNacNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOaaaabhacpabiaaaabhacpabiaaaabhacpabiaaaabhacpabiaaaabhacpabiaaaaadaadaadaaaaaaaekadNaelaemaenaeoabXacqacoaddaddaddaddaddaddaahaahaahaahaahaaeaaqaaraasaataauacHaawaaxaaqaaeaahaahaahaahaahaahaahaahaaSabtaaSaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadueaaaaadaaaaaaaaaaadaadaadaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaaaaaaaddaddaddaddaddaddahQabXacraddaddacYadZaeaacsaddaddaahaahaahaahaaeaaqaaraayaazaaAaazaaBaaxaaqaaeaahaahaahaahaahaahaahaahaaSabtabtaaSaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduedueduedueaczacOacAaadaadaadacAaadaadaadaadaaaaaaaaaaadaadaadacOaadaaaaaaaaaaddaifakQakQakQakQakQactakQakQakQakQakQakQakQacvaddaddaahaahaahaaeaaqaaraayaazaaCaazaaBaaxaaqaaeaahaahaahaahaahaahaahaahaaSabtabtabtaaSaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxaiwaeLaeMaeMaeMaeMaeNaeMaeMaeMaeMaeOaePadVacBabQaddaahaahaahaaeaaqaaraayaazaaAaazaaBaaxaaqaaeaahaahaahaahaahaahaahaahaaSaaSabtabtabHaaSaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaacCadCaddaeMafaafbafcafdafeafbaffaeMagHaddaddacEacDaddaahaahaahaaeaaqaaDaaEaaAaaAaaAaaFaaGaaqaaeaahaahaahaahaahaahaahaahaahaaSabtabtabIaiZaiZaiZaiZaiZaiZaahaahaahaahaahahyaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyaaaacyacyacyacyacyaaaacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFacGaeMafoafcafpafqafrafsaftaftafuaeMaahaddaddacGaddaahaahaahaaeaaHaaIaajaaJaaJaaJaajaaIaaKaaeaahaahaahaahaahaahaahaahaaSaaSadfaaSaiZaiZajHajrajsajsaiZahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhacbabiaaaabhacbabiaaaabhacbabiaaaabhacbabiaaaabhacbabiaaaaadaaaaaaaaaaadaadahybeubeubeuaddabXabPaddaahaahaahaahaahaahaahaahaahaahaahaaeahyaajaajaajaajaajaajaajahyaaeaahaahaahaahaahaahaahaahaaSacjaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaacNacNacNacNacNacNacNacNacNacNacNacNacNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaabhacbabiaaaabhacbabiaaaabhacbabiaaaabhacbabiaaaabhacbabiaaaacAaaaaaaaadaadadyaddaddaddaddaddaclackaddaddaahaahaahaahaahaahaahaahaahaahaaeahyaajaajaajaajaajaajaajahyaaeaahaahaahaahaahaahaahaahaaSaPZaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaacNacNacNacNacNacNacNacNacNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadabhacbabiaadabhacbabiaadabhacbabiaadabhacbabiaadabhacbabiaadacAaaaaadaadaaaadMadNadOadPadQadRacnacmacoaddaahaahaahaahaahaahaahaahaahaahaaeaajaajaajaajaajaajaajaajaajaaeaahaahaahaahaahaahaahaahaaSabtaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNacNacNacNacNacNacNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOaaaabhacpabiaaaabhacpabiaaaabhacpabiaaaabhacpabiaaaabhacpabiaaaaadaadaadaaaaaaaekadNaelaemaenaeoabXacqacoaddaddaddaddaddaddaahaahaahaahaahaaeaajaaraasaataauacHaawaaxaajaaeaahaahaahaahaahaahaahaahaaSabtaaSaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadueaaaaadaaaaaaaaaaadaadaadaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaaaaaaaddaddaddaddaddaddahQabXacraddaddacYadZaeaacsaddaddaahaahaahaahaaeaajaaraayaazaaAaazaaBaaxaajaaeaahaahaahaahaahaahaahaahaaSabtabtaaSaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduedueduedueaczacOacAaadaadaadacAaadaadaadaadaaaaaaaaaaadaadaadacOaadaaaaaaaaaaddaifakQakQakQakQakQactakQakQakQakQakQakQakQacvaddaddaahaahaahaaeaajaaraayaazaaCaazaaBaaxaajaaeaahaahaahaahaahaahaahaahaaSabtabtabtaaSaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxaiwaeLaeMaeMaeMaeMaeNaeMaeMaeMaeMaeOaePadVacBabQaddaahaahaahaaeaajaaraayaazaaAaazaaBaaxaajaaeaahaahaahaahaahaahaahaahaaSaaSabtabtabHaaSaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaacCadCaddaeMafaafbafcafdafeafbaffaeMagHaddaddacEacDaddaahaahaahaaeaajaaDaaEaaAaaAaaAaaFaaGaajaaeaahaahaahaahaahaahaahaahaahaaSabtabtabIaiZaiZaiZaiZaiZaiZaahaahaahaahaahahyaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyaaaacyacyacyacyacyaaaacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFacGaeMafoafcafpafqafrafsaftaftafuaeMaahaddaddacGaddaahaahaahaaeaakaamaajaaJaaJaaJaajaamaanaaeaahaahaahaahaahaahaahaahaaSaaSadfaaSaiZaiZajHajrajsajsaiZahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacyacyacyacyacyaaaacyacyacyacyacyaaaacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddacIaeMafFafGafHafIafJafKafLafMafNaeMaahaahaddacIaddaahaahaahaaeaaeaaeaaeaaLaaMaaMaaeaaeaaeaaeaahaaSaaSaaSaaSaaSaaSaaSaaSadgabtaiXaiZajWajHajHajsajsaiZahyahyaaaahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddacKaddacLaeMafSafTafUafVafWafXafYafcafZaeMaahaahaddacLaddaddaddaahaahaahaahaaNaaOaaPaaPaaNaahaahaahaaSaaSabtabtabtacMabtabtabtabtabtajFakAajWajHakhaiZaiZaiZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddaddakNakOakRaeMafcafcagkaglaglaglagmafcafcaeMaahaahaddaiwacQacPaddaddaddaddaddaaeaaRaaRaaRaaNaaSaaSaaSaaSabtabtakAakAakAakAakAakAakAabtakCakAacRakEajHakFakGakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10008,13 +10001,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahbpjbpobpjbimbimbimbimbimbimbimbimbdPbhkbhlbhkbdPbhmbfubhnbhobhobhobhoaahaahaahahyahyahyahyahyahyahyahyaZycrkbajbhqbhrbhsbefbhtbgvbgwbhubefaahaahaahaahbdlbhvbhybhxblrbhwbeTbhvbdlaahaahaahaZdaZGaZHaZdahybdqbaUdCFbbGbbGbbGbbGdCGbnZboGboGboGbosdCFbbGbbGbbGbhBbbGbhCbhDbhEbhFbhGbetaUwbhHaToaahbeZbhIbhJbgNbhKbhLbhLbhLbhLbhMbhNbgVbhObhPbgYbhQbhRbhSdinbgYbhUbhVbhVbhWbgZbhXbhYbhYbhZbhZbhYbaObhfbibbicdlrbiebhfbdOaZWaZmaahaahaahaahaahbgmbifbigbihbiibijbikbifbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahbpjbpjbpodmIbilbjybjzbjAbjBbjCbjDbjEbilbjFbinbiobipbeEbfubinbhobiqbirbhobhobhoaahaahahyahyahyahyahyahyahybambisaZzbitbiubdebivbiwbixbgwbhubefaahaahaahaahbdlbiyblsbizbiAbiBbltbiCbdlaahaahaahaZdbiDaZHaZdahybejbdrdCFbbGbbGbbGbbGdCGboNboGbjZboGbpGdCFbbGbbGbbGbiIbiJbiJbiKbiLbiMbiNbiObiPbiQaToaahbeZbfTbiRbiSbeZbiTbiUblObiWbxjbfhbzjbhObiYbgYdlQbjabjbbjcbgYbSjbjebjfbjgbgZbjhbjibjjdmFbkubjmbjnbhfbibbjobjpbjqbhfbjrbjsaZmaahaahaahaahaahbgmbjtbjubjvbjwbjvbjubjxbgmaahaahbgmbgmbgmbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaabkObkPbkQbkQbkSbkPbkOaahaahaahaahaahaahbpjbqSbpobqUbilbkTbkUbkVbkWbkXbkYbkZblabkRbjGbjHbjIbjJbjKbjLbhobjMbjNbjObjPbhoaahaahaahahyahyahyahyahyahybaibjQbjRbjSbhrbecbjTbjUbjVbgwbhubefaahaahaahaahbjWbjWbjWbjWbjXbjWbjWbjWbjWaahaahaahaZdbjYaZHaZdahybcybaUdCFbbGbbGbbGbbGdCGbrAboGboGboGbrDdCFbbGbbGbbGbkbbbGbbGbkcaZibkdaYGbetaUwbkeaToaahbeZaEqbkgblRbeZbfhbfhbfhbfhbkibfhbALbkkbklbgYbkmbknbkobkpbgYbkqbkrbksbktbgZblAbkvbkwdmPdmLbkzbkAbkBbkCbkDbaPbkFbhfbdObkGaZmaahaahbgmbgmbgmbgmbkHbkIbkHbkJbkHbkKbkHbgmbgmbgmbgmbkLbkMbkNbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkPaSWbmoaTubmoaSWbkPahyaahaahbkPbkPbkPblbbqVbpobpobilbmrbmsbjAbmtbmubmvbmwbilblcbdRbldbleblfblgblhbhoblibljblkblkbhobllbllbllbllahyahyahyahyahybbobboblmblnblobeebefblpbjVbgwblqbefaahaahaahbjWbjWbjWbjWbopblvbopbjWbjWbjWbjWaahaahaZdaZdaZHaZdahyaZIblydCwbeqbbGblzbbGbbGdCrbrAbsEbrDbfMbbGbbGblzbbGblBdCHdCIaZIaZfaToaZjblDaZlaToaToaahbeZblEblFblGbeZblIbnablJbIxblLblMblNbhOblWbgYbgYblPblQbpabgYblSblTblUblVbgZbrKbhZbhYblXbhYbhYbaQbhfbjpbmabhfbmbbhfdnIaZWaZmaahbgmbgmbifbmdbkHbmebmfbmgbmhbmibmfbmgbmjbkJbmkbmlbmibmmbmgbmnbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkPaSWbmoaaobmoaSWbkPahyaahaahbkPbkPbkPblbbqVbpobpobilbmrbmsbjAbmtbmubmvbmwbilblcbdRbldbleblfblgblhbhoblibljblkblkbhobllbllbllbllahyahyahyahyahybbobboblmblnblobeebefblpbjVbgwblqbefaahaahaahbjWbjWbjWbjWbopblvbopbjWbjWbjWbjWaahaahaZdaZdaZHaZdahyaZIblydCwbeqbbGblzbbGbbGdCrbrAbsEbrDbfMbbGbbGblzbbGblBdCHdCIaZIaZfaToaZjblDaZlaToaToaahbeZblEblFblGbeZblIbnablJbIxblLblMblNbhOblWbgYbgYblPblQbpabgYblSblTblUblVbgZbrKbhZbhYblXbhYbhYbaQbhfbjpbmabhfbmbbhfdnIaZWaZmaahbgmbgmbifbmdbkHbmebmfbmgbmhbmibmfbmgbmjbkJbmkbmlbmibmmbmgbmnbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnObmobnQbnRbnRbmobnSbnTbkPbkPbkPbnUbnVbkPbkPbsybkPbilbilbilbilbilbilbilbilbilbmxbfubmybdTbrebdTbrebhoblibmAbmBbmCblkbmDbmEbmFbllbmGbmHbmIbllahyahyaZyaZzbcnbhrbeebmJbmKbmLbmMbefbefaahaahaahbjWbjWblwbmNblxbpHbmObmSbmRbjWbjWaahaahaahaZdaZHaZdahyaZIbmTblCbbJbbGbfPbfQbmUbbGbdCbdCbdCbbGbmUbeVbfNbbGbbGdCKbmVaZIahyaZPaYGaYHaUwaToaahaahbeZbmWbmXbmYbmZbUDbnbbncbncbndbnebnfbngbnhbnibgYbnjbnkbnlbgYbnmbnnbnobnpbgZbnqbnrcXObnsbhYbntbnubhfbnvbnwbhfbnxbhfdnJaZWaZmaahbgmbnzbnAbnBbnCbnDbnEbnDbnFbnDbnGbihbnHbkJbnIbnJbnKbnLbihbnMaFMbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkQaTubpbbpcbpcaTubpdbpebpfbpgbNxbLLbRubOUbUHbRvbUMbUIbWrbWqbWsbprbpsbprbptbnWbpvbpwbpubdTbpybnYbrfblkblkaybbobbocblkbodboeboebofbogbohboibllahyahybamaZzbcnbojbeebmKbmKbokbolbefaahaahaahbjWbjWbpJbombpLbmPbvMbmPborboqbrxbjWbjWaahaahaZdaZHaZdahybdqbiHdCBbfRbbGbbGbfPbfQbbGbbGbbGbbGbbGbembeWbbGbbGbbGbekbdxbdqahybaNbbObotbouaToaahaahbeZbgLbovbgNbowboxboybozboAboBboCbgVbhOboDdnKbgYboFbsDboFbgYboHboIbTzboKbgZbgkboLboMbtWboLboMboOboOboOboOboOboOboOboOaZWaZmaahbgmboPboQboRbkHboSbmfanuboUboVboWbmmbmgbkHbmibmmboXboYboSboZbuPbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkQaaobpbbpcbpcaaobpdbpebpfbpgbNxbLLbRubOUbUHbRvbUMbUIbWrbWqbWsbprbpsbprbptbnWbpvbpwbpubdTbpybnYbrfblkblkaybbobbocblkbodboeboebofbogbohboibllahyahybamaZzbcnbojbeebmKbmKbokbolbefaahaahaahbjWbjWbpJbombpLbmPbvMbmPborboqbrxbjWbjWaahaahaZdaZHaZdahybdqbiHdCBbfRbbGbbGbfPbfQbbGbbGbbGbbGbbGbembeWbbGbbGbbGbekbdxbdqahybaNbbObotbouaToaahaahbeZbgLbovbgNbowboxboybozboAboBboCbgVbhOboDdnKbgYboFbsDboFbgYboHboIbTzboKbgZbgkboLboMbtWboLboMboOboOboOboOboOboOboOboOaZWaZmaahbgmboPboQboRbkHboSbmfanuboUboVboWbmmbmgbkHbmibmmboXboYboSboZbuPbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpxbkQbmobqJbpcbpcbqKbqLbqMbqNbqObqPbWubXYbWwbXZbqTbYbbYabqWbqXbYcbqYbqZbrabrbbrcbrdbgqbinbMKbpzbpzbpzbpAblkblkbpBblkblkbpCbpDbpEbpEbpEbpFbwZbllahyahybamaZzbcnbfBbeebefbefbefbefbefaahaahaahbjWbjWbrybukbonbpIbpIbpIbonbukbrzbjWbjWaahaahaZdaZHaZdahybejbiHdCDdCLbbGbelbbGbfPbenbbGbbGbbGbeobeWbbGbelbbGdCHdCMbdxbejahybbNaYGaYHaUwbpPahyaahbeZbpQbpRbgNbpSbpTbpUbpVbpVbpWbpXbpYbpZbqabqabqbbqcbqdbqcbqebqcbqfbqgbqhbqibqjbqkbqhbqlbqmbqnboObqoaCqbqqbqrbqsbqtboOaZWaZmaahbgmbqubqvbqwbkJbqxbqybqzbgmbqAbqBbqCbqCbqDbsnbqCbqEbqFbqGboZaycbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaacAacOacAacAacAacAacAacAacAacOacAacAacAacOacAacAacAacAaaaaaaacAacAacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqIaadahybkQaTudnLbpcbpcaTubsubsvbswbsxbYdbszbsAbkPbkPbsybkPbkPbkPbkPbkPbkPbkPbkPbkPbdTblcbfubinbMNburbrgbpzbrhbrebribrjbrkbrlbrmbrnbrobrpbrqbrrbrsbllahyahybambrtbrubrvaZyahyahyahyahyahyahyaahaahbjWbsQbsRbukbonbpKbsSbpKbonbukbxbbsTbjWaahaahaZdaZHaZdahybcyaTsbrBdCDdCLbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGdCHdCCbrCbdBbcyahyaTobrEaYHbrFbrGahyahybeZbfTblFbrHbeZbrIbrJbvUbrLbEEblMbrNbrObrPbrQbrRbrSbrTbrSbrSbrSbrUbrVbrWbrXbrYbrZbrYbsabrYbrYbsbbscaCrbsebsfbsgbsgboOaZWaZmaahbgmboPbshboRbkHbmibsibsjbskbslbmmbmmbsmbkHbuYbmmbsobspbmiboZbsqbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaacAacOacAacAacAacAacAacAacAacOacAacAacAacOacAacAacAacAaaaaaaacAacAacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqIaadahybkQaaodnLbpcbpcaaobsubsvbswbsxbYdbszbsAbkPbkPbsybkPbkPbkPbkPbkPbkPbkPbkPbkPbdTblcbfubinbMNburbrgbpzbrhbrebribrjbrkbrlbrmbrnbrobrpbrqbrrbrsbllahyahybambrtbrubrvaZyahyahyahyahyahyahyaahaahbjWbsQbsRbukbonbpKbsSbpKbonbukbxbbsTbjWaahaahaZdaZHaZdahybcyaTsbrBdCDdCLbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGdCHdCCbrCbdBbcyahyaTobrEaYHbrFbrGahyahybeZbfTblFbrHbeZbrIbrJbvUbrLbEEblMbrNbrObrPbrQbrRbrSbrTbrSbrSbrSbrUbrVbrWbrXbrYbrZbrYbsabrYbrYbsbbscaCrbsebsfbsgbsgboOaZWaZmaahbgmboPbshboRbkHbmibsibsjbskbslbmmbmmbsmbkHbuYbmmbsobspbmiboZbsqbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaacAaaaaadaaaaaaaaaaaaaadaadaaaaaaaadaadaaaaadaadaadaaaaadaadaadaaaacAaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsrahyahybssbmobnQbtPbtQbmobtRbnTbkPbkPbkPbtSbnTbkPbYhbEUdnMbsBaahbtTdIGbtVdIIdIHdIKdIJdILbfubsCbdTbuubutbsFbsFbsGbsHbsIbsJbrlbsKbrnbsLbsMbsNbrrbsObsPahyahybamaZzbcnbhrbamahyahyahyahyahyahyaahaahbjWbjWbrybukbRVbpIbTDbpIbonbukbrzbjWbjWaahaahaZdaZHaZdahyaZIbdqbbEbsVdCDdCLbbIbbJbbKbbGbbGbbGbbIbbJbbKdCHdCCbrCbbEbdqaZIahyaZPaYGbetaUwbrGahyahybeZbeZbsWbeZbeZblMblMblMbsXbsXbsXbsXbsYbsZbsXbsXbtabtbbtcbtdbtdbtebtfbtbbtgbthbtibtjbtkawrbtmboObtnaCsaCuaCtaCuaDwboOaZWaZmaahbgmbtsbttbnBbtubnDbtvbnDbtwbmmbtxbmmbtybkJbyTbijbtzbtAbtBbtCbtDbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaacAaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaaacAaadaadaaaaaaaaaaaaaaaaaabtHbtIbtJbtKaaaaaabtLbtMbtNbtLbtLbtOaSWbmoaTubmoaSWbkPahyahyahyahyahyahybtHdobbYebZebsBaahbtTdINdIMdIPdIOdIRdIQdITdISdIUbMKbuvbtXbtYbpzbtZbeEbuabubbucbudbuebufbufbufbugbuhbuiahyahybamaZzbcnbhrbamahyahyahyahyahyaahaahaahbjWbjWbVfbpMboobpIbpIbpIbqHbpNcgdbjWbjWaahaahaZdaZHaZdahyahybbMbaMbbEbsVdCDdCNbzTdCOdCzdCzdCzdCNbvodCOdCCbrCbbEbaybbDahyahybaNbdubdvbunbrGahyahybuobvCbuqbwSbusbxdbyibxfbsXbuwbuxbuybuzayjaykbuCbuDbuEbuFbuGbuHbuIbtfbHXbuKbuLbuMbuNbuObuLbuNboObwxbuQbuRbuSbuTbuUboOaZWaZmaahbgmbgmbifbuVbkHboSbuWbmmbmfbmmbmmbtCbuXbkJbCQbwubuZbvabsmbvbbgmbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaacAaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaaacAaadaadaaaaaaaaaaaaaaaaaabtHbtIbtJbtKaaaaaabtLbtMbtNbtLbtLbtOaSWbmoaaobmoaSWbkPahyahyahyahyahyahybtHdobbYebZebsBaahbtTdINdIMdIPdIOdIRdIQdITdISdIUbMKbuvbtXbtYbpzbtZbeEbuabubbucbudbuebufbufbufbugbuhbuiahyahybamaZzbcnbhrbamahyahyahyahyahyaahaahaahbjWbjWbVfbpMboobpIbpIbpIbqHbpNcgdbjWbjWaahaahaZdaZHaZdahyahybbMbaMbbEbsVdCDdCNbzTdCOdCzdCzdCzdCNbvodCOdCCbrCbbEbaybbDahyahybaNbdubdvbunbrGahyahybuobvCbuqbwSbusbxdbyibxfbsXbuwbuxbuybuzayjaykbuCbuDbuEbuFbuGbuHbuIbtfbHXbuKbuLbuMbuNbuObuLbuNboObwxbuQbuRbuSbuTbuUboOaZWaZmaahbgmbgmbifbuVbkHboSbuWbmmbmfbmmbmmbtCbuXbkJbCQbwubuZbvabsmbvbbgmbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaacAaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadacOaaaaadaadaaaaaaaaaaaaaaabtHbtHbvdbvebtHbvfbvgbvhawxbvjbvkbkPbkPbkQbkQbkSbkPbkPdELdELahyahyahyahybtHbtHbYedoobsBaahbtTdIWdIVdIYdIXdIZdIJbvlbvmbvnbMNbykbvpbvqbvrbMKbvsbvtbvubvvbvwbvxbvybvzbvAbvBbDKbllahyahybaiaZzbMObhrbaiahyahyahyaahaahaahaahaahaahbjWbjWbrwbpMckQbZfclHcqpbrMbjWbjWaahaahaahaZdaZHaZdahyahyahybbMaZLbaJbgEbgEbvGbvHbiEbhzbiEbvKbvLbgEbgEbiGaZJbbDahyahyahybbNaYGbRLaUwbvNahyahybvObFrbuqbvQbGZbvSbvTcqsbsXanvbvWbvXbvYbvYbvZbwabwbbwcbwdbwebwebwfbwgbQwbwibwjbwkbwlbwmbwnbwoboObwpbwqbwrbtqbwsbwtboOaZWaZmaahaahbgmbgmbgmbgmbAQbwvbwwbmfbyUbwybwzbkJbkJbGRbkJbwAbwBbwCbgmbgmaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaadaadaaaaaaaaaaaabtHbwDbwEbwFbtHbwGbwHbwIbwJbwKbwLdJadELahyahyahyahydELdELahyahyahyahyahyahybtHbYebsBbwMbwMbwMbwMbwMbwMbwMbwMbwMbwNbwObwPbdTbHDbwRbKGbwTbMNbwUbuabsCbucbwVbwWbwXbllbwYbKJbwYbllahybeebeeblmblnblobboahyahyaahaahaahaahaahaahaahbjWbjWbjWcuwcuvbZgcuHcvCbjWbjWbjWaahaahaZdaZdaZHaZdaZdahyahyahyaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIahyahyahyahyaToaZjblDaZlaToaToahybxcbKKbxebvSbLZbxgbxhbxibsXanAbxkbxlbxmbvYbvYbxnbqhbxpbxqbthbthbxrbtfbxsbxtbxubxvbxwbxxbADbvRboOboOboOboObxAboOboOboOaZWaZmaahaahaahaahaahbgmbxBbxCbkJbxDbkJbxBbxEbkJbxFbxGbkJbxHbxIbkJbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaadaadaaaaaaaaabtHbxJbxKbxLbtHdDfbxMbxNbxObxPbxQbtLaahaahaahahyahyahyahyahyahyahyahyaahaahbtHbEUbwMbwMbxRbxSbxTbxUbxVbxWbxXbwMbxYbxZbyabdTbybbycbydbyebdTbyfbuabygbyhbyhbyhbyhbyhbMHbyjbNtbyhbfzbeebylaZzbcnbymbboaZdaahaahaahaahaahaahaahaahaahbjWbjWbjWbvDbjWbjWbjWbjWbjWaahaahaZdaZdaZGaZHaZGaZdaZdahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaZdaToaYGbynbiPbyoaTobypbyqbyrbysbytbyubyvbywbyxbyybyzbyAbyBbyCbvYbxobsXbyEbtbbyFbyGbyHbyIbyJbyKbyLbyMbyNbxybyPbyQbyRbyScbIbCLbyVbyWbyXbyYbySaZWaZmaahaahaahaahaahbgmbyZbzabzbbzcbzdbzebzfbzgbzhbzibkJdkQbzkbzlbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10026,11 +10019,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaaadaaaaaaaaaaahaahaahaahaahaahaahaahbtHbtHbtHbtHbtHddpbIhbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahbtHbEUbwMbIjbGJbGIbGJbGJbGJbGJbIkbwMbIlbfubImbInbIobIpbIqbIrbFibItbIAbIybIubIubIwbIubJXbJWbIzbJYbKcahyahybIBbecbRQbecbICbHcbIDbFObIFbIFbIGbIHbIIbIJbFuaxjaxibIMbHjbINbIObIPbHjaahaahaahaahaZdaZGbfobfkbgjbcNbJabJabJabJabJabhbbiVbiablubkEblYbEgbmzblZbvEbupbHobvJbEgaahahybJeaUvbRSaUvbpPahyahybuobFrbvSbvSbJfbJgbvSbvSbJhbJibJjbJkbxqbJlbJmbJnbthbJobJpbJqbKLbJsbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEbJFbJGbJHbJIbySbglbfpaZmaahaahaahaahaahaahbgmbgmbLDbJKbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaacAaaaaaaaahaahahyahyahyahyahyahyahyahyaahaahaahbtHbtHdqbbIibtHaahaahaahaahaahaahaahaahaahaahaahaahbtHbtHbEUbwMbJMbGJbJNbJObGJbGJbGJbIkbwMbJPbtUbJQbJRbJSbIdbJUbJVbFibGYbKabJZbIubIubIubIubKbbIubIubLzboTahyahybKdbecbcnbecbKebHcbIEbKgbKhbKibKjbKhbKhbKkbFubKlbILbKmbHjbKnbKobKpbHjaahaahaahaahaZdbKqbYpbEjbAhbKBbJabJabJabJabJabCebCgbCfbFJbChaylbEgbEgbEgbEgbCibEgbEgbEgahyahybrGbCjbynbKFbrGahyahybvObVabKHbKHbKIbWHbXTbWNbKNbKNbKObKPbKQbKRbKNbKSbKTbKUbKVbKSbKWbKWbKWbKWbKWbKXbKYbKZbLabySbySbySbySbySbySbySbySbySbySbLbbLcaZmbLdbLebLebLebLdbLdbLfbLgbLhbLibLfbLdaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadbtEbGAbtGaadbtEbGAbtGaadbtEbGAbtGaadbtEbGAbtGaadbtEbGAbtGaadacAaaabLjaahbLkbLkbLlbkQbkQbkQbLmbLkbLkahyaahaahaahbtHbLnbIibtHaahaahaahaahaahaahaahaahaahaahaahaahbtHdqcbEUbwMbLobLpbLqbGJbLrbGJbLsbwMbwMbLtbfubImbFibLubLvbLwbLxbLybGYbLCbLBbIvbIubIubIubKbbIvbIubLEboTahyahybKdbLGbhqbecbKebHcbKubLIbKhbLJbLKbLMbZjbLNbLObLPbLQbLRbLSbLTbLUbLVbHjaahaahaahaahaZdaZdbYpbEjbCkbKBbKBbMhbEibEhbEhbFpbMibJdbFEbChbFJbFFbFHbFGbFNbFMbFPaLTbFRahyahybvNccdbgJaUvbvNahyahybMkbMlbMmbYmbOcbMkbMkbMkbMkdqdbMqbMrbMsbMtbMsbKSbMubMvbMwbMxbKWbMybMzbMAbMBbMCbMDbMEbMFbMGbOdbMIbMJbRXbMLbMMdFecbabUSbMQbMRbMSbMTbMUbMVbMWbMXbMYbMZbNabNbbNabNcbLdaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaaaadaadbLjaahbLkaTvbNeaTwbNeaTwbNeaTvbLkahyahyaahaahbtHdqebIibtHbtHaahaahaahaahaahaahaahaahaahaahaahbtHcapbEUbwMbwMbwMbwMbwMbwMbwMbwMbwMbNibNjbfubyfbGMbNkbNlbNmbLxbNnbGYbPkbNsbRfbPnaxraxUbRibRfbRkbRjbLFahyahybKdbecbDMbDNbKebYvbFubNubKhbNvbNwcaqbPsbNybFubNzbNAaGUbNCbNCbNCbNCbNCbNCbNCbNCaahaahaZdbYpbEjbHpbHnbHtbHrbHvbHubHwbNNbHxbKDbHzbHybHBbHAbISbIRbIVbITbFJbIWbIXahyahyaTobIYbetbYwaToahyahybMkbNVbNWbNXbNYbSkbUXbMnbModqPbMqbMrbOebOfbOgbKSbOhbOibOjbOkbKWbOlbOmbOnbOobOpbOqbOrbOsbOtbOtbOubOvbOqbOtbOwbOtbOxbOybOzbOAbOBbOCbODbOEbOEbOFbOEbOGbOHbOIbOJbOKbLdaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaaaadaadbLjaahbLkaTvbNeaapbNeaapbNeaTvbLkahyahyaahaahbtHdqebIibtHbtHaahaahaahaahaahaahaahaahaahaahaahbtHcapbEUbwMbwMbwMbwMbwMbwMbwMbwMbwMbNibNjbfubyfbGMbNkbNlbNmbLxbNnbGYbPkbNsbRfbPnaxraxUbRibRfbRkbRjbLFahyahybKdbecbDMbDNbKebYvbFubNubKhbNvbNwcaqbPsbNybFubNzbNAaGUbNCbNCbNCbNCbNCbNCbNCbNCaahaahaZdbYpbEjbHpbHnbHtbHrbHvbHubHwbNNbHxbKDbHzbHybHBbHAbISbIRbIVbITbFJbIWbIXahyahyaTobIYbetbYwaToahyahybMkbNVbNWbNXbNYbSkbUXbMnbModqPbMqbMrbOebOfbOgbKSbOhbOibOjbOkbKWbOlbOmbOnbOobOpbOqbOrbOsbOtbOtbOubOvbOqbOtbOwbOtbOxbOybOzbOAbOBbOCbODbOEbOEbOFbOEbOGbOHbOIbOJbOKbLdaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaaaaadaadaadaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaahaahaahbNeaTzbONbOObOPbOQbNebORahyahyaahaahbtHbOSbIibOTbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHcbKbOVbOWbOXbOYbOZbzHbPabPbbPcbPdbPebPfbPgbImbInbIobPhbPibLxbPjbGYbSRbSQbSSbNqbNqbNrbNpbSSbRlbSTbGYahyahybKdbecbcnbecbPobHcbFubPpbKhbPqbPrbKhbPsbPtbFubPubPvbPwbNCbPxbPybPzbPAbNCbPBbNCbNCaahaZdbYpbEjbEjbEjbEjbEjbEjbEjbPMbIZbJcbJbbHzbFJbKrbKfbKtbKsbKxbKwbFJbKybIXahyahyaToaUvbetaUvaToaToahybMkbPQbPRbPSbPTbPUbPVbPWbPXbPYbPZbQabQbbQcbQdbKSbQebQfbQgbQhbKWbQibQjbQkbMBbQlbQmbQnbQobQpbQqbQrbQsbQtbQpbQubQvdGRbMPbMQbQxbQybQzbMUbMVbWWbQBbOJanDbQDbQEbOJcAfbLdaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaczaczacOacAaadaadaadacAaadaadaadaadaaaaaaaaaaadaadaadacOaadaaaaahaahaahaTwaTAbQGbQHbQHbQIaTwahyahyahyaahaahbtHbQJbQKbQLbQLbQLcbNbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbQYbQZbyfbJRbRabRbbRcbRdbRebGYbNobNpbNpbNpbNpbNpbNpbNpbRlbSUbGYahyahybKdbecbcnbRmbRnbRobRpbRqbRrbRsbRtcvjcoFbRwbFubRxbPvbRybNCbRzbRAbRBbRBbRCbRDbREbNCaahaZdbYpaZGcOUdBSbKCbKAbKEcrQctecMXbLWbEjbEgbLXbMabLYbHsbMdbMebKvbFJbRJbMbahyahybJeaUvbetaUvbvFaToahybMkbRYbRZbSabNWbSbbScbSdbSebSfbSgbShbSibMpbvIbKSbXibQfbSlbSmbKWbKWbKWbKWbKWbSnbSobSpbSpbSpbSpbSpbSqbSrbSqbSqbSqbSqbSqbSsbStbSubSvbSwbSwbSwbLdbLdbSxbSycNtbSxbLdbLdaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbNeaTVbQGbQHbQHbSBbNebORahyahyaahaahbtHdrdbIibSDbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbSEbSEbSFbSGbSEbSHbSIbSJbSKbSLbSMbSNbSObSPbSLbSLbSLbSLbSLbGYdGObPlbPmbNpbNpbSzcpCcpubRlbZqbGYahyahybKdbecbcnbSVbbobbobFubFubFubFubFubSWbFubFubFubSXbSYbSZbNCbTabTbaAIbTdbNCbTebTfbNCaahaZdbMfbCdcNKbMgbNDbMjbNEcrQbNHbNGbNKbNJbEgbFLbNLbEgbThbTibTibTibTibEgbEgahyahybrGaUvbTqbTrbTsaToahybMkbGxbTubTvbTubTtbScbTxbTybVhbTAbTBbTCcCjbTEbKSbTFbTGbTHbTIbTJbTKbTLbTMbTNbTObTPbTQbTRbTSbTTbSpbTUbTVbTWbOabTXdrebSqbUabUbbSubUcbUdbUebSuaahaahbSxbUfbUgbSxaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkaTvbNeaTwbUhaTwbNeaTvbLkahyahyaahaahbtHbtHbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbUibUjbUkbUlbSEbUmbUnbUnbUobUpbUqbUrbUsbUtbUubUvbUwbUxbGYbXUbRgbYYbNpbNpdGQbRgcGibRlcGQbGYahyahybKdbecbcnaZzbUFahybUGcbJbZxbUJbUKbULcVLbLHbUGbUNbUObUPbNCbNCbIKbNCbNCbNCbNCbNCbNCaahaZdbYpaZGcrQbNMbNPbNOcQAcrQbNQcPbbNRbUZbNSccVbNTbUVbUWbUWbUWbUWbOMcaCbZyahyahybrGaUvbetaUvbvPaToahybMkbVibVjbVkbVlbVmbVnbVobVpbVqbVrbVsbMpcCMcDxbKSbKSbKSbKSbKSbTJbVtbVubVvbVwbVxbVybVzbVAbVBbVCbSpbVDbVEbVFbVGbVGbVHbSqbVIbVJbSubVKbVLbVMbSuaahaahbSxbVNcAhbSxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaczaczacOacAaadaadaadacAaadaadaadaadaaaaaaaaaaadaadaadacOaadaaaaahaahaahaapaTAbQGbQHbQHbQIaapahyahyahyaahaahbtHbQJbQKbQLbQLbQLcbNbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbQYbQZbyfbJRbRabRbbRcbRdbRebGYbNobNpbNpbNpbNpbNpbNpbNpbRlbSUbGYahyahybKdbecbcnbRmbRnbRobRpbRqbRrbRsbRtcvjcoFbRwbFubRxbPvbRybNCbRzbRAbRBbRBbRCbRDbREbNCaahaZdbYpaZGcOUdBSbKCbKAbKEcrQctecMXbLWbEjbEgbLXbMabLYbHsbMdbMebKvbFJbRJbMbahyahybJeaUvbetaUvbvFaToahybMkbRYbRZbSabNWbSbbScbSdbSebSfbSgbShbSibMpbvIbKSbXibQfbSlbSmbKWbKWbKWbKWbKWbSnbSobSpbSpbSpbSpbSpbSqbSrbSqbSqbSqbSqbSqbSsbStbSubSvbSwbSwbSwbLdbLdbSxbSycNtbSxbLdbLdaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbNeaTVbQGbQHbQHbSBbNebORahyahyaahaahbtHdrdbIibSDbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbSEbSEbSFbSGbSEbSHbSIbSJbSKbSLbSMbSNbSObSPbSLbSLbSLbSLbSLbGYdGObPlbPmbNpbNpbSzcpCcpubRlachbGYahyahybKdbecbcnbSVbbobbobFubFubFubFubFubSWbFubFubFubSXbSYbSZbNCbTabTbaAIbTdbNCbTebTfbNCaahaZdbMfbCdcNKbMgbNDbMjbNEcrQbNHbNGbNKbNJbEgbFLbNLbEgbThbTibTibTibTibEgbEgahyahybrGaUvbTqbTrbTsaToahybMkbGxbTubTvbTubTtbScbTxbTybVhbTAbTBbTCcCjbTEbKSbTFbTGbTHbTIbTJbTKbTLbTMbTNbTObTPbTQbTRbTSbTTbSpbTUbTVbTWbOabTXdrebSqbUabUbbSubUcbUdbUebSuaahaahbSxbUfbUgbSxaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkaTvbNeaapbUhaapbNeaTvbLkahyahyaahaahbtHbtHbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbUibUjbUkbUlbSEbUmbUnbUnbUobUpbUqbUrbUsbUtbUubUvbUwbUxbGYbXUbRgbYYbNpbNpdGQbRgcGibRlcGQbGYahyahybKdbecbcnaZzbUFahybUGcbJbZxbUJbUKbULcVLbLHbUGbUNbUObUPbNCbNCbIKbNCbNCbNCbNCbNCbNCaahaZdbYpaZGcrQbNMbNPbNOcQAcrQbNQcPbbNRbUZbNSccVbNTbUVbUWbUWbUWbUWbOMcaCbZyahyahybrGaUvbetaUvbvPaToahybMkbVibVjbVkbVlbVmbVnbVobVpbVqbVrbVsbMpcCMcDxbKSbKSbKSbKSbKSbTJbVtbVubVvbVwbVxbVybVzbVAbVBbVCbSpbVDbVEbVFbVGbVGbVHbSqbVIbVJbSubVKbVLbVMbSuaahaahbSxbVNcAhbSxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbLlbVPbVQbVRbVSbVTbLmbLkahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbVUbVVbVWbVXbVYbVZbWabWbbWcbWdbWebWfbWgbWhbWibWibWjbWkbUEcNkcIgcNkdHrdHrcNkdHscNkdHtcNkbUEahyahybKdbWobcnaZzbamahybWpcascZicZjcasbULbULcZvbYfbYgdaybUPbWxbWybWzbWAbWBbWCbWDbWEbNCaahaZdbYpbPCcrQcrQcrQbPDcrQcrQbPEcsYbPFccUdBObVcbPHclZbWLbWKbTwbWKbWLbWKcdSahyahybPIaUvbetaUvaToaToahybMkbWRbWSbMkbWRbWSbMkbMkbMkbYAbWUbWVbCAbKNbKNbKNaahaahaahaahbTJbWXbWYbWZbTNbXabXbbTQbXcbXdbXebSpdrhbXgbXhdrHbXjbXkbSqbXlbXmbXnbXobXpbSubSuaahaahbSxbXqbXrbSxbSxaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsbXtbXubXvbXsahyahyahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbXwbXxbXybXzbXAbXBbXCbXDbXEbXFbXGbXHbXIbXJbXKbXLbXMbXNbUEbUybUzbUAbUBbUBbUybUzbUybUCanGbUEahyahybKdbXVbhqbXWbamahybXXdaAcaEdaCdaBdaRdaOciCbUGbWvdbZbYibYjbYjbYkbNFbLAbYnbYnbTYbNCaahaZdbYpbPJcrQcQDbPLbPKcaFcHwcGzcsYbPFbUZcaHbWPbNTbWJbYrbWJbYrbWJbYrceHbURbPObPPaTobHCblDbHCaToahyahyahyahyahyahyahyahyahyahybKNbKNbYxbYybKNbKNaahaahaahaahaahaahbTJbTJbTJbTJbTJbYzciWbSpbSpbSpbSpbSpbSqbSqbSqbSqbSqbSqbSqbYBbYCbSubSubSubSuaahaahaahbSxbYDbVObYEbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybYFbYGbYHbYIbYFahyahyahyaahaahaahaahbtHbYJbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbYKbYLbYMbYNbYObYPbXMbYQbYRbYSbYTbYUbYRbYQbXMbXMbXMbYVbUEbWlbWmbWlbWnbUBbWlbWmbWlbUCanGbUEahyahyanHbecbDMbZbbamahybZcdcqdcbcfWbZibULddydeAddCbWvbZkbZlbZmbZnbZobZpcgwbZrbZsbUQbNCaahaZdbYpbRHaZdbRIbRNcIGbROcHwcGzcsYbPFbTlbRTbRPbRWbYsbTkccWbTkbTlbTkbTjbVeaUvaUvbTmbVgbdvaUvbJeahyahyahyahyahyahyahyahyahyahyahybZzbZAbZBbZzbeubeubeubeubeubeuaahbZCbZDbZEbZFbZGbTObTPbZHbZIbZJbZKbZLaahaahaahaahaahaahbZMbZNbZObZPbZQbZMaahaahaahaahbSxbZRbZSbZTbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10051,10 +10044,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjaahaahcjgcnUckXcnVcnWcnXcnYcnZcoacobcoacwucoocoecleclecofchYbRKchYaahaahaahaahaahaahamYanBarbardarcaoDaoDdgramYcogcohcoicmjaahaahaahbZXconcjubZXclxcrlcmycrqdElahycowckFckFcopcoqckIckIcorckIckIcoscjzahyahyahyahybbobbocotcimbcnbeccoAbboclmckLckMciFclmckMciFcovcoGcoxcoycxTcoScoxcoBcovciFclmckLckMciFcoCckicoDcmBcoEciFclmckLckMciFciFclmckLckMczAclmckLckMciFciFdCQckMciFclmckLckMciFcKickickicfRcoXciFciFaahahOareaiearfaieargahOaahaahaahaahaahaahaahaahaahbZMbZMdzQcoIcoJcoJcoJcoJcoKcoLcoLcoLcoLcoLcoLcoLcoMcoNdzZbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbLjaahaahcjgcoPckncoQcmacoRcpqcDocoUcoVcoacoWcpPcoYcoZcpactwchYcpcchYaahaahaahaahaahaahamYariarharkarjarmarlarnamYcpdcohcpecmjaahaahaahcpjbZXarqbZXcpjcvVcrrdBKdElahyahyahyahycjzcplcpmcpncpocppcpTcprcjzahyahyahyahyahybbobbocpscptcmzbbobboahyahyahyahyahyahycovawtcpvcpwcpxcpycpzcpAcpBcUZcovahyahyahyciFciFcpDcpEckjciFciFahyahyahyczZcEVcEVcEVcEvcEvcEvcEVcEVcEWczZahyahyahyahyahyahyciFciFcjIcjIcjKciFciFaahaahahOahOaiaarraidahOahOaahaahaahaahaahaahaahaahaahbZMcpFcpGcpHbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMcpIcoMcpJbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahcjgbfncpLcpMcpNcpOcqecDpcoacpRcoacFachYcqzcpUcqzcpVcpWchZchYcpXcpXcpXcpXcpXcpXamYamYcFcauQaruauRcKMamYamYcmjcpYcmjcmjcpXcpXcpjcpjcFucFrcqdcpjdElcxWcyjdElcrIcqfcqfcqgcjzcjzcjzcjzcqhcjzcjzcjzcjzcrIcqfcqfcqfcqgcpjcqicqjcqkcqlcqmcpjcpjahyahyahyahyahycovcqncqocKmcqqcMWcqrcKXcpBcqucovahyahyahyahycqvcqwcqxcqycqvahyahyahyahyczZcuIarwdBTcEvcEvcEVcEVcEVcIFczZahyahyahyahyahyahyahycrNckickiciEciFaahaahaahaahahOahOahOahOahOaahaahaahaahaahaahaahaahaahaahbZMcqCcgnbZMbZMaahaahaahaahaahaahaahaahaahaahaahbZMbZMcgncqDbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahcjgctxckncqFcqGcqHcqIcqJcqJcqKcqLcqMcqNcqOcqOcqPcqQcqRcqScqTcqUcqVcqWcqXcqYcqYcqZcqOarxcracqYcqYcqYcqYarycqOcrdarzcrfcrgcrhcricrjcMIcMjcrmcrncrocOZcrudBNcrscrtcrucrucrvcrucricrwcrxcrycrzcrAcrBcrAcrCcrAcrDcrAcrzcrAcrEcrFcrGcrucrHcrRahyahyahyahyahycrWcqtcrKcrLcrMcrLcrMcrLcpBcqtcrWahyahyahyahycsKcrOcrPcqycsKahyahyahyahycIHcEVcEVcEVcEVcEVcEVcEVcEVdBXaZRcNUcNNaZRaZRaZRciHciHciHcOjcNXcjJabTabTabTabTaahaahaahaahaahaahaahaahaahaahaahcrXcrXcrXcrXcrXbZMcrYcrZcrZcrZcrZcrZaahaahaahaahaahaahaahcsacsacsacsacsacsbbZMcsccsccsccsccscaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahcjgcsdcknckncsecsfcsgcshcshcsicshcsjcskcslcsmcsncsncsncsocspcsqcsrcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsucsvcswcsxcsycswcswcsvdBPcswcswcszcsAcsBcrucrucrucricrucsCcswcsDcswcsEcswcswcswcsFcswcsvcswcsGcsHcsIcrucsJcsRahyahyahyahyahyctmcqtcrKcrLcsMcrLcsMcrLcpBcqtctmahyahyahyctucsOcrOcsPcsQcumcsSahyahyahycMYcEVcEVcDncEVcEVcEVcEVcFeaZRaZRcQtcPTcQEcQwaZRcqBcsNcrTcsWcsWctccsXctzctdabTabTabTabTabTaahaahaahcrXcrXcrXcrXcrXctfctgayocrXctictjcrZayqctlcurcrZcrZcrZcrZcrZcsacsacsacsactnctoayscsactqctrcscayvcttcuTcsccsccsccsccscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaabLjbLjcjgctvcvWcALctycmacjgcQVcQHctBcRyctDctEctFctGctHcrfcrfcrfctIctJctKcrfctLctMctNcrfctFctOcrfcrfctPctQctRctSctTctQctQctUctVctWcrocrpctXctYctZcuacubdCbcuadCfcuacuccudcuacuacuacubcuecufcuacubcuacugcuacuhcuicuacuacubcuacujcrucukcruculcuYahyahyahyahyahyctmcuncuocrLcupcrLcupcrLcuqcunctmahyahyahycvacqycrOcrPcqycqycvaahyahyahycMYcJacEVcLvcEVcQdcEVcEVcEVaZRcuycuBcuBcwtcwrcwwcwvcwvcwvcwycwxcxOcwzacuacuacucxPaeCaeYabTabTaahaahcrXcuuazEcuucrXcNfcuxdGMcrXcuzcuAcrZcuNcuCcuDcrZcuEazFcuEcrZcuGaAdcuGcsacOScuJdHccsacuLcuMcsccwEcuOcuPcsccuQaADcuQcscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadcuScuScvgcuUcuScuVcuWcuScuScuScuXcvocuZcuXcvrcvbcuXcvccvdcvecvfcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpjcvNcvhcrFcvicLtcpjcpjcpjcpjcrIcqfcqfcqfcqfcqgcpjbRRcvlcqdcpjcrIcqfcqgcpjcrIcqfcqgcpjcvmcrucrucrGcvncpjcpjahyahyahyahyahycwjcvpcuocrLcrLcrLcrLcrLcuqcvqcwjahyahyahycqvcwqcrOcrPcqycvscqvahyahyahycRUcWRcEVcEVcEVcEVcEVcEVcWRaZRcxQcxScxRczlcRAcSScsNcznczmcAgczocBiabTaezacuacuaeVacuacuaswabTaahaahcrXaAEcvxaAEcrXcrXcvycrXcrXcwFcwGcrZcrZcvBcrZcrZaAFcvDaAFcrZaAGcvFaAGcsacsacvGcsacsacvHcvIcsccsccvJcsccscaAHcvLaAHcscaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahcjgctxckncqFcqGcqHcqIcqJcqJcqKcqLcqMcqNcqOcqOcqPcqQcqRcqScqTcqUcqVcqWcqXcqYcqYcqZcqOarxcracqYcqYcqYcqYarycqOcrdarzcrfcrgcrhcricrjcMIcMjcrmcrncrocOZcrudBNcrscrtcrucrucrvcrucricrwcrxcrycrzcrAcrBcrAcrCcrAcrDcrAcrzcrAcrEcrFcrGcrucrHcrRahyahyahyahyahycrWcqtcrKaaHaaqaaHaaqaaHcpBcqtcrWahyahyahyahycsKcrOcrPcqycsKahyahyahyahycIHcEVcEVcEVcEVcEVcEVcEVcEVdBXaZRcNUcNNaZRaZRaZRciHciHciHcOjcNXcjJabTabTabTabTaahaahaahaahaahaahaahaahaahaahaahcrXcrXcrXcrXcrXbZMcrYcrZcrZcrZcrZcrZaahaahaahaahaahaahaahcsacsacsacsacsacsbbZMcsccsccsccsccscaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahcjgcsdcknckncsecsfcsgcshcshcsicshcsjcskcslcsmcsncsncsncsocspcsqcsrcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsucsvcswcsxcsycswcswcsvdBPcswcswcszcsAcsBcrucrucrucricrucsCcswcsDcswcsEcswcswcswcsFcswcsvcswcsGcsHcsIcrucsJcsRahyahyahyahyahyctmcqtcrKaaHaaIaaHaaIaaHcpBcqtctmahyahyahyctucsOcrOcsPcsQcumcsSahyahyahycMYcEVcEVcDncEVcEVcEVcEVcFeaZRaZRcQtcPTcQEcQwaZRcqBcsNcrTcsWcsWctccsXctzctdabTabTabTabTabTaahaahaahcrXcrXcrXcrXcrXctfctgayocrXctictjcrZayqctlcurcrZcrZcrZcrZcrZcsacsacsacsactnctoayscsactqctrcscayvcttcuTcsccsccsccsccscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaabLjbLjcjgctvcvWcALctycmacjgcQVcQHctBcRyctDctEctFctGctHcrfcrfcrfctIctJctKcrfctLctMctNcrfctFctOcrfcrfctPctQctRctSctTctQctQctUctVctWcrocrpctXctYctZcuacubdCbcuadCfcuacuccudcuacuacuacubcuecufcuacubcuacugcuacuhcuicuacuacubcuacujcrucukcruculcuYahyahyahyahyahyctmcuncuoaaHaaKaaHaaKaaHcuqcunctmahyahyahycvacqycrOcrPcqycqycvaahyahyahycMYcJacEVcLvcEVcQdcEVcEVcEVaZRcuycuBcuBcwtcwrcwwcwvcwvcwvcwycwxcxOcwzacuacuacucxPaeCaeYabTabTaahaahcrXcuuazEcuucrXcNfcuxdGMcrXcuzcuAcrZcuNcuCcuDcrZcuEazFcuEcrZcuGaAdcuGcsacOScuJdHccsacuLcuMcsccwEcuOcuPcsccuQaADcuQcscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadcuScuScvgcuUcuScuVcuWcuScuScuScuXcvocuZcuXcvrcvbcuXcvccvdcvecvfcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpjcvNcvhcrFcvicLtcpjcpjcpjcpjcrIcqfcqfcqfcqfcqgcpjbRRcvlcqdcpjcrIcqfcqgcpjcrIcqfcqgcpjcvmcrucrucrGcvncpjcpjahyahyahyahyahycwjcvpcuoacgaaHaaHaaHacgcuqcvqcwjahyahyahycqvcwqcrOcrPcqycvscqvahyahyahycRUcWRcEVcEVcEVcEVcEVcEVcWRaZRcxQcxScxRczlcRAcSScsNcznczmcAgczocBiabTaezacuacuaeVacuacuaswabTaahaahcrXaAEcvxaAEcrXcrXcvycrXcrXcwFcwGcrZcrZcvBcrZcrZaAFcvDaAFcrZaAGcvFaAGcsacsacvGcsacsacvHcvIcsccsccvJcsccscaAHcvLaAHcscaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacxfcvOcvPbHqbIfcvScvTcvUdEKdEJcvXcvYcvZcwacwbcwccuXcpXcpXcpXcpXcpXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcpjcwdcwecwfcwgcwdcpjdELdELdELahyahyahyahyahyahycpjcwhcwicwhcpjahyahyahyahyahyahyahycxAcqicqicqicwkcqicxAahyahyahyahyahyahycovdCccwlcwmcwncwocuncuncuqcwpcovahyahyahycsKcqycrOcrPcqycqycsKahyahyahyczZcPicEVcEVcEvcPocEVcEVcEVaZRaZRaZRcBjcCicBkaZRcTmcUbaZRcDrcDqcEFcDscEYcEXcVacEZcFbacuacwabTaahaahcrXcwBcwCcwDcPvcwDcwJcwHcwLcwKcwUcwTcwXcwVcwMcwNcwMcwOcwPcrZcwQcwRcwScPBcwScyacyecybcyqcyfcwYcwZcxacxbcxccxbcxdcxecscaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacxNcxgcxgcxgcxgcvScvTcxhcxhcytcuXcxjcxkcxlcxmcxncuXcxocxpdCicxraahaahaahaahaahcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxscxtcxucxvcxwcwhcwhcwhcwhcwhcwhcwhcwhcwhcwhcwhcxxcxycwhahyahyahyahyahyahyahyahycxzcyBcxBczkcxDcyBcxzahyahyahyahyahyahycovcovdHdcxFcxGcxHcxIcxJdHecovcovahyahyahycumcsScxLcxMcqyctucsOahyahyahyczZczZdCjcTdcQncUncEVcEVddaaZRcVRcGAcFVcHscHrcHvcHucHxaZRcJLcJzcsNcsXacucJNcKKcKJacJacuacwabTaahaahcrXcxVaAKaSMcxYcxZcyucyrcrXcyccydcrZcAkcyvcygcyhbTcdENcykcrZcyldEPcyicyocypczEcAucsacyscAxcBocBncAqcywcyxcyndEQcyAcscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMczTcyCcyDcyEcyFcxgcxgcvScyGcyHcyIcyJcyKcyLcyMaGXcyOcyPcuXcxqcxqcxqcxrcxrcxrcxrcxrcxrcxrdCmcyRcyScyScyScyScyScyScyScyScyScyScyScyTcyScyUcyVcyWcyXcyYcyVcyZczaczbczaczaczaczaczaczaczaczaczaczccwhahyahyahyahyahycxzcxzcxzcxzczdczebTgczgczhcxzcxzcxzcxzahyahyahyahycovcovcovcziczjczicovcovcovahyahyahyahyahycvacrOcrPcqycvaahyahyahyahyahyczZczZczZczZcKLczZczZczZaZRcVScMfcKNcNJcMgcKNcNLcVUcNMcJLcJzcsNcwzcNPcNOcNRcNQacJacuaciabTaahaahcrXcrXcrXcrXcrXcrXcBqcrXcrXczpcuAcrZcrZcBrcrZcrZcrZcrZcrZcrZcsacsacsacsacsacBucsacsacuLcBvcsccsccsccsccsccsccsccsccscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/tools/IconSplitter/!README.txt b/tools/IconSplitter/!README.txt new file mode 100644 index 0000000000..c4c8c35b1c --- /dev/null +++ b/tools/IconSplitter/!README.txt @@ -0,0 +1,5 @@ +This Byond program takes all the icons in DmiToSplit along with input from the user and +splits the icons from the original file into a new file based on the user's provided criteria. +It also produces a file that is the original file minus the icons split into the new file. + +-- Yoshax \ No newline at end of file diff --git a/tools/IconSplitter/DmiToSplit.dmi b/tools/IconSplitter/DmiToSplit.dmi new file mode 100644 index 0000000000..cf74d73796 Binary files /dev/null and b/tools/IconSplitter/DmiToSplit.dmi differ diff --git a/tools/IconSplitter/IconSplitter.dm b/tools/IconSplitter/IconSplitter.dm new file mode 100644 index 0000000000..a13aad9b73 --- /dev/null +++ b/tools/IconSplitter/IconSplitter.dm @@ -0,0 +1,49 @@ +/* + These are simple defaults for your project. + */ + +world + fps = 25 // 25 frames per second + icon_size = 32 // 32x32 icon size by default + + view = 6 // show up to 6 tiles outward from center (13x13 view) + + +// Make objects move 8 pixels per tick when walking + +mob + step_size = 8 + +obj + step_size = 8 + + + + +client/verb/split_dmi() + set name = "Split Dmi" + set desc = "Loads DmiToSplit.dmi and removes the icon_states of user provided input into another .dmi." + set category = "Here" + + var/icon/DMIToSplit = icon('DmiToSplit.dmi') + + var/icon/RunningOutputCut = new() + var/icon/RunningOutput = new() + + var/user_input + while(!user_input) + user_input = input(usr, "Enter the criteria for the icon_states you wish to be split. For example, doing _d_s will remove all rolled down jumpsuits.","Split Criteria", "") + world << "Your split criteria is [user_input]" + + for(var/OriginalState in icon_states(DMIToSplit)) + if(findtext(OriginalState, user_input)) + var/icon/ToAdd = icon(DMIToSplit, OriginalState) + var/good_name = replacetext(OriginalState, user_input, "") + good_name = "[good_name]_s" + RunningOutputCut.Insert(ToAdd, good_name) + else + var/icon/ToAdd = icon(DMIToSplit, OriginalState) + RunningOutput.Insert(ToAdd, OriginalState) + + usr << ftp(RunningOutput,"CutUpDmi.dmi") + usr << ftp(RunningOutputCut, "CutUpDmiWithCriteria.dmi") \ No newline at end of file diff --git a/tools/IconSplitter/IconSplitter.dme b/tools/IconSplitter/IconSplitter.dme new file mode 100644 index 0000000000..2c3171b194 --- /dev/null +++ b/tools/IconSplitter/IconSplitter.dme @@ -0,0 +1,18 @@ +// DM Environment file for IconSplitter.dme. +// All manual changes should be made outside the BEGIN_ and END_ blocks. +// New source code should be placed in .dm files: choose File/New --> Code File. + +// BEGIN_INTERNALS +// END_INTERNALS + +// BEGIN_FILE_DIR +#define FILE_DIR . +// END_FILE_DIR + +// BEGIN_PREFERENCES +// END_PREFERENCES + +// BEGIN_INCLUDE +#include "IconSplitter.dm" +// END_INCLUDE + diff --git a/vorestation.dme b/vorestation.dme index 01aec19c1b..3c6d34d93b 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -906,6 +906,7 @@ #include "code\game\objects\items\weapons\circuitboards\computer\telecomms.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\engineering.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\jukebox.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" @@ -1288,6 +1289,7 @@ #include "code\modules\clothing\gloves\miscellaneous.dm" #include "code\modules\clothing\gloves\miscellaneous_vr.dm" #include "code\modules\clothing\head\collectable.dm" +#include "code\modules\clothing\head\flowercrowns.dm" #include "code\modules\clothing\head\hardhat.dm" #include "code\modules\clothing\head\helmet.dm" #include "code\modules\clothing\head\jobs.dm" @@ -1821,6 +1823,7 @@ #include "code\modules\mob\living\simple_animal\animals\corgi_vr.dm" #include "code\modules\mob\living\simple_animal\animals\crab.dm" #include "code\modules\mob\living\simple_animal\animals\farm_animals.dm" +#include "code\modules\mob\living\simple_animal\animals\fish.dm" #include "code\modules\mob\living\simple_animal\animals\fluffy_vr.dm" #include "code\modules\mob\living\simple_animal\animals\fox_vr.dm" #include "code\modules\mob\living\simple_animal\animals\giant_spider.dm"