diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index a977a5e317..f8267d3905 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -161,6 +161,7 @@ var/global/list/edible_trash = list(/obj/item/trash, /obj/item/weapon/material/shard, /obj/item/device/paicard, /obj/item/device/mmi/digital/posibrain, + /obj/item/weapon/digestion_remains, /obj/item/device/aicard) var/global/list/cont_flavors = list( diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 4103bcd500..95974c5334 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -476,17 +476,27 @@ area/space/atmosalert() - - - - - - - /area/casino/casino_ship name = "\improper Casino Ship" icon_state = "yellow" requires_power = 0 + dynamic_lighting = 0 + +/area/casino/casino_ship/wing_left + name = "\improper Casino Ship left wing" + icon_state = "yellow" + +/area/casino/casino_ship/wing_right + name = "\improper Casino Ship right wing" + icon_state = "yellow" + +/area/casino/casino_ship/dorms + name = "\improper Casino Ship dorms" + icon_state = "yellow" + +/area/casino/casino_ship/cockpit + name = "\improper Casino Ship left wing" + icon_state = "yellow" /area/planet/clown name = "\improper Clown Planet" diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 1e9cf1efff..35bd05d49e 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -44,58 +44,95 @@ desc = "It radiates an aura of chaotic size energy." icon = 'icons/obj/mobcap.dmi' icon_state = "mobcap0" - matter = list(DEFAULT_WALL_MATERIAL = 1000) - throwforce = 00 throw_speed = 4 throw_range = 20 force = 0 - var/colorindex = 0 var/mob/living/capsuleowner = null //taken from Capsule Code var/sizetouse = 0.25 -/obj/item/device/buttonofnormal/pickup(mob/user) - if(!capsuleowner) - capsuleowner = user + pickup(mob/user) + if(!capsuleowner) + capsuleowner = user -/obj/item/device/buttonofnormal/attack_self(mob/user) - if(colorindex) - nonrandom() - sleep(10) - capsuleowner.resize(sizetouse) - sizetouse = rand(25,200)/100 //randmization occurs after press - -/obj/item/device/buttonofnormal/throw_impact(atom/A, speed, mob/user) - ..() - if(isliving(A)) + attack_self(mob/user) if(colorindex) nonrandom() - sleep(5) - var/mob/living/capsulehit = A - capsulehit.resize(sizetouse) + sleep(10) + capsuleowner.resize(sizetouse) sizetouse = rand(25,200)/100 //randmization occurs after press -/obj/item/device/buttonofnormal/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/weapon/pen)) - colorindex += 1 - if(colorindex >= 6) - colorindex = 0 - icon_state = "mobcap[colorindex]" - update_icon() - ..() + throw_impact(atom/A, speed, mob/user) + ..() + if(isliving(A)) + if(colorindex) + nonrandom() + sleep(5) + var/mob/living/capsulehit = A + capsulehit.resize(sizetouse) + sizetouse = rand(25,200)/100 //randmization occurs after press + + attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/weapon/pen)) + colorindex += 1 + if(colorindex >= 6) + colorindex = 0 + icon_state = "mobcap[colorindex]" + update_icon() + ..() /obj/item/device/buttonofnormal/proc/nonrandom() //Secret ball randmoizer rig code - if(colorindex==1) - sizetouse = RESIZE_HUGE - if(colorindex==2) - sizetouse = RESIZE_BIG - if(colorindex==3) - sizetouse = RESIZE_NORMAL - if(colorindex==4) - sizetouse = RESIZE_SMALL - if(colorindex==5) - sizetouse = RESIZE_TINY + switch(colorindex) + if(1) sizetouse = RESIZE_HUGE + if(2) sizetouse = RESIZE_BIG + if(3) sizetouse = RESIZE_NORMAL + if(4) sizetouse = RESIZE_SMALL + if(5) sizetouse = RESIZE_TINY +/obj/item/device/daredevice + name = "Dare button" + desc = "A strange button, the only distinguishing feature being an engraved text reading 'Suffer to Gain.'." + icon = 'icons/obj/mobcap.dmi' + icon_state = "mobcap1" + matter = list(DEFAULT_WALL_MATERIAL = 5000) + throwforce = 00 + throw_speed = 2 + throw_range = 20 + force = 0 + var/luckynumber7 = 0 + var/colorindex = 1 + attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/weapon/pen)) + colorindex += 1 + if(colorindex >= 6) + colorindex = 0 + icon_state = "mobcap[colorindex]" + update_icon() + ..() + + attack_self(mob/user) + var/mob/living/capsuleowner = user + playsound(src, 'sound/effects/splat.ogg', 30, 1) + sleep(100) + switch(luckynumber7) + if(1) capsuleowner.resize(RESIZE_TINY) //Loss Shrinking! + if(2) capsuleowner.apply_damage(5, BRUTE) //Loss Damaging! + if(3) capsuleowner.Weaken(5) //Loss Knee spaghetti! + if(4) capsuleowner.hallucination += 66 //loss woah, dude. + if(5) new /obj/item/weapon/reagent_containers/food/snacks/cookie(src.loc) //Win! + if(6) new /obj/item/weapon/spacecasinocash(src.loc) //Win? + if(7) + new /obj/item/weapon/material/butterfly/switchblade(src.loc) + capsuleowner.apply_damage(10, BRUTE) //Loss Damaging! WIN KNIVE! + if(8) new /obj/item/weapon/reagent_containers/syringe/drugs(src.loc) + if(9) + new /obj/item/weapon/gun/energy/sizegun/not_advanced(src.loc) + qdel(src) + if(777) new /obj/item/weapon/spacecash/c1000(src.loc) //for rigging + else luckynumber7 = (rand(0,10)) + luckynumber7 = rand(0,10) + sleep(100) + playsound(src.loc, 'sound/machines/slotmachine.ogg', 25, 1) diff --git a/code/game/machinery/casino.dm b/code/game/machinery/casino.dm new file mode 100644 index 0000000000..0026b2514c --- /dev/null +++ b/code/game/machinery/casino.dm @@ -0,0 +1,847 @@ +#define DISPENSER_MAX_CARTRIDGES 90 + +/obj/structure/casino_table + name = "casino table" + desc = "this is an unremarkable table for a casino." + icon = 'icons/obj/casino.dmi' + icon_state = "roulette_table" + density = 1 + anchored = 1 + climbable = 1 + layer = TABLE_LAYER + throwpass = 1 + var/item_place = 1 //allows items to be placed on the table, but not on benches. + + var/busy = 0 + +/obj/structure/casino_table/attackby(obj/item/W as obj, mob/user as mob) + if(item_place) + user.drop_item(src.loc) + return + +/obj/structure/casino_table/roulette_table + name = "roulette" + desc = "Spin the roulette to try your luck." + icon_state = "roulette_wheel" + +/obj/structure/casino_table/roulette_table/attack_hand(mob/user as mob) + if (busy) + to_chat(user,"You cannot spin now! The roulette is already spinning. ") + return + visible_message("\ [user] spins the roulette and throws inside little ball.") + playsound(src.loc, 'sound/machines/roulette.ogg', 40, 1) + busy = 1 + icon_state = "roulette_wheel_spinning" + var/result = rand(0,36) + var/color = "green" + add_fingerprint(user) + if ((result>0 && result<11) || (result>18 && result<29)) + if (result%2) + color="red" + else + color="black" + if ( (result>10 && result<19) || (result>28) ) + if (result%2) + color="black" + else + color="red" + spawn(5 SECONDS) + visible_message("The roulette stops spinning, the ball landing on [result], [color].") + busy=0 + icon_state = "roulette_wheel" + +/obj/structure/casino_table/roulette_chart + name = "roulette chart" + desc = "Roulette chart. Place your bets!" + icon_state = "roulette_table" + +/obj/structure/casino_table/blackjack_l + name = "gambling table" + desc = "Gambling table, try your luck and skills! " + icon_state = "blackjack_l" + +/obj/structure/casino_table/blackjack_r + name = "gambling table" + desc = "Gambling table, try your luck and skills! " + icon_state = "blackjack_r" + +/obj/structure/casino_table/blackjack_m + name = "gambling table" + desc = "Gambling table, try your luck and skills! " + icon_state = "blackjack_m" + +/obj/machinery/slot_machine + name = "Slot machine" + desc = "A gambling machine designed to give you false hope and rob you of your wealth, hence why it's often called a one armed bandit." + icon = 'icons/obj/casino.dmi' + icon_state = "slotmachine" + anchored = 1 + density = 1 + var/busy = 0 + var/symbol1 = null + var/symbol2 = null + var/symbol3 = null + +/obj/machinery/slot_machine/attackby(obj/item/weapon/W as obj, mob/user as mob) + + var/handled = 0 + var/paid = 0 + + if(istype(W, /obj/item/weapon/spacecasinocash)) + var/obj/item/weapon/spacecasinocash/C = W + paid = insert_chip(C, user) + handled = 1 + + if(paid) + return + if(handled) + nanomanager.update_uis(src) + return // don't smack that machine with your 2 chips + +/obj/machinery/slot_machine/proc/insert_chip(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user) + if (busy) + to_chat(user,"The slot machine is currently rolling. ") + return + if(cashmoney.worth < 5) + to_chat(user,"You dont have enough chips to gamble! ") + return + + to_chat(user,"You puts 5 credits in the slot machine and presses start.") + cashmoney.worth -= 5 + cashmoney.update_icon() + + if(cashmoney.worth <= 0) + usr.drop_from_inventory(cashmoney) + qdel(cashmoney) + cashmoney.update_icon() + + busy = 1 + icon_state = "slotmachine_rolling" + playsound(src.loc, 'sound/machines/slotmachine_pull.ogg', 15, 1) + + var/slot1 = rand(0,9) + switch(slot1) + if(1 to 3) symbol1 = "cherry" + if(4 to 4) symbol1 = "lemon" + //if(4 to 4) symbol1 = "watermelon" + if(5 to 5) symbol1 = "bell" + if(6 to 6) symbol1 = "four leaf clover" + if(7 to 7) symbol1 = "seven" + if(8 to 8) symbol1 = "diamond" + if(9 to 9) symbol1 = "platinum coin" + + var/slot2 = rand(0,9) + switch(slot2) + if(1 to 3) symbol2 = "cherry" + if(4 to 4) symbol2 = "lemon" + //if(4 to 4) symbol2 = "watermelon" + if(5 to 5) symbol2 = "bell" + if(6 to 6) symbol2 = "four leaf clover" + if(7 to 7) symbol2 = "seven" + if(8 to 8) symbol2 = "diamond" + if(9 to 9) symbol2 = "platinum coin" + + var/slot3 = rand(0,9) + switch(slot3) + if(1 to 3) symbol3 = "cherry" + if(4 to 4) symbol3 = "lemon" + //if(4 to 4) symbol3 = "watermelon" + if(5 to 5) symbol3 = "bell" + if(6 to 6) symbol3 = "four leaf clover" + if(7 to 7) symbol3 = "seven" + if(8 to 8) symbol3 = "diamond" + if(9 to 9) symbol3 = "platinum coin" + + var/output //Output variable to send out in chat after the large if statement. + var/winnings = 0 //How much money will be given if any. + var/platinumwin = 0 // If you win the platinum chip or not + var/delaytime = 5 SECONDS // Put this somewhere else I'm just proving a point >:C + + + spawn(delaytime) + to_chat(user,"The slot machine flashes with bright colours as the slots lights up with a [symbol1], a [symbol2] and a [symbol3]!") + + if (symbol1 == "cherry" && symbol2 == "cherry" && symbol3 == "cherry") + output = "Three cherries! The slot machine deposits chips worth 25 credits!" + winnings = 25 + + if ((symbol1 != "cherry" && symbol2 == "cherry" && symbol3 == "cherry") || (symbol1 == "cherry" && symbol2 != "cherry" && symbol3 == "cherry") ||(symbol1 == "cherry" && symbol2 == "cherry" && symbol3 != "cherry")) + output = "Two cherries! The slot machine deposits a 10 credit chip!" + winnings = 10 + + if (symbol1 == "lemon" && symbol2 == "lemon" && symbol3 == "lemon") + output = "Three lemons! The slot machine deposits a 50 credit chip!" + winnings = 50 + + if (symbol1 == "watermelon" && symbol2 == "watermelon" && symbol3 == "watermelon") + output = "Three watermelons! The slot machine deposits chips worth 75 credits!" + winnings = 75 + + if (symbol1 == "bell" && symbol2 == "bell" && symbol3 == "bell") + output = "Three bells! The slot machine deposits chips a 100 credit chip!" + winnings = 100 + + if (symbol1 == "four leaf clover" && symbol2 == "four leaf clover" && symbol3 == "four leaf clover") + output = "Three four leaf clovers! The slot machine deposits a 200 credit chip!" + winnings = 200 + + if (symbol1 == "seven" && symbol2 == "seven" && symbol3 == "seven") + output = "Three sevens! The slot machine deposits a 500 credit chip!" + winnings = 500 + + if (symbol1 == "diamond" && symbol2 == "diamond" && symbol3 == "diamond") + output = "Three diamonds! The slot machine deposits a 1000 credit chip!" + winnings = 1000 + + if (symbol1 == "platinum coin" && symbol2 == "platinum coin" && symbol3 == "platinum coin") + output = "Three platinum coins! The slot machine deposits a platinum chip!" + platinumwin = TRUE; + + icon_state = initial(icon_state) // Set it back to the original iconstate. + + if(!output) // Is there anything to output? If not, consider it a loss. + to_chat(user,"Better luck next time!") + busy = FALSE + return + + visible_message(output) //Output message + + if(platinumwin) // Did they win the platinum chip? + new /obj/item/weapon/casin_platinum_chip(src.loc) + playsound(src.loc, 'sound/machines/slotmachine.ogg', 25, 1) + + if(winnings) //Did the person win? + icon_state = "slotmachine_winning" + playsound(src.loc, 'sound/machines/slotmachine.ogg', 25, 1) + spawn(delaytime) + spawn_casinochips(winnings, src.loc) + icon_state = "slotmachine" + + busy = FALSE //Set busy to false, we're done here fam. + + +/obj/structure/wheel_of_fortune + name = "wheel of fortune" + desc = "May fortune favour the lucky one!" + icon = 'icons/obj/casino.dmi' + icon_state = "wheel_of_fortune" + density = 1 + anchored = 1 + var/interval = 1 + var/busy = 0 + +/obj/structure/wheel_of_fortune/verb/setinterval() + set name = "Change interval" + set category = "Object" + set src in view(1) + + if(usr.incapacitated()) + return + if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) + interval = input("Put the desired interval (1-100)", "Set Interval") as num + if(interval>100 || interval<1) + usr << "Invalid interval." + return + usr << "You set the interval to [interval]" + return + + +/obj/structure/wheel_of_fortune/attack_hand(mob/user as mob) + if (busy) + to_chat(user,"The wheel of fortune is already spinning! ") + return + visible_message("\ [user] spins the wheel of fortune!") + busy = 1 + icon_state = "wheel_of_fortune_spinning" + var/result = rand(1,interval) + add_fingerprint(user) + spawn(5 SECONDS) + visible_message("The wheel of fortune stops spinning, the number is [result]!") + busy=0 + icon_state = "wheel_of_fortune" + +/obj/structure/stripper_pole + name = "stripper pole" + icon = 'icons/obj/casino.dmi' + icon_state = "stripper_pole" + plane = MOB_PLANE + layer = BELOW_MOB_LAYER + density = 0 + +/obj/structure/stripper_pole/attack_hand(mob/user) + dance(user) + user.spin(32,2) + ..() + +/obj/structure/stripper_pole/proc/dance(mob/user) + if(layer == BELOW_MOB_LAYER) + layer = ABOVE_MOB_LAYER + else + layer = BELOW_MOB_LAYER + +/obj/machinery/chemical_dispenser/deluxe + name = "deluxe drink dispenser" + desc = "The premium within dispenser for drinks, its made with bluespace technology!" + icon = 'icons/obj/casino.dmi' + icon_state = "deluxe_dispenser" + ui_title = "Deluxe Drink Dispenser" + accept_drinking = 1 + + +/obj/machinery/chemical_dispenser/deluxe + dispense_reagents = list( + "water", "ice", "coffee", "cream", "tea", "icetea", "cola", "spacemountainwind", "dr_gibb", "space_up", "tonic", + "sodawater", "lemon_lime", "sugar", "orangejuice", "limejuice", "watermelonjuice", "thirteenloko", "grapesoda", + "coffee", "cafe_latte", "soy_latte", "hot_coco", "milk", "cream", "tea", "ice", "orangejuice", "lemonjuice", + "limejuice", "berryjuice", "mint", "matcha_latte", "lemon_lime", "sugar", "orangejuice", "limejuice", "sodawater", + "tonic", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequilla", "vermouth", "cognac", + "ale", "mead", "bitters", "champagne", "singulo", "doctorsdelight", "nothing", "banana", "honey", "egg", + "coco", "cherryjelly", "carrot", "apple", "tomato", "nutbutter", "soymilk", "grenadine", "gingerale", "royrogers", + "patron", "goldschlager", "gelatin", "melonliquor", "bluecuracao", "thirteenloko", "deadrum", "sake", "acidspit", + "amasec", "beepsky_smash", "atomicbomb", "nuka_cola", "threemileisland", "manhattan_proj", "psilocybin", "moonshine", + "specialwhiskey", "unathiliquor", "winebrandy", "snaps" + ) + +/obj/machinery/chemical_dispenser/deluxe/full + spawn_cartridges = list( + /obj/item/weapon/reagent_containers/chem_disp_cartridge/water, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/ice, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/coffee, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/cream, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/tea, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/icetea, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/cola, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/smw, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/dr_gibb, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/spaceup, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/tonic, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/sodawater, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon_lime, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/orange, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/lime, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/watermelon, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/coffee, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/cafe_latte, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/soy_latte, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/hot_coco, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/milk, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/cream, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/tea, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/ice, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/mint, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/orange, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/lime, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/berry, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/matcha_latte, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon_lime, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/orange, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/lime, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/sodawater, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/tonic, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/beer, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/kahlua, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/whiskey, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/wine, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/vodka, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/gin, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/rum, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/tequila, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/vermouth, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/cognac, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/ale, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/mead, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/champagne, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/grapesoda, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/singulo, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/doctorsdelight, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/nothing, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/banana, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/honey, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/egg, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/coco, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/cherryjelly, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/carrot, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/apple, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/tomato, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/nutbutter, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/soymilk, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/grenadine, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/gingerale, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/royrogers, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/patron, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/goldschlager, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/gelatin, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/melonliquor, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/bluecuracao, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/thirteenloko, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/deadrum, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/sake, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/acidspit, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/amasec, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/beepsky_smash, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/atomicbomb, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/nuka_cola, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/threemileisland, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/manhattan_proj, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/psilocybin, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/moonshine, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/specialwhiskey, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/unathiliquor, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/winebrandy, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/snaps + ) + +/obj/machinery/chemical_dispenser/deluxe/New() + ..() + + if(spawn_cartridges) + for(var/type in spawn_cartridges) + add_cartridge_deluxe(new type(src)) + +/obj/machinery/chemical_dispenser/deluxe/examine(mob/user) + user << desc + user << "It has [cartridges.len] cartridges installed, and has space for [DISPENSER_MAX_CARTRIDGES - cartridges.len] more." + +/obj/machinery/chemical_dispenser/deluxe/proc/add_cartridge_deluxe(obj/item/weapon/reagent_containers/chem_disp_cartridge/C, mob/user) + if(!istype(C)) + if(user) + user << "\The [C] will not fit in \the [src]!" + return + + if(cartridges.len >= DISPENSER_MAX_CARTRIDGES) + if(user) + user << "\The [src] does not have any slots open for \the [C] to fit into!" + return + + if(!C.label) + if(user) + user << "\The [C] does not have a label!" + return + + if(cartridges[C.label]) + if(user) + user << "\The [src] already contains a cartridge with that label!" + return + + if(user) + user.drop_from_inventory(C) + user << "You add \the [C] to \the [src]." + + C.loc = src + cartridges[C.label] = C + cartridges = sortAssoc(cartridges) + nanomanager.update_uis(src) + +/obj/machinery/chemical_dispenser/deluxe/attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/weapon/wrench)) + playsound(src, W.usesound, 50, 1) + user << "You begin to [anchored ? "un" : ""]fasten \the [src]." + if (do_after(user, 20 * W.toolspeed)) + user.visible_message( + "\The [user] [anchored ? "un" : ""]fastens \the [src].", + "You have [anchored ? "un" : ""]fastened \the [src].", + "You hear a ratchet.") + anchored = !anchored + else + user << "You decide not to [anchored ? "un" : ""]fasten \the [src]." + + else if(istype(W, /obj/item/weapon/reagent_containers/chem_disp_cartridge)) + add_cartridge_deluxe(W, user) + + else if(istype(W, /obj/item/weapon/screwdriver)) + var/label = input(user, "Which cartridge would you like to remove?", "Chemical Dispenser") as null|anything in cartridges + if(!label) return + var/obj/item/weapon/reagent_containers/chem_disp_cartridge/C = remove_cartridge(label) + if(C) + user << "You remove \the [C] from \the [src]." + C.loc = loc + playsound(src, W.usesound, 50, 1) + + else if(istype(W, /obj/item/weapon/reagent_containers/glass) || istype(W, /obj/item/weapon/reagent_containers/food)) + if(container) + user << "There is already \a [container] on \the [src]!" + return + + var/obj/item/weapon/reagent_containers/RC = W + + if(!accept_drinking && istype(RC,/obj/item/weapon/reagent_containers/food)) + user << "This machine only accepts beakers!" + return + + if(!RC.is_open_container()) + user << "You don't see how \the [src] could dispense reagents into \the [RC]." + return + + container = RC + user.drop_from_inventory(RC) + RC.loc = src + user << "You set \the [RC] on \the [src]." + nanomanager.update_uis(src) // update all UIs attached to src + + else + return ..() + +/obj/machinery/vending/deluxe_boozeomat + name = "Deluxe Drink Distributor" + desc = "A top of the line and experimental drink vendor, it uses bluespace technology for storage!" + icon = 'icons/obj/casino.dmi' + icon_state = "deluxe_boozeomat" + icon_deny = "deluxe_boozeomat_deny" + products = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/square = 25, + /obj/item/weapon/reagent_containers/food/drinks/glass2/rocks = 25, + /obj/item/weapon/reagent_containers/food/drinks/glass2/shake = 25, + /obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail = 25, + /obj/item/weapon/reagent_containers/food/drinks/glass2/shot = 25, + /obj/item/weapon/reagent_containers/food/drinks/glass2/pint = 25, + /obj/item/weapon/reagent_containers/food/drinks/glass2/mug = 25, + /obj/item/weapon/reagent_containers/food/drinks/glass2/wine = 25, + /obj/item/weapon/reagent_containers/food/drinks/metaglass = 25, + /obj/item/weapon/reagent_containers/food/drinks/metaglass/metapint = 25, + /obj/item/weapon/glass_extra/stick = 50, + /obj/item/weapon/glass_extra/straw = 50, + /obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/grenadine = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/sake = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/patron = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/champagne = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/snaps = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 50, + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 50, + /obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 50, + /obj/item/weapon/reagent_containers/food/drinks/cans/gingerale = 50, + /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 50, + /obj/item/weapon/reagent_containers/food/drinks/tea = 50, + /obj/item/weapon/reagent_containers/food/drinks/bottle/cola = 15, + /obj/item/weapon/reagent_containers/food/drinks/bottle/space_up = 15, + /obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind = 15, + /obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/lemonjuice = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/applejuice = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/milk = 10, + /obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 10, + /obj/item/weapon/reagent_containers/food/drinks/ice = 10, + /obj/item/weapon/reagent_containers/food/drinks/flask/barflask = 10, + /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask = 10) + + contraband = list() + vend_delay = 15 + idle_power_usage = 300 + req_access = list(access_bar) + req_log_access = access_bar + has_logs = 1 + + +/obj/machinery/vending/deluxe_dinner + name = "Deluxe Dining Distributor" + desc = "A top of the line and experimental food vendor, it uses bluespace technology for storage!" + icon = 'icons/obj/casino.dmi' + icon_state = "deluxe_dining" + icon_deny = "deluxe_dining_deny" + products = list(/obj/item/weapon/tray = 8, + /obj/item/weapon/material/kitchen/utensil/fork = 15, + /obj/item/weapon/material/knife/plastic = 15, + /obj/item/weapon/material/kitchen/utensil/spoon = 15, + /obj/item/weapon/material/kitchen/rollingpin = 5, + /obj/item/weapon/material/knife = 5, + /obj/item/weapon/material/knife/butch = 3, + /obj/item/clothing/suit/chef/classic = 3, + /obj/item/weapon/storage/bag/food = 3, + /obj/item/weapon/storage/toolbox/lunchbox = 10, + /obj/item/weapon/storage/toolbox/lunchbox/heart = 10, + /obj/item/weapon/storage/toolbox/lunchbox/cat = 10, + /obj/item/weapon/storage/toolbox/lunchbox/nt = 10, + /obj/item/weapon/storage/toolbox/lunchbox/mars = 10, + /obj/item/weapon/storage/toolbox/lunchbox/cti = 10, + /obj/item/weapon/storage/toolbox/lunchbox/nymph = 10, + /obj/item/weapon/storage/toolbox/lunchbox/syndicate = 10, + /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger = 30, + /obj/item/weapon/reagent_containers/food/snacks/meatsteak = 30, + /obj/item/weapon/reagent_containers/food/snacks/fries = 30, + /obj/item/weapon/reagent_containers/food/snacks/onionrings = 30, + /obj/item/weapon/reagent_containers/food/snacks/cheeseburrito= 30, + /obj/item/weapon/reagent_containers/food/snacks/enchiladas= 30, + /obj/item/weapon/reagent_containers/food/snacks/meatburrito= 30, + /obj/item/weapon/reagent_containers/food/snacks/taco= 30, + /obj/item/weapon/reagent_containers/food/snacks/cheesenachos= 30, + /obj/item/weapon/reagent_containers/food/snacks/cubannachos= 30, + /obj/item/weapon/reagent_containers/food/snacks/tamales = 30, + /obj/item/weapon/reagent_containers/food/snacks/bigos = 30, + /obj/item/weapon/reagent_containers/food/snacks/concha = 30, + /obj/item/weapon/reagent_containers/food/snacks/pandenata = 30, + /obj/item/weapon/reagent_containers/food/snacks/tocino = 30, + /obj/item/weapon/reagent_containers/food/snacks/stew= 20, + /obj/item/weapon/reagent_containers/food/snacks/roastbeef = 20, + /obj/item/weapon/reagent_containers/food/snacks/aesirsalad = 20, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi = 20, + /obj/item/weapon/reagent_containers/food/snacks/kitsuneudon = 20, + /obj/item/weapon/reagent_containers/food/snacks/baguette = 30, + /obj/item/weapon/reagent_containers/food/snacks/appletart = 30, + /obj/item/weapon/reagent_containers/food/snacks/muffin = 30, + /obj/item/weapon/reagent_containers/food/snacks/berrymuffin = 30, + /obj/item/weapon/reagent_containers/food/snacks/cherrypie = 30, + /obj/item/weapon/reagent_containers/food/snacks/cookie = 30, + /obj/item/weapon/reagent_containers/food/snacks/croissant = 30, + /obj/item/weapon/reagent_containers/food/snacks/pie = 30, + /obj/item/weapon/reagent_containers/food/snacks/poppypretzel = 30, + /obj/item/weapon/reagent_containers/food/snacks/sugarcookie = 30, + /obj/item/weapon/reagent_containers/food/snacks/waffles = 30, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake = 10, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake = 10) + + contraband = list() + vend_delay = 15 + idle_power_usage = 300 + req_access = list(access_bar) + req_log_access = access_bar + has_logs = 1 + + +/obj/item/weapon/book/manual/casino + name = "A dummy guide to losing your thalers" + icon = 'icons/obj/casino.dmi' + icon_state ="casinomanual" + author = "Sleazy Serpent Saren" + title = "A dummy guide to losing your thalers" + dat = {" + + + + + +

Contents

+
    +
  1. Foreword: Welcome to gambling!
  2. +
  3. Blackjack
  4. +
  5. Roulette
  6. +
  7. Poker
  8. +
  9. Prizes
  10. +
  11. Sentient prizes
  12. +
+
+

Foreword: Welcome to gambling!

+ In this book I'll teach you all about how to gamble your money away or at least get lucky and win some! This book also has a handy little overview of the prizes one can earn and the limitations of what can do with the living and breathing ones.
+ (This book will also contain out of character information to help people be aware of how touchy subjects like sentient prizes are to be handled.) + +

Blackjack

+ First up is the classic sport of blackjack, blackjack is played normally between a gambler and a dealer, the goal is to have the higher number than the opponent but not go above 21 or it will be a bust and one loses automatically.
+ The values of cards are as follow: + + A game of blackjack begins with the dealer giving the gambler two cards, in normal blackjack all cards dealt to gambler and dealer are always shown. The two cards dealt have their values put together, the gambler has three choices, stand, hit, or double down. + + When it becomes the dealer's turn they do the same as the gambler, though their only goal is to get a higher or equal value to gambler. The dealer cant double down, and the large majority of casino's has the rule that a dealer cant draw anymore cards once they reach or go above a value. The most common value is 17, and there are two variants to that rule, soft and hard 17. + + The casino who supplies this version of the manual follows the rule of hard 17.
+ The game ends when the dealer busts, reaches the threshold of what they are allowed to draw, or if they get a higher value than the gambler. Again, the one who has the highest value that isnt higher than 21 wins, but if both has the same value no one wins and the bet goes back to the gambler.
+ And thats it! Now go out there and gamble your savings away! This casino allows bets between 5 and 50 with double down ignoring that limit! + +

Roulette

+ So this game of roulette is all about chance! what happens is that people bet on different odds and hope for the best as the dealer rolls the ball and makes that roulette thingy make than fun addicting spin! Once it lands on a number between 0 and 36 its either bust or payout! Pretty simple, right?
+ Everyone starts by putting their bets down, people can bet more than once before the ball goes rolling, the odds and their payoffs are these: + + Theres not much more to it! Bets made, ball rolls, number announced, people win, people lose! Bets allowed here are from 1 to 25 per bet. Oh, im also being told this casino has the fancy rule that if ball lands on 0, one wins at least one bet no matter what it is! So lets hope you got that big bet on a single number! + +

Poker

+ Aaah yes, good old poker. This casino runs by the rules of texas hold em, though the might be a little modified to be simpler for the average joe. In a game of poker it can be a single gambler and a dealer against each other, but most often its the dealer making the game proceed while several gamblers fights tooth and nail to steal each others chips, but the dealer can still join in on the free for all if they so wish!
+ To simply explain the game, people gamble with each other, a game of trying to get the best hand and raise bets or back out depending on what the outcome may be. The game starts with everyone betting a certain amount, it can be 5 or 10 chips depending on dealer, but if one wants to join, there needs to be chips on that table! Once everyone has made their initial bet, everyone gets two cards face down, these are kept hidden, no one not even dealer gets to see players cards until the end, not even folded cards are to be shown unless wanted to, sometimes its better making people unsure if you dropped out with bad cards or if you have other motives, deception is a large part of this game!
+ With everyone having cards dealt, its time for the dealer to lay three on the table face up, these cards are 3 of 5 cards in the community pool, everyone can use these cards to make sets like pairs and such, this doesnt mean they are taken, multiple people can use the same community card for their own sets!
+ With the community having three we enter the second betting stage, here people have two options, standing or raising. Standing means you dont want to raise, raising explains itself, though if someone bets, people have three options, commit putting the chips in to risk as much as the raised bet, but if one doesnt have enough, then they can still go all in with their remaining chips, one can also drop out if its too risky, the chips bet will remain on the table, but at least you wont lose more eh? Final one is to raise further, sometimes people can dare each other to raise more, but its not allowed for someone to raise, then raise further if no one else raises after them!
+ As said earlier, we got like a community pool of 5 cards total, this time another card is revealed and we enter a new betting phase, then the final fifth card is revealed and final bets are made, and then the cards are revealed so it can be determined who has the best hand! If two or more have equally good sets, then the chips are split evenly between them.
+ But notice, if someone is left because everyone else didnt dare to raise with their bet, they can decide to not reveal their hand, they might have had a winning hand, or maybe its terrible and they just bluffed their way to victory, only they know and can decide if they want to expose their cards to gloat or confuse their opponents. So in summary, the game can be simple, but hard to master!

+ And here is the order of winning hands folks! + + Wew, what a long lesson, but thats how one does the Texas hold em here at this casino, hope you guys have fun winning and losing your hard earned cash with this one! + +

Prizes

+ + Hey folks, welcome to the prize section! This part is definently important for you folks operating the prize booth! First off I wanna tell you some great news! Nanotransen has gone along with a nice deal that allows crew to occasionally keep their hard earned rewards on station for a limited time, now you can enjoy your new fancy toolbelt or bluespace beaker for more than just the shift where the casino comes around!
+ ((Be aware, there can be limitations on how many rewards you get to keep after the shift, it might be unfair if some shows up and wins one thing, while they watch as command staff crew with high background income as well as hyperactive miners walks home with 20 prizes they get to enjoy while having almost done no gambling at all.))

+ + Lets get to the prizes and exchange rate before we get started on the stuff specifically for the booth operators, so heres the current prizes one can win and their costs! Be aware there might be new prizes or absent ones from time to time!
+ + EXCHANGE RATE
+ FROM = TO
+ 10 Thalers = 1 casino chip
+ 1 casino chip = 5 Thalers

+ + The special sentient prize is 100 chips! More about it in section below!

+ + Melee weapons + + Guns and 'guns' ((disclaimer, giving out guns will mean you get a weapons license as well with the shifts you have it, abusing these weapons will quickly get them removed!)) + + Gear + + Accessories + + Masks and hats - EVERYTHING IS 50 except chameleon! + + Costumes - All costumes are 150! + + Toys and misc - ALL THESE ARE 50 + + Booze - ALL BOOZE IS 50 + + Thats it for prizes!

+ + Now comes the part for the both operators, you got a very important job, it has a lot of responsibility, so it means that you gotta put that first before your own fun, cause unless you do it, a lot of folks are gonna be left sad and dissappointed they cant get any goodies! But the process is simple and can be quick, someone comes to you, they want some chips, or thalers back or a prize, you simply check this nice guide above to determine cost and ask for the amount of thalers or chips needed, if its a prize, then you follow this procedure: +
    +
  1. First get the thalers or chips for payment.
  2. +
  3. Before giving the prize you take out your prize winner folder and a piece of paper, this paper will be named after the one getting the reward and will have further prizes noted down into it, so make sure its safe in that folder!
  4. +
  5. You write at the top of the document the winner's name, then below write in big letters 'PRIZES' and put each new reward on its own line! ((You skip to a new line by writing < br > without the space between the br and the clamps))
  6. +
  7. Once written down, you just put the paper back in the folder and hand over the prize!
  8. +
+ ((When shift is nearing its end you pray to staff or DM the one responsible for the event, they will get the folder and copy paste all the reward info before shift is over and ensure people get their rewards. This is a very important job and we understand it might not be so fun being restricted during an event, but just like the rest of volunteer staff, you get rewarded with guaranteed prizes to enjoy after the shift for being a big help!))
+ ((This gets to the sour part, cheating and giving others and yourself free prizes and/or chips is absolutely forbidden, this has OOC consequences and will likely blacklist you from being important roles in future events. Though dont fear getting punished even if you havent done anything wrong, we will rather let cheaters slip than let honest players get wrongfully punished!)) + +

Sentient prizes

+ Goodness me this is quite the casino huh? Who would have thought one could win other people as a prize? Well you can do just about anything you want with them! Be it just company, some less children friendly company, heck you can even eat them or make them eat you! The options and possibilities are quite frankly limitless!
+ Now you might ask, how does one get these fancy prizes? Well they can be obtained by checking in at the exchange both and see the list of prizes, there might be none, there might be many, it depends on volunteers and losers! This brings us first to volunteers and then to losers!
+ Volunteering is simple! Anyone can walk up to the booth and ask to be a sentient prize, what this means is that you get a nice sum of 250 chips for you to do whatever you want, but someone might come at any point and claim you!
+ Losers are obtained differently, if youre completly busted and have nothing left, you become a prize that the one you lost to can do whatever they want with, this means both gamblers and dealers can end up as a prize, though if for whatever reason you dont become their prize, you get added to the list for someone else to enjoy. Becoming a prize means you also get 100 chips in compensation!

+ + ((Sour part again, but very important. These sentient prizes can be fun, but one thing always dictates how these things goes down, preferences and ooc wants. If preferences dont line up and people dont agree to do winner/loser scene it becomes sentient prize on list. And someone cant win a prize if the prize ooc doesnt want to do what the winner wants to do. We still wish people to try and reach out and try things with new people and/or new things they are comfortable doing, but never shall anyone be forced into a situation they dont want!)) + + + + "} diff --git a/code/game/machinery/computer/timeclock_vr.dm b/code/game/machinery/computer/timeclock_vr.dm index c9e8d3ee26..6e10fdd1f2 100644 --- a/code/game/machinery/computer/timeclock_vr.dm +++ b/code/game/machinery/computer/timeclock_vr.dm @@ -170,6 +170,7 @@ foundjob.current_positions++ var/mob/living/carbon/human/H = usr H.mind.assigned_role = foundjob.title + H.mind.role_alt_title = newjob //TFF 26/7/19 - VOREStation fix port of announcement fix for wrong position announce.autosay("[card.registered_name] has moved On-Duty as [card.assignment].", "Employee Oversight") return @@ -200,6 +201,7 @@ callHook("reassign_employee", list(card)) var/mob/living/carbon/human/H = usr H.mind.assigned_role = ptojob.title + H.mind.role_alt_title = ptojob.title //TFF 26/7/19 - VOREStation fix port of announcement fix for wrong position foundjob.current_positions-- announce.autosay("[card.registered_name], [oldtitle], has moved Off-Duty.", "Employee Oversight") return @@ -208,7 +210,7 @@ if(!card) return FALSE if((world.time - card.last_job_switch) < 15 MINUTES) - to_chat(usr, "You need to wait at least 15 minutes after last duty switch. It has only been [world.time - card.last_job_switch] minutes since you have had your job changed.") + to_chat(usr, "You need to wait at least 15 minutes after last duty switch. It has only been [card.last_job_switch] minutes since you have had your job changed.") return FALSE return TRUE diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 8ffcb5cec4..170c8eef3c 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -13,6 +13,7 @@ icon = 'icons/obj/jukebox.dmi' icon_state = "jukebox2-nopower" var/state_base = "jukebox2" + var/jukebox_edition = "default" anchored = 1 density = 1 power_channel = EQUIP @@ -33,6 +34,12 @@ var/list/datum/track/tracks = list() // Available tracks var/list/datum/track/secret_tracks = list() // Only visible if hacked +/obj/machinery/media/jukebox/casinojukebox + name = "space casino jukebox" + icon = 'icons/obj/casino.dmi' + icon_state = "casinojukebox-nopower" + state_base = "casinojukebox" + /obj/machinery/media/jukebox/New() ..() default_apply_parts() @@ -56,6 +63,24 @@ secret_tracks |= T else tracks |= T + + if(T.casino) + tracks -= T + return + +// On initialization, copy our tracks from the global list +/obj/machinery/media/jukebox/casinojukebox/initialize() + . = ..() + if(all_jukebox_tracks.len < 1) + stat |= BROKEN // No tracks configured this round! + return + // Ootherwise load from the global list! + for(var/datum/track/T in all_jukebox_tracks) + if(!T.casino) + tracks -= T + secret_tracks -= T + if(T.casino) + tracks |= T return /obj/machinery/media/jukebox/process() diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index ba81798495..00d6fb4557 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -112,8 +112,8 @@ qdel(src) /obj/effect/spider/eggcluster/small - spiders_min = 1 - spiders_max = 3 + spiders_min = 2 + spiders_max = 6 /obj/effect/spider/eggcluster/small/frost spider_type = /obj/effect/spider/spiderling/frost diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index d404b5cd44..65a35fa2a3 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -43,17 +43,21 @@ RSF return if (mode == 2) mode = 3 - user << "Changed dispensing mode to 'Paper'" + user << "Changed dispensing mode to 'Metamorphic Glass:Pint'" return if (mode == 3) mode = 4 - user << "Changed dispensing mode to 'Pen'" + user << "Changed dispensing mode to 'Paper'" return if (mode == 4) mode = 5 - user << "Changed dispensing mode to 'Dice Pack'" + user << "Changed dispensing mode to 'Pen'" return if (mode == 5) + mode = 6 + user << "Changed dispensing mode to 'Dice Pack'" + return + if (mode == 6) mode = 1 user << "Changed dispensing mode to 'Cigarette'" return @@ -85,12 +89,15 @@ RSF product = new /obj/item/weapon/reagent_containers/food/drinks/glass2/pint() used_energy = 50 if(3) + product = new /obj/item/weapon/reagent_containers/food/drinks/metaglass/metapint() + used_energy = 50 + if(4) product = new /obj/item/weapon/paper() used_energy = 10 - if(4) + if(5) product = new /obj/item/weapon/pen() used_energy = 50 - if(5) + if(6) product = new /obj/item/weapon/storage/pill_bottle/dice() used_energy = 200 diff --git a/code/game/objects/structures/trash_pile.dm b/code/game/objects/structures/trash_pile.dm index 727dcbb9f4..560357c235 100644 --- a/code/game/objects/structures/trash_pile.dm +++ b/code/game/objects/structures/trash_pile.dm @@ -119,7 +119,10 @@ searchedby += user.ckey I.forceMove(get_turf(src)) to_chat(H,"You found \a [I]!") - + var/disturbed_sleep = rand(1,100) //spawning of mobs, for now only the trash panda. + if(disturbed_sleep <= 5) + new /mob/living/simple_animal/raccoon(get_turf(user),name) + visible_message("A raccoon jumps out of the trash!.") else return ..() diff --git a/code/global_vr.dm b/code/global_vr.dm index 30ebf366e6..3db024786f 100644 --- a/code/global_vr.dm +++ b/code/global_vr.dm @@ -6,4 +6,6 @@ robot_module_types += "Pupdozer" robot_module_types += "Vore Services" //edit chompers robot_module_types += "Medivore" + robot_module_types += "BoozeHound" + robot_module_types += "Service-borg" return 1 diff --git a/code/modules/client/preference_setup/loadout/loadout_general.dm b/code/modules/client/preference_setup/loadout/loadout_general.dm index 34a806fe32..3d1c7416b9 100644 --- a/code/modules/client/preference_setup/loadout/loadout_general.dm +++ b/code/modules/client/preference_setup/loadout/loadout_general.dm @@ -99,3 +99,13 @@ display_name = "Cards Against The Galaxy (black deck)" path = /obj/item/weapon/deck/cah/black description = "The ever-popular Cards Against The Galaxy word game. Warning: may include traces of broken fourth wall. This is the black deck." + +/datum/gear/cagsewhite + display_name = "Cards Against The Galaxy: Special Edition (white deck)" + path = /obj/item/weapon/deck/cagse + description = "The ever-popular Cards Against The Galaxy: Special Edition word game. Warning: may include traces of broken fourth wall and obscenity. This is the white deck." + +/datum/gear/cagseblack + display_name = "Cards Against The Galaxy: Special Edition (black deck)" + path = /obj/item/weapon/deck/cagse/black + description = "The ever-popular Cards Against The Galaxy: Special Edition word game. Warning: may include traces of broken fourth wall and obscenity. This is the black deck." diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm b/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm index a38b489827..58a4874cb0 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm @@ -1,3 +1,16 @@ +//CHOMPEDIT; SYNTH FACEMASK +/datum/gear/mask/synthface/ + display_name = "Synth Facemask(Tesh)" + path = /obj/item/clothing/mask/synthfacemask + sort_category = "Xenowear" + whitelisted = SPECIES_TESHARI + cost = 1 +//CHOMPEDIT; END + +/datum/gear/mask/synthface/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + /datum/gear/uniform/voxcasual display_name = "casual wear (Vox)" path = /obj/item/clothing/under/vox/vox_casual @@ -37,4 +50,4 @@ /datum/gear/uniform/loincloth display_name = "loincloth" path = /obj/item/clothing/suit/storage/fluff/loincloth - sort_category = "Xenowear" \ No newline at end of file + sort_category = "Xenowear" diff --git a/code/modules/clothing/head/misc_ch.dm b/code/modules/clothing/head/misc_ch.dm index a368d50520..6eef69e39d 100644 --- a/code/modules/clothing/head/misc_ch.dm +++ b/code/modules/clothing/head/misc_ch.dm @@ -11,4 +11,12 @@ var/image/so_far = ..() so_far.pixel_y += 16 so_far.pixel_x += 0 - return so_far \ No newline at end of file + return so_far + +/obj/item/clothing/head/soft/purple/wah + name = "assistant cap" + desc = "What a lovely purple cap, its said its given out as a trophy to assistants. Why does that sound so depressing?" + icon_state = "wahcap" + item_state_slots = list(slot_r_hand_str = "wahcap", slot_l_hand_str = "wahcap") + icon = 'icons/obj/clothing/hats_vr.dmi' + icon_override = 'icons/mob/head_vr.dmi' \ No newline at end of file diff --git a/code/modules/clothing/masks/monitor.dm b/code/modules/clothing/masks/monitor.dm index 9b0c94ca03..06527ea58f 100644 --- a/code/modules/clothing/masks/monitor.dm +++ b/code/modules/clothing/masks/monitor.dm @@ -66,4 +66,37 @@ monitor_state_index = initial(monitor_state_index) icon_state = monitor_states[monitor_state_index] var/mob/living/carbon/human/H = loc - if(istype(H)) H.update_inv_wear_mask() \ No newline at end of file + if(istype(H)) H.update_inv_wear_mask() + + +//TESHARI FACE MASK //Defning all the procs in one go +/obj/item/clothing/mask/synthfacemask + name = "Synth Face" + desc = "A round dark muzzle made of LEDs." + body_parts_covered = FACE + icon = 'icons/mob/species/seromi/synth_facemask.dmi' + icon_override = 'icons/mob/species/seromi/synth_facemask.dmi' + icon_state = "synth_facemask" + origin_tech = list(TECH_ILLEGAL = 1) + + equipped() + ..() + var/mob/living/carbon/human/H = loc + if(istype(H) && H.wear_mask == src) + canremove = 0 + dropped() + canremove = 1 + return ..() + mob_can_equip(var/mob/living/carbon/human/user, var/slot) + if (!..()) + return 0 + if(istype(user)) + var/obj/item/organ/external/E = user.organs_by_name[BP_HEAD] + if(istype(E) && (E.robotic >= ORGAN_ROBOT)) + return 1 + user << "You must have a compatible robotic head to install this upgrade." + return 0 + update_icon() + var/mob/living/carbon/human/H = loc + if(istype(H)) H.update_inv_wear_mask() + if (H.stat == DEAD) icon_state = "synth_facemask_dead" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index c5309ffa46..57b0024614 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -853,4 +853,16 @@ /obj/item/clothing/under/cohesion/hazard name = "hazard cohesion suit" desc = "An orange cohesion suit with yellow hazard stripes intended to assist Prometheans in maintaining their form and prevent direct skin exposure." - icon_state = "cohesionsuit_hazard" \ No newline at end of file + icon_state = "cohesionsuit_hazard" + +/obj/item/clothing/under/sexybunny_white + name = "Bunny girl suit" + desc = "this seems to come with extra padding, exaggerating the chest some." + icon_state = "sexybunny_white" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + +/obj/item/clothing/under/sexybunny_black + name = "Bunny girl suit" + desc = "this seems to come with extra padding, exaggerating the chest some." + icon_state = "sexybunny_black" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS \ No newline at end of file diff --git a/code/modules/economy/casinocash.dm b/code/modules/economy/casinocash.dm new file mode 100644 index 0000000000..cefa530164 --- /dev/null +++ b/code/modules/economy/casinocash.dm @@ -0,0 +1,173 @@ +/obj/item/weapon/spacecasinocash + name = "broken casino chip" + desc = "It's worth nothing in a casino." + gender = PLURAL + icon = 'icons/obj/casino.dmi' + icon_state = "spacecasinocash1" + opacity = 0 + density = 0 + anchored = 0.0 + force = 1.0 + throwforce = 1.0 + throw_speed = 1 + throw_range = 2 + w_class = ITEMSIZE_SMALL + var/access = list() + access = access_crate_cash + var/worth = 0 + +/obj/item/weapon/spacecasinocash/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/spacecasinocash)) + if(istype(W, /obj/item/weapon/spacecasinocash/ewallet)) return 0 + + var/obj/item/weapon/spacecasinocash/SC = W + + SC.adjust_worth(src.worth) + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/h_user = user + + h_user.drop_from_inventory(src) + h_user.drop_from_inventory(SC) + h_user.put_in_hands(SC) + user << "You combine the casino chips to a stack of [SC.worth] of credits." + qdel(src) + +/obj/item/weapon/spacecasinocash/update_icon() + overlays.Cut() + name = "[worth] casino credit\s" + if(worth in list(1000,500,200,100,50,20,10,1)) + icon_state = "spacecasinocash[worth]" + desc = "It's a stack of casino chips with a combined value of [worth] credits." + return + var/sum = src.worth + var/num = 0 + for(var/i in list(1000,500,200,100,50,20,10,1)) + while(sum >= i && num < 50) + sum -= i + num++ + var/image/banknote = image('icons/obj/casino.dmi', "spacecasinocash[i]") + var/matrix/M = matrix() + M.Translate(rand(-6, 6), rand(-4, 8)) + M.Turn(pick(-45, -27.5, 0, 0, 0, 0, 0, 0, 0, 27.5, 45)) + banknote.transform = M + src.overlays += banknote + if(num == 0) // Less than one credit, let's just make it look like 1 for ease + var/image/banknote = image('icons/obj/casino.dmi', "spacecasinocash1") + var/matrix/M = matrix() + M.Translate(rand(-6, 6), rand(-4, 8)) + M.Turn(pick(-45, -27.5, 0, 0, 0, 0, 0, 0, 0, 27.5, 45)) + banknote.transform = M + src.overlays += banknote + src.desc = "They are worth [worth] of credits." + +/obj/item/weapon/spacecasinocash/proc/adjust_worth(var/adjust_worth = 0, var/update = 1) + worth += adjust_worth + if(worth > 0) + if(update) + update_icon() + return worth + else + qdel(src) + return 0 + +/obj/item/weapon/spacecasinocash/proc/set_worth(var/new_worth = 0, var/update = 1) + worth = max(0, new_worth) + if(update) + update_icon() + return worth + +/obj/item/weapon/spacecasinocash/attack_self() + var/amount = input(usr, "How much credits worth of chips do you want to take? (0 to [src.worth])", "Take chips", 20) as num + amount = round(Clamp(amount, 0, src.worth)) + + if(!amount) + return + + adjust_worth(-amount) + var/obj/item/weapon/spacecasinocash/SC = new (usr.loc) + SC.set_worth(amount) + usr.put_in_hands(SC) + +/obj/item/weapon/spacecasinocash/c1 + name = "1 credit casino chip" + icon_state = "spacecasinocash1" + desc = "It's worth 1 credit." + worth = 1 + +/obj/item/weapon/spacecasinocash/c10 + name = "10 credit casino chip" + icon_state = "spacecasinocash10" + desc = "It's worth 10 credits." + worth = 10 + +/obj/item/weapon/spacecasinocash/c20 + name = "20 credit casino chip" + icon_state = "spacecasinocash20" + desc = "It's worth 20 credits." + worth = 20 + +/obj/item/weapon/spacecasinocash/c50 + name = "50 credit casino chip" + icon_state = "spacecasinocash50" + desc = "It's worth 50 credits." + worth = 50 + +/obj/item/weapon/spacecasinocash/c100 + name = "100 credit casino chip" + icon_state = "spacecasinocash100" + desc = "It's worth 100 credits." + worth = 100 + +/obj/item/weapon/spacecasinocash/c200 + name = "200 credit casino chip" + icon_state = "spacecasinocash200" + desc = "It's worth 200 credits." + worth = 200 + +/obj/item/weapon/spacecasinocash/c500 + name = "500 credit casino chip" + icon_state = "spacecasinocash500" + desc = "It's worth 500 credits." + worth = 500 + +/obj/item/weapon/spacecasinocash/c1000 + name = "1000 credit casino chip" + icon_state = "spacecasinocash1000" + desc = "It's worth 1000 credits." + worth = 1000 + +proc/spawn_casinochips(var/sum, spawnloc, mob/living/carbon/human/human_user as mob) + var/obj/item/weapon/spacecasinocash/SC = new (spawnloc) + + SC.set_worth(sum) + if (ishuman(human_user) && !human_user.get_active_hand()) + human_user.put_in_hands(SC) + return + +/obj/item/weapon/spacecasinocash/ewallet + name = "Casino chip card" + icon_state = "efundcard" + desc = "A casino card that can hold credits." + var/owner_name = "" //So the ATM can set it so the EFTPOS can put a valid name on transactions. + attack_self() return //Don't act + attackby() return //like actual + update_icon() return //space cash + +/obj/item/weapon/spacecasinocash/ewallet/examine(mob/user) + ..(user) + if (!(user in view(2)) && user!=src.loc) return + user << "Casino chip card's owner: [src.owner_name]. credits remaining: [src.worth]." + +/obj/item/weapon/casin_platinum_chip + name = "platinum chip" + desc = "Ringa-a-Ding-Ding!" + icon = 'icons/obj/casino.dmi' + icon_state = "platinum_chip" + opacity = 0 + density = 0 + anchored = 0.0 + force = 1.0 + throwforce = 1.0 + throw_speed = 1 + throw_range = 2 + w_class = ITEMSIZE_SMALL \ No newline at end of file diff --git a/code/modules/events/event_container_vr.dm b/code/modules/events/event_container_vr.dm index c8986bc063..fc9a5a0ba0 100644 --- a/code/modules/events/event_container_vr.dm +++ b/code/modules/events/event_container_vr.dm @@ -1,148 +1,150 @@ -#define ASSIGNMENT_ANY "Any" -#define ASSIGNMENT_AI "AI" -#define ASSIGNMENT_CYBORG "Cyborg" -#define ASSIGNMENT_ENGINEER "Engineer" -#define ASSIGNMENT_GARDENER "Gardener" -#define ASSIGNMENT_JANITOR "Janitor" -#define ASSIGNMENT_MEDICAL "Medical" -#define ASSIGNMENT_SCIENTIST "Scientist" -#define ASSIGNMENT_SECURITY "Security" -#define ASSIGNMENT_HOS "Head of Security" -#define ASSIGNMENT_WARDEN "Warden" - -// -// VOREStation overrides to the default event manager configuration. -// -// This file lets us configure which events we want in the rotation without conflicts with upstream. -// It works because the actual event containers don't define New(), allowing us to use New() to replace -// the lists of available events. If they ever do define New() this will need to be changed. -// -// Specifically the change is to move events we don't want down into the disabled_events list -// - -// Adds a list of pre-disabled events to the available events list. -// This keeps them in the rotation, but disabled, so they can be enabled with a click if desired that round. -/datum/event_container/proc/add_disabled_events(var/list/disabled_events) - for(var/datum/event_meta/EM in disabled_events) - EM.enabled = 0 - available_events += EM - -/datum/event_container/mundane/New() - available_events = list( - // Severity level, event name, even type, base weight, role weights, one shot, min weight, max weight. Last two only used if set and non-zero - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 200), - // Bluescreens APCs, but they still work - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "APC Damage", /datum/event/apc_damage, 20, list(ASSIGNMENT_ENGINEER = 20)), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Brand Intelligence",/datum/event/brand_intelligence,20, list(ASSIGNMENT_JANITOR = 25), 1), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_AI = 40)), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Canister Leak", /datum/event/canister_leak, 10, list(ASSIGNMENT_ENGINEER = 20)), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Economic News", /datum/event/economic_event, 300), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Electrified Door", /datum/event/electrified_door, -5, list(ASSIGNMENT_MEDICAL = 5, ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_AI = 10)), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 40), 1), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Meteor Shower", /datum/event/meteor_wave, 20, list(ASSIGNMENT_ENGINEER = 30), 1), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Supply Demand", /datum/event/supply_demand, -15, list(ASSIGNMENT_ANY = 1, ASSIGNMENT_ENGINEER = 5, ASSIGNMENT_MEDICAL = 5), 1), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400), - // Spawns mice, or lizards. - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100), 1), - //Split spiderlings off from the vermin infestation event into its own thing, triggered only by security. - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Spiderling Infestation",/datum/event/spiderling_infestation, 0, list(ASSIGNMENT_SECURITY = 50), 1), - // Rot only weakens walls, not destroy them - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 30, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50), 1), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Window Damage", /datum/event/window_break, 10, list(ASSIGNMENT_ENGINEER = 20)), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Viral Infection", /datum/event/viral_infection, -25, list(ASSIGNMENT_MEDICAL = 5), 1), - ) - add_disabled_events(list( - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 1, list(), 1), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 1, 25, 50), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 50, list(ASSIGNMENT_ENGINEER = 20), 1, 0, 50), - )) - -/datum/event_container/moderate/New() - available_events = list( - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 800), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, -10, list(ASSIGNMENT_MEDICAL = 30), 1), - // Leaks gas into an unoccupied room. - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Atmos Leak", /datum/event/atmos_leak, 60, list(ASSIGNMENT_ENGINEER = 25), 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_AI = 40)), - // Just disables comms for a short while. - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 50, list(ASSIGNMENT_AI = 150, ASSIGNMENT_SECURITY = 120), 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, -20, list(ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_SECURITY = 30, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 5), 1), - // Just blows out a few lights - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 60, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 150), 1), - // This one is just too fun. - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Escaped Slimes", /datum/event/escaped_slimes, -40, list(ASSIGNMENT_SCIENTIST = 40, ASSIGNMENT_SECURITY = 30)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravity Failure", /datum/event/gravity, 65, list(ASSIGNMENT_ENGINEER = 10), 1), - // Temporary power failure, but mitigatead by subgrids - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 40, list(ASSIGNMENT_SCIENTIST = 10, ASSIGNMENT_ENGINEER = 25), 1), - //Evil grubs that drain station power slightly - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, -20, list(ASSIGNMENT_SECURITY = 40, ASSIGNMENT_ENGINEER = 40), 1), - // Pure RP fun, no mechanical effects. - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, -50, list(ASSIGNMENT_AI = 200, ASSIGNMENT_CYBORG = 100, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5), 0), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, -20, list(ASSIGNMENT_ENGINEER = 40), 1), - //New CHOMPStation event. Mice grow into rats. - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Mutants", /datum/event/mutants, 20, list(ASSIGNMENT_ANY = 15, ASSIGNMENT_SECURITY = 50), 1), - // Opens doors in brig. So just RP fun - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, -10, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_ENGINEER = 20), 1), - // Not bad (dorms are shielded) but inconvenient - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 35), 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, -30, list(ASSIGNMENT_SECURITY = 25, ASSIGNMENT_HOS = 35, ASSIGNMENT_WARDEN = 35)), - // Radiation, but only in space. - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Solar Storm", /datum/event/solar_storm, 5, list(ASSIGNMENT_ENGINEER = 40, ASSIGNMENT_SECURITY = 30), 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, -20, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_HOS = 20, ASSIGNMENT_WARDEN = 20), 0), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Viral Infection", /datum/event/viral_infection, -40, list(ASSIGNMENT_MEDICAL = 50), 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, -10, list(ASSIGNMENT_MEDICAL = 30, ASSIGNMENT_ENGINEER = 20), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50), 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Wormholes", /datum/event/wormholes, 20, list(ASSIGNMENT_ANY = 5)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, -10, list(ASSIGNMENT_SCIENCE = 30, ASSIGNMENT_ENGINEER = 20), 1), - ) - add_disabled_events(list( - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School_NoRequirements", /datum/event/carp_migration, 100, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_SECURITY = 30), 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Escaped Slimes_NoRequirements", /datum/event/escaped_slimes, 30, list(ASSIGNMENT_SCIENTIST = 40, ASSIGNMENT_SECURITY = 30)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower_NoRequirements", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 20), 0), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation_NoRequirements", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 40), 0), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Random Antagonist", /datum/event/random_antag, 3, list(ASSIGNMENT_SECURITY = 1), 1, 0, 5), - )) - -/datum/event_container/major/New() - available_events = list( - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 900), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Atmos Leak", /datum/event/atmos_leak, 5, list(ASSIGNMENT_ENGINEER = 35), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, -100, list(ASSIGNMENT_SECURITY = 40, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10, ASSIGNMENT_ENGINEER = 5), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Boss", /datum/event/boss, -110, list(ASSIGNMENT_SECURITY = 50, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, -110, list(ASSIGNMENT_SECURITY = 50, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station,0, list(ASSIGNMENT_ANY = 5), 0), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Escaped Slimes", /datum/event/escaped_slimes, -50, list(ASSIGNMENT_SCIENTIST = 30, ASSIGNMENT_SECURITY = 30), 1), - // TFF: Virgo event commented out. Technically meant for Tether maps, not Polaris. - // new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Strike", /datum/event/meteor_strike, 10, list(ASSIGNMENT_ENGINEER = 15), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 15), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Metroid Infestation", /datum/event/metroid_infestation, -75, list(ASSIGNMENT_SECURITY = 35, ASSIGNMENT_SCIENCE = 20, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 0), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 20, list(ASSIGNMENT_ENGINEER = 15), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Spider Infestation", /datum/event/spider_infestation, -35, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 0), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection", /datum/event/viral_infection, -50, list(ASSIGNMENT_MEDICAL = 25), 1), - ) - add_disabled_events(list( - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob_NoRequirements", /datum/event/blob, 10, list(ASSIGNMENT_SECURITY = 10, ASSIGNMENT_ENGINEER = 30), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration_NoRequirements", /datum/event/carp_migration, 10, list(ASSIGNMENT_SECURITY = 10), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Escaped Slimes_NoRequirements", /datum/event/escaped_slimes, 30, list(ASSIGNMENT_SCIENTIST = 10, ASSIGNMENT_SECURITY = 5)), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave_NoRequirements", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 30), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Spider Infestation_NoRequirements", /datum/event/spider_infestation, 30, list(ASSIGNMENT_SECURITY = 10), 0), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection_NoRequirements", /datum/event/viral_infection, 50, list(ASSIGNMENT_MEDICAL = 50), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Dust", /datum/event/dust, 50, list(ASSIGNMENT_ENGINEER = 30), 0), - )) - -#undef ASSIGNMENT_ANY -#undef ASSIGNMENT_AI -#undef ASSIGNMENT_CYBORG -#undef ASSIGNMENT_ENGINEER -#undef ASSIGNMENT_GARDENER -#undef ASSIGNMENT_JANITOR -#undef ASSIGNMENT_MEDICAL -#undef ASSIGNMENT_SCIENTIST -#undef ASSIGNMENT_SECURITY -#undef ASSIGNMENT_HOS +#define ASSIGNMENT_ANY "Any" +#define ASSIGNMENT_AI "AI" +#define ASSIGNMENT_CYBORG "Cyborg" +#define ASSIGNMENT_ENGINEER "Engineer" +#define ASSIGNMENT_GARDENER "Gardener" +#define ASSIGNMENT_JANITOR "Janitor" +#define ASSIGNMENT_MEDICAL "Medical" +#define ASSIGNMENT_SCIENTIST "Scientist" +#define ASSIGNMENT_SECURITY "Security" +#define ASSIGNMENT_HOS "Head of Security" +#define ASSIGNMENT_WARDEN "Warden" + +// +// VOREStation overrides to the default event manager configuration. +// +// This file lets us configure which events we want in the rotation without conflicts with upstream. +// It works because the actual event containers don't define New(), allowing us to use New() to replace +// the lists of available events. If they ever do define New() this will need to be changed. +// +// Specifically the change is to move events we don't want down into the disabled_events list +// + +// Adds a list of pre-disabled events to the available events list. +// This keeps them in the rotation, but disabled, so they can be enabled with a click if desired that round. +/datum/event_container/proc/add_disabled_events(var/list/disabled_events) + for(var/datum/event_meta/EM in disabled_events) + EM.enabled = 0 + available_events += EM + +/datum/event_container/mundane/New() + available_events = list( + // Severity level, event name, even type, base weight, role weights, one shot, min weight, max weight. Last two only used if set and non-zero + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 200), + // Bluescreens APCs, but they still work + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "APC Damage", /datum/event/apc_damage, 20, list(ASSIGNMENT_ENGINEER = 20)), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Brand Intelligence",/datum/event/brand_intelligence,20, list(ASSIGNMENT_JANITOR = 25), 1), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_AI = 40)), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Canister Leak", /datum/event/canister_leak, 10, list(ASSIGNMENT_ENGINEER = 20)), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Economic News", /datum/event/economic_event, 300), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Electrified Door", /datum/event/electrified_door, -5, list(ASSIGNMENT_MEDICAL = 5, ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_AI = 10)), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 40), 1), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Meteor Shower", /datum/event/meteor_wave, -20, list(ASSIGNMENT_ENGINEER = 50), 1), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Supply Demand", /datum/event/supply_demand, -15, list(ASSIGNMENT_ANY = 1, ASSIGNMENT_ENGINEER = 5, ASSIGNMENT_MEDICAL = 5), 1), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400), + // Spawns mice, or lizards. + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100), 1), + //Split spiderlings off from the vermin infestation event into its own thing, triggered only by security. + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Spiderling Infestation",/datum/event/spiderling_infestation, -30, list(ASSIGNMENT_SECURITY = 25), 1), + // Rot only weakens walls, not destroy them + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 30, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50), 1), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Window Damage", /datum/event/window_break, 10, list(ASSIGNMENT_ENGINEER = 20)), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Viral Infection", /datum/event/viral_infection, -25, list(ASSIGNMENT_MEDICAL = 5), 1), + ) + add_disabled_events(list( + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 1, list(), 1), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 1, 25, 50), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 50, list(ASSIGNMENT_ENGINEER = 20), 1, 0, 50), + )) + +/datum/event_container/moderate/New() + available_events = list( + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 800), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, -10, list(ASSIGNMENT_MEDICAL = 30), 1), + // Leaks gas into an unoccupied room. + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Atmos Leak", /datum/event/atmos_leak, 60, list(ASSIGNMENT_ENGINEER = 25), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_AI = 40)), + // Just disables comms for a short while. + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 50, list(ASSIGNMENT_AI = 150, ASSIGNMENT_SECURITY = 120), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, -20, list(ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_SECURITY = 30, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 5), 1), + // Just blows out a few lights + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 60, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 150), 1), + // This one is just too fun. + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravity Failure", /datum/event/gravity, 65, list(ASSIGNMENT_ENGINEER = 10), 1), + // Temporary power failure, but mitigatead by subgrids + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 40, list(ASSIGNMENT_SCIENTIST = 10, ASSIGNMENT_ENGINEER = 25), 1), + //Evil grubs that drain station power slightly + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, -20, list(ASSIGNMENT_SECURITY = 40, ASSIGNMENT_ENGINEER = 40), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Escaped Slimes", /datum/event/escaped_slimes, -40, list(ASSIGNMENT_SCIENTIST = 30, ASSIGNMENT_SECURITY = 20)), + // Pure RP fun, no mechanical effects. + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, -50, list(ASSIGNMENT_AI = 200, ASSIGNMENT_CYBORG = 100, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5), 0), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, -50, list(ASSIGNMENT_ENGINEER = 45), 1), + //New CHOMPStation event. Mice grow into rats. + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Mutants", /datum/event/mutants, 20, list(ASSIGNMENT_ANY = 15, ASSIGNMENT_SECURITY = 50), 1), + // Opens doors in brig. So just RP fun + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, -10, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_ENGINEER = 20), 1), + // Not bad (dorms are shielded) but inconvenient + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 35), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, -30, list(ASSIGNMENT_SECURITY = 25, ASSIGNMENT_HOS = 35, ASSIGNMENT_WARDEN = 35)), + // Radiation, but only in space. + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Solar Storm", /datum/event/solar_storm, 5, list(ASSIGNMENT_ENGINEER = 40, ASSIGNMENT_SECURITY = 30), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Viral Infection", /datum/event/viral_infection, -60, list(ASSIGNMENT_MEDICAL = 50), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, -10, list(ASSIGNMENT_MEDICAL = 30, ASSIGNMENT_ENGINEER = 20), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Wormholes", /datum/event/wormholes, 20, list(ASSIGNMENT_ANY = 5)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, -10, list(ASSIGNMENT_SCIENCE = 30, ASSIGNMENT_ENGINEER = 20), 1), + ) + add_disabled_events(list( + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School_NoRequirements", /datum/event/carp_migration, 100, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_SECURITY = 30), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Escaped Slimes_NoRequirements", /datum/event/escaped_slimes, 30, list(ASSIGNMENT_SCIENTIST = 40, ASSIGNMENT_SECURITY = 30)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower_NoRequirements", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 20), 0), + //Moved spider infestation to disabled for now due to CHOMP random event rebalancing. + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, -20, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_HOS = 20, ASSIGNMENT_WARDEN = 20), 0), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation_NoRequirements", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 40), 0), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Random Antagonist", /datum/event/random_antag, 3, list(ASSIGNMENT_SECURITY = 1), 1, 0, 5), + )) + +/datum/event_container/major/New() + available_events = list( + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 900), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Atmos Leak", /datum/event/atmos_leak, 5, list(ASSIGNMENT_ENGINEER = 35), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, -100, list(ASSIGNMENT_SECURITY = 40, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10, ASSIGNMENT_ENGINEER = 5), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Boss", /datum/event/boss, -110, list(ASSIGNMENT_SECURITY = 50, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, -110, list(ASSIGNMENT_SECURITY = 50, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station,0, list(ASSIGNMENT_ANY = 5), 0), + // TFF: Virgo event commented out. Technically meant for Tether maps, not Polaris. + // new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Strike", /datum/event/meteor_strike, 10, list(ASSIGNMENT_ENGINEER = 15), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, -110, list(ASSIGNMENT_ENGINEER = 50), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Metroid Infestation", /datum/event/metroid_infestation, -75, list(ASSIGNMENT_SECURITY = 35, ASSIGNMENT_SCIENCE = 20, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 20, list(ASSIGNMENT_ENGINEER = 15), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Spider Infestation", /datum/event/spider_infestation, -45, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection", /datum/event/viral_infection, -50, list(ASSIGNMENT_MEDICAL = 25), 1), + ) + add_disabled_events(list( + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob_NoRequirements", /datum/event/blob, 10, list(ASSIGNMENT_SECURITY = 10, ASSIGNMENT_ENGINEER = 30), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration_NoRequirements", /datum/event/carp_migration, 10, list(ASSIGNMENT_SECURITY = 10), 1), + //Moved escaped slimes to disabled for now due to CHOMP random event rebalancing. + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Escaped Slimes", /datum/event/escaped_slimes, -50, list(ASSIGNMENT_SCIENTIST = 30, ASSIGNMENT_SECURITY = 30), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Escaped Slimes_NoRequirements", /datum/event/escaped_slimes, 30, list(ASSIGNMENT_SCIENTIST = 10, ASSIGNMENT_SECURITY = 5)), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave_NoRequirements", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 30), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Spider Infestation_NoRequirements", /datum/event/spider_infestation, 30, list(ASSIGNMENT_SECURITY = 10), 0), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection_NoRequirements", /datum/event/viral_infection, 50, list(ASSIGNMENT_MEDICAL = 50), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Dust", /datum/event/dust, 50, list(ASSIGNMENT_ENGINEER = 30), 0), + )) + +#undef ASSIGNMENT_ANY +#undef ASSIGNMENT_AI +#undef ASSIGNMENT_CYBORG +#undef ASSIGNMENT_ENGINEER +#undef ASSIGNMENT_GARDENER +#undef ASSIGNMENT_JANITOR +#undef ASSIGNMENT_MEDICAL +#undef ASSIGNMENT_SCIENTIST +#undef ASSIGNMENT_SECURITY +#undef ASSIGNMENT_HOS #undef ASSIGNMENT_WARDEN \ No newline at end of file diff --git a/code/modules/games/cagse.dm b/code/modules/games/cagse.dm new file mode 100644 index 0000000000..645936d773 --- /dev/null +++ b/code/modules/games/cagse.dm @@ -0,0 +1,32 @@ +// This is a parody of Cards Against Humanity (https://en.wikipedia.org/wiki/Cards_Against_Humanity) +// which is licensed under CC BY-NC-SA 2.0, the full text of which can be found at the following URL: +// https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode + +/obj/item/weapon/deck/cagse + name = "\improper CAG:SE deck (white)" + desc = "The ever-popular Cards Against The Galaxy: Special Edition word game. Warning: may include traces of broken fourth wall and obscenity. This is the white deck." + icon_state = "cag_white" + var/blanks = 10 //5 extra blank cards than usual to make up for quantity + +/obj/item/weapon/deck/cagse/black + name = "\improper CAG:SE deck (black)" + desc = "The ever-popular Cards Against The Galaxy: Special Edition word game. Warning: may include traces of broken fourth wall and obscenity. This is the black deck." + icon_state = "cag_black" + blanks = 0 + +/obj/item/weapon/deck/cagse/New() + ..() + var/datum/playingcard/P + for(var/cardtext in card_text_list) + P = new() + P.name = "[cardtext]" + P.card_icon = "[icon_state]_card" + P.back_icon = "[icon_state]_card_back" + cards += P + if(!blanks) + return + for(var/x=1 to blanks) + P = new() + P.name = "Blank Card" + P.card_icon = "[icon_state]_card_back" + P.back_icon = "[icon_state]_card_back" \ No newline at end of file diff --git a/code/modules/games/cagse_black_cards.dm b/code/modules/games/cagse_black_cards.dm new file mode 100644 index 0000000000..ded3730607 --- /dev/null +++ b/code/modules/games/cagse_black_cards.dm @@ -0,0 +1,71 @@ +/obj/item/weapon/deck/cagse/black/card_text_list = list( + "Why am I itchy?", + "Today, Security shot ____.", + "The Chaplain this shift is worshiping _____.", + "Cargo ordered a crate full of _____.", + "An ERT was called due to ______.", + "Alert! The Colony Director has armed themselves with _____.", + "Current Laws: ________ is your master.", + "Current Laws: ________ is the enemy.", + "_____ vented the entirety of Cargo.", + "Today, science found an anomaly that made people ____ and ____.", + "There was a rap battle between ____ and ____.", + "Caution, ______ have been detected in collision course with the station.", + "Today's kitchen menu includes _______.", + "What did the mercenaries want when they attacked the station?", + "I think the Colony Director is insane. He just demanded ______ in his office.", + "Fuckin' scientists, they just turned Misc. Research into _______ .", + "What's my fetish?", + "Hello, _______ here with _______", + "No one else was at _______, they wouldn't understand the ______", + "Why am I shivering?", + "What is this world coming to? First, ________, now _______", + "NanoTrasen's labor union decided to use _____ to raise employee morale.", + "The Chemist's drug of choice is ______", + "It is common practice for _______ to ______ on Moghes.", + "Mercurial Colonies are _____.", + "The Skrell are celebrating _____ today.", + "_____ is/are why I'm afraid of the maintenance tunnels.", + "_____ used ____ to create their newest invention, _____!", + "Scientists are not allowed to make Gatling _____.", + "It's not a party until the ____ arrive.", + "No matter how many Tajaran you have, _____ is never acceptable.", + "No, the AI's first law is NOT to serve _____.", + "The robots are not disposal bins for your _____.", + "You can never have too many _____ on shift.", + + //Above are the custom cards from VOREStation, below are from CHOMPStation + + "I had a confused boner after the Overseer showed me a video of _____.", + "Right after being resleeved by the CMO, I was _____.", + "R&D finally came around and developed _____.", + "After accidentally touching the supermatter crystal, the first thing I saw in the afterlife was _____.", + "In order to appear friendlier towards the crew, security officers started offering complimentary _____.", + "Since nobody ever sets their suit sensors, Medbay has resorted to using _____ as encouragement.", + "New rule at the bar: _____ is now forbidden.", + "The bartender fired two beanbag shells into a patron after they were seen doing _____.", + "After becoming good friends with the Head of Security, they finally let me see their _____ collection.", + "(Pick 2) ATTENTION: The clown is now wanted for possession of _____ and _____.", + "After being caught growing ambrosia, the botanist resorted to recreational _____ to cope.", + "I never expected to find _____ in maintenance.", + "Nobody was heard from again after _____ escaped from xenobiology.", + "_____: Everyone does it.", + "(Pick 2) In exchange for _____, the chef gave me _____.", + "Due to an operating procedure misunderstanding, security officers have been using _____ to process their prisoners.", + "The roboticist keeps building cyborgs to satisfy his _____ fetish, instead of building mechs.", + "Dare dice always ends with _____.", + "The newest rule for dare dice means that the second lowest roller has to wear nothing but _____.", + //Official cards below here + "(Pick 2) Before _____, all we had was_____.", + "(Pick 2) That's right I killed _____. How, you ask? _____.", + "What brought the orgy to a grinding halt?", + "What don't you want to find in your Chinese food?", + "What has been making life difficult at the nudist colony?", + "What's that sound?", + "What's the new fad diet?", + "(Pick 2) Listen, son. If you want to get involved with _____, I won’t stop you. Just steer clear of _____.", + "(Pick 2) Having problems with _____? Try _____!", + "(Pick 2) After months of practice with _____, I think I’m finally ready for _____.", + "Finally! A service that delivers _____ right to your door." + +) \ No newline at end of file diff --git a/code/modules/games/cagse_white_cards.dm b/code/modules/games/cagse_white_cards.dm new file mode 100644 index 0000000000..503af8842a --- /dev/null +++ b/code/modules/games/cagse_white_cards.dm @@ -0,0 +1,211 @@ +/obj/item/weapon/deck/cagse/var/list/card_text_list = list( + "Those motherfucking carp", + "Having sex in the maintenance tunnels", + "Space 'Nam", + "Space lesbians", + "The Gardener getting SUPER high", + "The Colony Director thinking they're a badass", + "Being in a cult", + "Racially biased lawsets", + "An Unathi who WON'T STOP FIGHTING", + "Tajaran fetishists", + "Bald thirty-year-olds", + "A Chief Engineer who can't setup the engine", + "Being sucked out into space", + "Officer Beepsky", + "Engineering", + "The grey tide.", + "The Research Director", + "Fucking synths", + "Man-eating purple pod plants", + "Chemical sprayers filled with lube", + "Librarians", + "Squids", + "Cats", + "Lizards", + "Apes", + "Trees", + "Supermatter undergarments", + "Bluespace", + "Five hundred rabid spiders", + "Five hundred rabid diona nymphs", + "Cable ties", + "Rampant vending machines", + "Positronic drink coasters", + "Kitchen utensil anomalies", + "Locked lockers", + "Energy spatulas", + "Flashbang gauntlets", + "Carp", + "Space whales", + "Blu-sharks", + "Fax machines", + "Exquisite Pens", + "Dr. Maxman's male enhancements", + "Gyrating slimes", + "Forehead-mounted laser weaponry", + "Pelvis-mounted laser weaponry", + "Cardboard cutouts", + "An obscene amount of rubber ducks", + "Brain cakes", + "A drone's game of life.", + "Anomaly suits", + "A gardener smoking reishi", + "Military-grade baseball bats", + "Barricading the bar", + "An irritatingly chipper robot", + "Androids hanging out in the bar drinking beer", + "Gear harnesses", + "A seventeen-year-old Colony Director", + "The throbbing erection that the HoS gets at the thought of shooting something", + "Trying to stab someone and hugging them instead", + "Waking up naked in the maintenance tunnels", + "Horrible cloning accidents", + "Licking the supermatter due to a dare", + "A Quartermaster who WON'T STOP ordering guns", + "Teaching a synthetic the Birds and the Bees", + "Unnecessary surgery", + "My addiction to spiders", + "Wetskrell.nt", + "DOCTOR MAXMAN!", + "A group of Skrell getting their squish on", + "Enough soporific to put the entire station down", + "Delicious Vietnamese cuisine", + //Above are the custom cards from VOREStation, below are from CHOMPStation + "Upside-down bat cock vore", + "Wingjobs", + "The HoP feeding someone to Ian after asking for all access", + "Being used as fuel instead of being healed by a medihound", + "Stealing a set of tools", + "Spying on the dorms with hidden cameras", + "Stealing all access", + "Curling up in a belly for hours", + "Being squeezed down a tight throat", + "Being forced down the bartender's cock", + "zip-tying the captain and dragging them into maintenance", + "Shoving micros down any available orifice", + "Being shoved down a K9 cyborg's gullet without consent", + "Tripping in the halls so a medihound eats you", + "Lying on a table until someone eats you", + "forgetting your backup implant", + "Leaving your suit sensors off", + "Turning your suit sensors to tracking", + "Giving the clown the spare ID", + "Happily letting yourself be digested just because someone was hungry", + "Waking up inside a pair of giant nuts", + "A shock collar that never turns off", + "A size gun without a limiter", + "Cock vore", + "A slimy tongue", + "Being digested into spunk under the bar counter", + "Maintenance trash pile loot", + "voring all your friends", + "Digesting all your friends", + "Getting fucked from behind right in the bar", + "Actually using a dorm room", + "Swallowing enough cum to fill a pool", + "Giving away the frequency for your shock collar", + "Ten foot tall sergals", + "Knotted dog cock", + "Modular, synthetic, prehensile cocks", + "Tail maws", + "Pants pockets", + "Not wearing anything", + "Using a nudity permit just because you want to be naked", + "Nudity", + "Autofellatio", + "Clit dicks", + "Teshari terrorists", + "Being used as a tap at the bar", + "Being suffocated by a tight gut", + "Slurping noises", + "Listening to someone slowly digest", + "Not asking if your prey is backup implanted", + "A person-sized load of cum", + "Horse cocks", + "A digested ID card", + "Canine pussy", + "Horse pussy", + "All of medbay being eaten", + "Getting space aids", + "Being consumed by a deathclaw", + "A traitor consuming every last crew member", + "flooding the hallways with wolf cum", + "The Skrell doing Skrell things", + "Slimy xenomorph ovipositors", + "Lusty xenomorph maids", + "Steamy bareback sex", + "Anal beads", + "Being kidnapped after someone slips neurotoxin into your drink", + "A woman who surprisingly doesn’t have a penis", + "A man who surprisingly doesn’t have a penis", + "Literally xenomorphs", + "A blowjob", + "Actually using a condom", + "Metroids again", + "Driving cargo tugs around like race cars", + "Using your fat friend to try and start the singularity engine", + "A latex maid costume", + "A realistic xenomorph costume", + "A seductive bee costume", + "A cake hat", + "A synthetic strapon with ten thousand different shapes", + "A condom", + "High heels", + "Thigh high socks", + "A swimsuit consisting of just a thong", + "A cone hat", + "Crawling into the mouth of a sleeping crewmember", + "A full toolbelt", + "A dildo", + "fuzzy cuffs", + "BDSM", + "Being constricted by a giant serpent tail", + "Bulges", + "A bartender", + "An EMT", + "A clown", + "A person AI", + "The station AI", + "Anatomically correct", + "Toe beans", + "Paws", + "Slow digestion", + //And everything beyond this are cards from the original CAH that fit well enough with the other cards + "A 55-gallon drum of lube.", + "A cooler full of organs.", + "A gentle caress of the inner thigh.", + "A homoerotic volleyball montage.", + "A hot mess.", + "A mating display.", + "A tiny horse.", + "A zesty breakfast burrito.", + "An erection that lasts more than four hours.", + "Anal beads.", + "Balls.", + "Basic human decency.", + "Beating your wives.", + "Being awesome at sex.", + "Bitches.", + "Centaurs.", + "Civilian casualties.", + "Daddy issues.", + "Date rape.", + "Exactly what you'd expect.", + "Getting so angry that you pop a boner.", + "Gloryholes.", + "Good grammar.", + "Intimacy problems.", + "Just the tip.", + "Lactation.", + "My hot cousin.", + "Natural male enhancement.", + "My vagina.", + "Panda sex.", + "Sexting.", + "Shaft.", + "Tongue.", + "A cop who is also a dog.", + "A vagina that leads to another dimension.", + "Blowing some dudes in an alley." +) \ No newline at end of file diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm index bd4b48893f..a761ad73c1 100644 --- a/code/modules/hydroponics/spreading/spreading_growth.dm +++ b/code/modules/hydroponics/spreading/spreading_growth.dm @@ -1,166 +1,175 @@ -#define NEIGHBOR_REFRESH_TIME 100 - -/obj/effect/plant/proc/get_cardinal_neighbors() - var/list/cardinal_neighbors = list() - for(var/check_dir in cardinal) - var/turf/simulated/T = get_step(get_turf(src), check_dir) - if(istype(T)) - cardinal_neighbors |= T - return cardinal_neighbors - -/obj/effect/plant/proc/update_neighbors() - // Update our list of valid neighboring turfs. - neighbors = list() - for(var/turf/simulated/floor in get_cardinal_neighbors()) - if(get_dist(parent, floor) > spread_distance) - continue - - var/blocked = 0 - for(var/obj/effect/plant/other in floor.contents) - if(other.seed == src.seed) - blocked = 1 - break - if(blocked) - continue - - if(floor.density) - if(!isnull(seed.chems["pacid"])) - spawn(rand(5,25)) floor.ex_act(3) - continue - - if(!Adjacent(floor) || !floor.Enter(src)) - continue - neighbors |= floor - - if(neighbors.len) - plant_controller.add_plant(src) //if we have neighbours again, start processing - - // Update all of our friends. - var/turf/T = get_turf(src) - for(var/obj/effect/plant/neighbor in range(1,src)) - if(neighbor.seed == src.seed) - neighbor.neighbors -= T - -/obj/effect/plant/process() - - // Something is very wrong, kill ourselves. - if(!seed) - die_off() - return 0 - - for(var/obj/effect/effect/smoke/chem/smoke in view(1, src)) - if(smoke.reagents.has_reagent("plantbgone")) - die_off() - return - - // Handle life. - var/turf/simulated/T = get_turf(src) - if(istype(T)) - health -= seed.handle_environment(T,T.return_air(),null,1) - if(health < max_health) - health += rand(3,5) - refresh_icon() - if(health > max_health) - health = max_health - else if(health == max_health && !plant) - plant = new(T,seed) - plant.dir = src.dir - plant.transform = src.transform - plant.age = seed.get_trait(TRAIT_MATURATION)-1 - plant.update_icon() - if(growth_type==0) //Vines do not become invisible. - invisibility = INVISIBILITY_MAXIMUM - else - plant.layer = layer + 0.1 - - if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/L = A - seed.do_sting(L,src) - if(seed.get_trait(TRAIT_CARNIVOROUS)) - seed.do_thorns(L,src) - - if(world.time >= last_tick+NEIGHBOR_REFRESH_TIME) - last_tick = world.time - update_neighbors() - - if(sampled) - //Should be between 2-7 for given the default range of values for TRAIT_PRODUCTION - var/chance = max(1, round(15/seed.get_trait(TRAIT_PRODUCTION))) - if(prob(chance)) - sampled = 0 - - if(is_mature() && !has_buckled_mobs()) - for(var/turf/neighbor in neighbors) - for(var/mob/living/M in neighbor) - if(seed.get_trait(TRAIT_SPREAD) >= 2 && (M.lying || prob(round(seed.get_trait(TRAIT_POTENCY))))) - entangle(M) - - if(is_mature() && neighbors.len && prob(spread_chance)) - //spread to 1-3 adjacent turfs depending on yield trait. - var/max_spread = between(1, round(seed.get_trait(TRAIT_YIELD)*3/14), 3) - - for(var/i in 1 to max_spread) - if(prob(spread_chance)) - sleep(rand(3,5)) - if(!neighbors.len) - break - spread_to(pick(neighbors)) - - // We shouldn't have spawned if the controller doesn't exist. - check_health() - if(has_buckled_mobs() || neighbors.len) - plant_controller.add_plant(src) - -//spreading vines aren't created on their final turf. -//Instead, they are created at their parent and then move to their destination. -/obj/effect/plant/proc/spread_to(turf/target_turf) - var/obj/effect/plant/child = new(get_turf(src),seed,parent) - - spawn(1) // This should do a little bit of animation. - if(QDELETED(child)) - return - - //move out to the destination - child.anchored = 0 - step_to(child, target_turf) - child.anchored = 1 - child.update_icon() - - //see if anything is there - for(var/thing in child.loc) - if(thing != child && istype(thing, /obj/effect/plant)) - var/obj/effect/plant/other = thing - if(other.seed != child.seed) - other.vine_overrun(child.seed, src) //vine fight - qdel(child) - return - if(istype(thing, /obj/effect/dead_plant)) - qdel(thing) - qdel(child) - return - if(isliving(thing) && (seed.get_trait(TRAIT_CARNIVOROUS) || (seed.get_trait(TRAIT_SPREAD) >= 2 && prob(round(seed.get_trait(TRAIT_POTENCY)))))) - entangle(thing) - qdel(child) - return - - // Update neighboring squares. - for(var/obj/effect/plant/neighbor in range(1, child.loc)) //can use the actual final child loc now - if(child.seed == neighbor.seed) //neighbors of different seeds will continue to try to overrun each other - neighbor.neighbors -= target_turf - - child.finish_spreading() - -/obj/effect/plant/proc/die_off() - // Kill off our plant. - if(plant) plant.die() - // This turf is clear now, let our buddies know. - for(var/turf/simulated/check_turf in get_cardinal_neighbors()) - if(!istype(check_turf)) - continue - for(var/obj/effect/plant/neighbor in check_turf.contents) - neighbor.neighbors |= check_turf - plant_controller.add_plant(neighbor) - spawn(1) if(src) qdel(src) - +#define NEIGHBOR_REFRESH_TIME 100 + +/obj/effect/plant/proc/get_cardinal_neighbors() + var/list/cardinal_neighbors = list() + for(var/check_dir in cardinal) + var/turf/simulated/T = get_step(get_turf(src), check_dir) + if(istype(T)) + cardinal_neighbors |= T + return cardinal_neighbors + +/obj/effect/plant/proc/update_neighbors() + // Update our list of valid neighboring turfs. + neighbors = list() + for(var/turf/simulated/floor in get_cardinal_neighbors()) + if(get_dist(parent, floor) > spread_distance) + continue + + var/blocked = 0 + for(var/obj/effect/plant/other in floor.contents) + if(other.seed == src.seed) + blocked = 1 + break + if(blocked) + continue + + if(floor.density) + if(!isnull(seed.chems["pacid"])) + spawn(rand(5,25)) floor.ex_act(3) + continue + + if(!Adjacent(floor) || !floor.Enter(src)) + continue + neighbors |= floor + + if(neighbors.len) + plant_controller.add_plant(src) //if we have neighbours again, start processing + + // Update all of our friends. + var/turf/T = get_turf(src) + for(var/obj/effect/plant/neighbor in range(1,src)) + if(neighbor.seed == src.seed) + neighbor.neighbors -= T + +/obj/effect/plant/process() + + // Something is very wrong, kill ourselves. + if(!seed) + die_off() + return 0 + + for(var/obj/effect/effect/smoke/chem/smoke in view(1, src)) + if(smoke.reagents.has_reagent("plantbgone")) + die_off() + return + + // Handle life. + var/turf/simulated/T = get_turf(src) + if(istype(T)) + health -= seed.handle_environment(T,T.return_air(),null,1) + if(health < max_health) + health += rand(3,5) + refresh_icon() + if(health > max_health) + health = max_health + else if(health == max_health && !plant) + plant = new(T,seed) + plant.dir = src.dir + plant.transform = src.transform + plant.age = seed.get_trait(TRAIT_MATURATION)-1 + plant.update_icon() + if(growth_type==0) //Vines do not become invisible. + invisibility = INVISIBILITY_MAXIMUM + else + plant.layer = layer + 0.1 + + if(has_buckled_mobs()) + for(var/A in buckled_mobs) + var/mob/living/L = A + seed.do_sting(L,src) + if(seed.get_trait(TRAIT_CARNIVOROUS)) + seed.do_thorns(L,src) + + if(world.time >= last_tick+NEIGHBOR_REFRESH_TIME) + last_tick = world.time + update_neighbors() + + if(sampled) + //Should be between 2-7 for given the default range of values for TRAIT_PRODUCTION + var/chance = max(1, round(15/seed.get_trait(TRAIT_PRODUCTION))) + if(prob(chance)) + sampled = 0 + + if(is_mature() && !has_buckled_mobs()) + for(var/turf/neighbor in neighbors) + for(var/mob/living/M in neighbor) + if(seed.get_trait(TRAIT_SPREAD) >= 2 && (M.lying || prob(round(seed.get_trait(TRAIT_POTENCY))))) + entangle(M) + + if(is_mature() && neighbors.len && prob(spread_chance)) + //spread to 1-3 adjacent turfs depending on yield trait. + var/max_spread = between(1, round(seed.get_trait(TRAIT_YIELD)*3/14), 3) + + for(var/i in 1 to max_spread) + if(prob(spread_chance)) + sleep(rand(3,5)) + if(!neighbors.len) + break + spread_to(pick(neighbors)) + + // We shouldn't have spawned if the controller doesn't exist. + check_health() + if(has_buckled_mobs() || neighbors.len) + plant_controller.add_plant(src) + +//spreading vines aren't created on their final turf. +//Instead, they are created at their parent and then move to their destination. + +/obj/effect/plant/proc/spread_to(turf/target_turf) + var/obj/effect/plant/child = new(get_turf(src),seed,parent) + + spawn(1) // This should do a little bit of animation. + if(QDELETED(child)) + return + + //move out to the destination + child.anchored = 0 + step_to(child, target_turf) + child.anchored = 1 + child.update_icon() + + if((seed.get_trait(TRAIT_POTENCY)) >= 50 && (seed.get_trait(TRAIT_CARNIVOROUS)) && prob(5)) + var/spread_mobspawn = rand(0,2) + switch(spread_mobspawn) + if(0) new /mob/living/simple_animal/hostile/piranhaplant(src.loc) + if(1) new /mob/living/simple_animal/hostile/piranhaplant/spitter(src.loc) + if(2) new /mob/living/simple_animal/hostile/piranhaplant/pitcher(src.loc) + + + //see if anything is there + for(var/thing in child.loc) + if(thing != child && istype(thing, /obj/effect/plant)) + var/obj/effect/plant/other = thing + if(other.seed != child.seed) + other.vine_overrun(child.seed, src) //vine fight + qdel(child) + return + if(istype(thing, /obj/effect/dead_plant)) + qdel(thing) + qdel(child) + return + if(isliving(thing) && (seed.get_trait(TRAIT_CARNIVOROUS) || (seed.get_trait(TRAIT_SPREAD) >= 2 && prob(round(seed.get_trait(TRAIT_POTENCY)))))) + entangle(thing) + qdel(child) + return + + // Update neighboring squares. + for(var/obj/effect/plant/neighbor in range(1, child.loc)) //can use the actual final child loc now + if(child.seed == neighbor.seed) //neighbors of different seeds will continue to try to overrun each other + neighbor.neighbors -= target_turf + + child.finish_spreading() + +/obj/effect/plant/proc/die_off() + // Kill off our plant. + if(plant) plant.die() + // This turf is clear now, let our buddies know. + for(var/turf/simulated/check_turf in get_cardinal_neighbors()) + if(!istype(check_turf)) + continue + for(var/obj/effect/plant/neighbor in check_turf.contents) + neighbor.neighbors |= check_turf + plant_controller.add_plant(neighbor) + spawn(1) if(src) qdel(src) + #undef NEIGHBOR_REFRESH_TIME \ No newline at end of file diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index 8a8ceabfeb..2c557ed6f0 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -1,100 +1,106 @@ -/obj/effect/plant/HasProximity(var/atom/movable/AM) - - if(!is_mature() || seed.get_trait(TRAIT_SPREAD) != 2) - return - - var/mob/living/M = AM - if(!istype(M)) - return - - if(!has_buckled_mobs() && !M.buckled && !M.anchored && (issmall(M) || prob(round(seed.get_trait(TRAIT_POTENCY)/3)))) - //wait a tick for the Entered() proc that called HasProximity() to finish (and thus the moving animation), - //so we don't appear to teleport from two tiles away when moving into a turf adjacent to vines. - spawn(1) - entangle(M) - -/obj/effect/plant/attack_hand(var/mob/user) - manual_unbuckle(user) - -/obj/effect/plant/attack_generic(var/mob/user) - manual_unbuckle(user) - -/obj/effect/plant/Crossed(atom/movable/O) - if(isliving(O)) - trodden_on(O) - -/obj/effect/plant/proc/trodden_on(var/mob/living/victim) - if(!is_mature()) - return - var/mob/living/carbon/human/H = victim - if(prob(round(seed.get_trait(TRAIT_POTENCY)/3))) - entangle(victim) - if(istype(H) && H.shoes) - return - seed.do_thorns(victim,src) - seed.do_sting(victim,src,pick("r_foot","l_foot","r_leg","l_leg")) - -/obj/effect/plant/proc/unbuckle() - if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/L = A - if(L.buckled == src) - L.buckled = null - L.anchored = initial(L.anchored) - L.update_canmove() - buckled_mobs = list() - return - -/obj/effect/plant/proc/manual_unbuckle(mob/user as mob) - if(has_buckled_mobs()) - var/chance = 20 - if(seed) - chance = round(100/(20*seed.get_trait(TRAIT_POTENCY)/100)) - if(prob(chance)) - for(var/A in buckled_mobs) - var/mob/living/L = A - if(!(user in buckled_mobs)) - L.visible_message(\ - "\The [user] frees \the [L] from \the [src].",\ - "\The [user] frees you from \the [src].",\ - "You hear shredding and ripping.") - else - L.visible_message(\ - "\The [L] struggles free of \the [src].",\ - "You untangle \the [src] from around yourself.",\ - "You hear shredding and ripping.") - unbuckle() - else - user.setClickCooldown(user.get_attack_speed()) - health -= rand(1,5) - var/text = pick("rip","tear","pull", "bite", "tug") - user.visible_message(\ - "\The [user] [text]s at \the [src].",\ - "You [text] at \the [src].",\ - "You hear shredding and ripping.") - check_health() - return - -/obj/effect/plant/proc/entangle(var/mob/living/victim) - - if(has_buckled_mobs()) - return - - if(victim.buckled || victim.anchored) - return - - //grabbing people - if(!victim.anchored && Adjacent(victim) && victim.loc != src.loc) - var/can_grab = 1 - if(istype(victim, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = victim - if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.item_flags & NOSLIP)) - can_grab = 0 - if(can_grab) - src.visible_message("Tendrils lash out from \the [src] and drag \the [victim] in!") - victim.forceMove(src.loc) - buckle_mob(victim) - victim.set_dir(pick(cardinal)) - victim << "Tendrils [pick("wind", "tangle", "tighten")] around you!" - victim.Weaken(0.5) - seed.do_thorns(victim,src) +/obj/effect/plant/HasProximity(var/atom/movable/AM) + + if(!is_mature() || seed.get_trait(TRAIT_SPREAD) != 2) + return + + var/mob/living/M = AM + if(!istype(M)) + return + + if(!has_buckled_mobs() && !M.buckled && !M.anchored && (issmall(M) || prob(round(seed.get_trait(TRAIT_POTENCY)/3)))) + //wait a tick for the Entered() proc that called HasProximity() to finish (and thus the moving animation), + //so we don't appear to teleport from two tiles away when moving into a turf adjacent to vines. + if(M.entangle_immunity == 1) + return + spawn(1) + entangle(M) + +/obj/effect/plant/attack_hand(var/mob/user) + manual_unbuckle(user) + +/obj/effect/plant/attack_generic(var/mob/user) + manual_unbuckle(user) + +/obj/effect/plant/Crossed(atom/movable/O) + if(isliving(O)) + trodden_on(O) + +/obj/effect/plant/proc/trodden_on(var/mob/living/victim) + if(!is_mature()) + return + var/mob/living/carbon/human/H = victim + if(H.entangle_immunity == 1) + return + if(prob(round(seed.get_trait(TRAIT_POTENCY)/3))) + entangle(victim) + if(istype(H) && H.shoes) + return + seed.do_thorns(victim,src) + seed.do_sting(victim,src,pick("r_foot","l_foot","r_leg","l_leg")) + +/obj/effect/plant/proc/unbuckle() + if(has_buckled_mobs()) + for(var/A in buckled_mobs) + var/mob/living/L = A + if(L.buckled == src) + L.buckled = null + L.anchored = initial(L.anchored) + L.update_canmove() + buckled_mobs = list() + return + +/obj/effect/plant/proc/manual_unbuckle(mob/user as mob) + if(has_buckled_mobs()) + var/chance = 20 + if(seed) + chance = round(100/(20*seed.get_trait(TRAIT_POTENCY)/100)) + if(prob(chance)) + for(var/A in buckled_mobs) + var/mob/living/L = A + if(!(user in buckled_mobs)) + L.visible_message(\ + "\The [user] frees \the [L] from \the [src].",\ + "\The [user] frees you from \the [src].",\ + "You hear shredding and ripping.") + else + L.visible_message(\ + "\The [L] struggles free of \the [src].",\ + "You untangle \the [src] from around yourself.",\ + "You hear shredding and ripping.") + unbuckle() + else + user.setClickCooldown(user.get_attack_speed()) + health -= rand(1,5) + var/text = pick("rip","tear","pull", "bite", "tug") + user.visible_message(\ + "\The [user] [text]s at \the [src].",\ + "You [text] at \the [src].",\ + "You hear shredding and ripping.") + check_health() + return + +/obj/effect/plant/proc/entangle(var/mob/living/victim) + + if(has_buckled_mobs()) + return + + if(victim.buckled || victim.anchored) + return + + //grabbing people + if(!victim.anchored && Adjacent(victim) && victim.loc != src.loc) + var/can_grab = 1 + if(istype(victim, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = victim + if(H.entangle_immunity == 1) + return + if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.item_flags & NOSLIP)) + can_grab = 0 + if(can_grab) + src.visible_message("Tendrils lash out from \the [src] and drag \the [victim] in!") + victim.forceMove(src.loc) + buckle_mob(victim) + victim.set_dir(pick(cardinal)) + victim << "Tendrils [pick("wind", "tangle", "tighten")] around you!" + victim.Weaken(0.5) + seed.do_thorns(victim,src) diff --git a/code/modules/hydroponics/trays/tray_update_icons.dm b/code/modules/hydroponics/trays/tray_update_icons.dm index cf790269a2..90ad4a965f 100644 --- a/code/modules/hydroponics/trays/tray_update_icons.dm +++ b/code/modules/hydroponics/trays/tray_update_icons.dm @@ -84,7 +84,7 @@ var/clr if(seed.get_trait(TRAIT_BIOLUM_COLOUR)) clr = seed.get_trait(TRAIT_BIOLUM_COLOUR) - set_light(round(seed.get_trait(TRAIT_POTENCY)/10), l_color = clr) + set_light(round(seed.get_trait(TRAIT_POTENCY)/5), l_color = clr) return set_light(0) diff --git a/code/modules/media/media_tracks.dm b/code/modules/media/media_tracks.dm index 6544e62571..f3e401c7dc 100644 --- a/code/modules/media/media_tracks.dm +++ b/code/modules/media/media_tracks.dm @@ -9,15 +9,17 @@ var/artist // Song's creator var/duration // Song length in deciseconds var/secret // Show up in regular playlist or secret playlist? + var/casino // Music for casino jukebox var/lobby // Be one of the choices for lobby music? -/datum/track/New(var/url, var/title, var/duration, var/artist = "", var/secret = 0, var/lobby = 0) +/datum/track/New(var/url, var/title, var/duration, var/artist = "", var/secret = 0, var/lobby = 0, var/casino = 0) src.url = url src.title = title src.artist = artist src.duration = duration src.secret = secret src.lobby = lobby + src.casino = casino /datum/track/proc/display() var str = "\"[title]\"" @@ -58,6 +60,7 @@ var/global/list/all_lobby_tracks = list() if(istext(entry["artist"])) T.artist = entry["artist"] T.secret = entry["secret"] ? 1 : 0 + T.casino = entry["casino"] ? 1 : 0 T.lobby = entry["lobby"] ? 1 : 0 all_jukebox_tracks += T if(T.lobby) diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index c4b2542f22..8c0dff8b3e 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -16,9 +16,9 @@ ai_inactive = TRUE //Always off show_stat_health = FALSE //We will do it ourselves - response_help = "pats the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" + response_help = "pats" + response_disarm = "gently pushes aside" + response_harm = "hits" harm_intent_damage = 2 melee_damage_lower = 10 @@ -241,7 +241,7 @@ //Message blob.visible_message("[src.name] collapses into a gooey blob!") - + //Duration of the to_puddle iconstate that the blob starts with sleep(13) blob.update_icon() //Will remove the collapse anim @@ -268,7 +268,7 @@ if(pulledby) pulledby.stop_pulling() stop_pulling() - + //Stop healing if we are if(blob.healing) blob.healing.expire() @@ -278,7 +278,7 @@ //Message blob.visible_message("[src.name] reshapes into a humanoid appearance!") - + //Duration of above animation sleep(8) @@ -303,7 +303,7 @@ var/obj/belly/B = belly B.forceMove(src) B.owner = src - + //Get rid of friend blob qdel(blob) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 8c6297357a..6d97f616cc 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1,1285 +1,1288 @@ -/mob/living/New() - ..() - - //Prime this list if we need it. - if(has_huds) - add_overlay(backplane,TRUE) //Strap this on here, to block HUDs from appearing in rightclick menus: http://www.byond.com/forum/?post=2336679 - hud_list = list() - hud_list.len = TOTAL_HUDS - make_hud_overlays() - - //I'll just hang my coat up over here - dsoverlay = image('icons/mob/darksight.dmi',global_hud.darksight) //This is a secret overlay! Go look at the file, you'll see. - var/mutable_appearance/dsma = new(dsoverlay) //Changing like ten things, might as well. - dsma.alpha = 0 - dsma.plane = PLANE_LIGHTING - dsma.blend_mode = BLEND_ADD - dsoverlay.appearance = dsma - -/mob/living/Destroy() - dsoverlay.loc = null //I'll take my coat with me - dsoverlay = null - if(buckled) - buckled.unbuckle_mob(src, TRUE) - return ..() - -//mob verbs are faster than object verbs. See mob/verb/examine. -/mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1)) - set name = "Pull" - set category = "Object" - - if(AM.Adjacent(src)) - src.start_pulling(AM) - - return - -//mob verbs are faster than object verbs. See above. -/mob/living/pointed(atom/A as mob|obj|turf in view()) - if(src.stat || !src.canmove || src.restrained()) - return 0 - if(src.status_flags & FAKEDEATH) - return 0 - if(!..()) - return 0 - - usr.visible_message("[src] points to [A]") - return 1 - -/*one proc, four uses -swapping: if it's 1, the mobs are trying to switch, if 0, non-passive is pushing passive -default behaviour is: - - non-passive mob passes the passive version - - passive mob checks to see if its mob_bump_flag is in the non-passive's mob_bump_flags - - if si, the proc returns -*/ -/mob/living/proc/can_move_mob(var/mob/living/swapped, swapping = 0, passive = 0) - if(!swapped) - return 1 - if(!passive) - return swapped.can_move_mob(src, swapping, 1) - else - var/context_flags = 0 - if(swapping) - context_flags = swapped.mob_swap_flags - else - context_flags = swapped.mob_push_flags - if(!mob_bump_flag) //nothing defined, go wild - return 1 - if(mob_bump_flag & context_flags) - return 1 - return 0 - -/mob/living/Bump(atom/movable/AM, yes) - spawn(0) - if ((!( yes ) || now_pushing) || !loc) - return - now_pushing = 1 - if (istype(AM, /mob/living)) - var/mob/living/tmob = AM - - //Even if we don't push/swap places, we "touched" them, so spread fire - spread_fire(tmob) - - for(var/mob/living/M in range(tmob, 1)) - if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) ) - if ( !(world.time % 5) ) - to_chat(src, "[tmob] is restrained, you cannot push past") - now_pushing = 0 - return - if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) ) - if ( !(world.time % 5) ) - to_chat(src, "[tmob] is restraining [M], you cannot push past") - now_pushing = 0 - return - - //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller - var/dense = 0 - if(loc.density) - dense = 1 - for(var/atom/movable/A in loc) - if(A == src) - continue - if(A.density) - if(A.flags&ON_BORDER) - dense = !A.CanPass(src, src.loc) - else - dense = 1 - if(dense) break - - //Leaping mobs just land on the tile, no pushing, no anything. - if(status_flags & LEAPING) - loc = tmob.loc - status_flags &= ~LEAPING - now_pushing = 0 - return - - if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && tmob.canmove && canmove && !tmob.buckled && !buckled && !dense && can_move_mob(tmob, 1, 0)) // mutual brohugs all around! - var/turf/oldloc = loc - forceMove(tmob.loc) - - //VOREstation Edit - Begin - if (istype(tmob, /mob/living/simple_animal)) //check bumpnom chance, if it's a simplemob that's bumped - tmob.Bumped(src) - else if(istype(src, /mob/living/simple_animal)) //otherwise, if it's a simplemob doing the bumping. Simplemob on simplemob doesn't seem to trigger but that's fine. - Bumped(tmob) - if (tmob.loc == src) //check if they got ate, and if so skip the forcemove - now_pushing = 0 - return - - // In case of micros, we don't swap positions; instead occupying the same square! - if (handle_micro_bump_helping(tmob)) - now_pushing = 0 - return - // TODO - Check if we need to do something about the slime.UpdateFeed() we are skipping below. - // VOREStation Edit - End - - tmob.forceMove(oldloc) - now_pushing = 0 - return - - if(!can_move_mob(tmob, 0, 0)) - now_pushing = 0 - return - if(a_intent == I_HELP || src.restrained()) - now_pushing = 0 - return - - // VOREStation Edit - Begin - // Plow that nerd. - if(ishuman(tmob)) - var/mob/living/carbon/human/H = tmob - if(H.species.lightweight == 1 && prob(50)) - H.visible_message("[src] bumps into [H], knocking them off balance!") - H.Weaken(5) - now_pushing = 0 - return - // Handle grabbing, stomping, and such of micros! - if(handle_micro_bump_other(tmob)) return - // VOREStation Edit - End - - if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) - if(prob(40) && !(FAT in src.mutations)) - to_chat(src, "You fail to push [tmob]'s fat ass out of the way.") - now_pushing = 0 - return - if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot)) - if(prob(99)) - now_pushing = 0 - return - if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot)) - if(prob(99)) - now_pushing = 0 - return - if(!(tmob.status_flags & CANPUSH)) - now_pushing = 0 - return - - tmob.LAssailant = src - - now_pushing = 0 - spawn(0) - ..() - if (!istype(AM, /atom/movable) || AM.anchored) - //VOREStation Edit - object-specific proc for running into things - if(((confused || is_blind()) && stat == CONSCIOUS && prob(50) && m_intent=="run") || flying) - AM.stumble_into(src) - //VOREStation Edit End - /* VOREStation Removal - See above - Weaken(2) - playsound(loc, "punch", 25, 1, -1) - visible_message("[src] [pick("ran", "slammed")] into \the [AM]!") - src.apply_damage(5, BRUTE) - src << ("You just [pick("ran", "slammed")] into \the [AM]!") - to_chat(src, "You just [pick("ran", "slammed")] into \the [AM]!") - */ // VOREStation Removal End - return - if (!now_pushing) - if(isobj(AM)) - var/obj/I = AM - if(!can_pull_size || can_pull_size < I.w_class) - return - now_pushing = 1 - - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window)) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - if(ishuman(AM) && AM:grabbed_by) - for(var/obj/item/weapon/grab/G in AM:grabbed_by) - step(G:assailant, get_dir(G:assailant, AM)) - G.adjust_position() - now_pushing = 0 - return - return - -/mob/living/verb/succumb() - set hidden = 1 - if ((src.health < 0 && src.health > (5-src.getMaxHealth()))) // Health below Zero but above 5-away-from-death, as before, but variable - src.death() - to_chat(src, "You have given up life and succumbed to death.") - else - to_chat(src, "You are not injured enough to succumb to death!") - -/mob/living/proc/updatehealth() - if(status_flags & GODMODE) - health = 100 - stat = CONSCIOUS - else - health = getMaxHealth() - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss() - halloss - - -//This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually -//affects them once clothing is factored in. ~Errorage -/mob/living/proc/calculate_affecting_pressure(var/pressure) - return - - -//sort of a legacy burn method for /electrocute, /shock, and the e_chair -/mob/living/proc/burn_skin(burn_amount) - if(istype(src, /mob/living/carbon/human)) - //world << "DEBUG: burn_skin(), mutations=[mutations]" - if(mShock in src.mutations) //shockproof - return 0 - if (COLD_RESISTANCE in src.mutations) //fireproof - return 0 - var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part - var/divided_damage = (burn_amount)/(H.organs.len) - var/extradam = 0 //added to when organ is at max dam - for(var/obj/item/organ/external/affecting in H.organs) - if(!affecting) continue - if(affecting.take_damage(0, divided_damage+extradam)) //TODO: fix the extradam stuff. Or, ebtter yet...rewrite this entire proc ~Carn - H.UpdateDamageIcon() - H.updatehealth() - return 1 - else if(istype(src, /mob/living/silicon/ai)) - return 0 - -/mob/living/proc/adjustBodyTemp(actual, desired, incrementboost) - var/temperature = actual - var/difference = abs(actual-desired) //get difference - var/increments = difference/10 //find how many increments apart they are - var/change = increments*incrementboost // Get the amount to change by (x per increment) - - // Too cold - if(actual < desired) - temperature += change - if(actual > desired) - temperature = desired - // Too hot - if(actual > desired) - temperature -= change - if(actual < desired) - temperature = desired -// if(istype(src, /mob/living/carbon/human)) -// world << "[src] ~ [src.bodytemperature] ~ [temperature]" - return temperature - - -// ++++ROCKDTBEN++++ MOB PROCS -- Ask me before touching. -// Stop! ... Hammertime! ~Carn -// I touched them without asking... I'm soooo edgy ~Erro (added nodamage checks) - -/mob/living/proc/getBruteLoss() - return bruteloss - -/mob/living/proc/getShockBruteLoss() //Only checks for things that'll actually hurt (not robolimbs) - return bruteloss - -/mob/living/proc/getActualBruteLoss() // Mostly for humans with robolimbs. - return getBruteLoss() - -//'include_robo' only applies to healing, for legacy purposes, as all damage typically hurts both types of organs -/mob/living/proc/adjustBruteLoss(var/amount,var/include_robo) - if(status_flags & GODMODE) return 0 //godmode - - if(amount > 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.incoming_damage_percent)) - amount *= M.incoming_damage_percent - if(!isnull(M.incoming_brute_damage_percent)) - amount *= M.incoming_brute_damage_percent - else if(amount < 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.incoming_healing_percent)) - amount *= M.incoming_healing_percent - - bruteloss = min(max(bruteloss + amount, 0),(getMaxHealth()*2)) - updatehealth() - -/mob/living/proc/getOxyLoss() - return oxyloss - -/mob/living/proc/adjustOxyLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode - - if(amount > 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.incoming_damage_percent)) - amount *= M.incoming_damage_percent - if(!isnull(M.incoming_oxy_damage_percent)) - amount *= M.incoming_oxy_damage_percent - else if(amount < 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.incoming_healing_percent)) - amount *= M.incoming_healing_percent - - oxyloss = min(max(oxyloss + amount, 0),(getMaxHealth()*2)) - updatehealth() - -/mob/living/proc/setOxyLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode - oxyloss = amount - -/mob/living/proc/getToxLoss() - return toxloss - -/mob/living/proc/adjustToxLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode - - if(amount > 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.incoming_damage_percent)) - amount *= M.incoming_damage_percent - if(!isnull(M.incoming_tox_damage_percent)) - amount *= M.incoming_tox_damage_percent - else if(amount < 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.incoming_healing_percent)) - amount *= M.incoming_healing_percent - - toxloss = min(max(toxloss + amount, 0),(getMaxHealth()*2)) - updatehealth() - -/mob/living/proc/setToxLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode - toxloss = amount - -/mob/living/proc/getFireLoss() - return fireloss - -/mob/living/proc/getShockFireLoss() //Only checks for things that'll actually hurt (not robolimbs) - return fireloss - -/mob/living/proc/getActualFireLoss() // Mostly for humans with robolimbs. - return getFireLoss() - -//'include_robo' only applies to healing, for legacy purposes, as all damage typically hurts both types of organs -/mob/living/proc/adjustFireLoss(var/amount,var/include_robo) - if(status_flags & GODMODE) return 0 //godmode - if(amount > 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.incoming_damage_percent)) - amount *= M.incoming_damage_percent - if(!isnull(M.incoming_fire_damage_percent)) - amount *= M.incoming_fire_damage_percent - else if(amount < 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.incoming_healing_percent)) - amount *= M.incoming_healing_percent - - fireloss = min(max(fireloss + amount, 0),(getMaxHealth()*2)) - updatehealth() - -/mob/living/proc/getCloneLoss() - return cloneloss - -/mob/living/proc/adjustCloneLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode - - if(amount > 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.incoming_damage_percent)) - amount *= M.incoming_damage_percent - if(!isnull(M.incoming_clone_damage_percent)) - amount *= M.incoming_clone_damage_percent - else if(amount < 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.incoming_healing_percent)) - amount *= M.incoming_healing_percent - - cloneloss = min(max(cloneloss + amount, 0),(getMaxHealth()*2)) - updatehealth() - -/mob/living/proc/setCloneLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode - cloneloss = amount - -/mob/living/proc/getBrainLoss() - return brainloss - -/mob/living/proc/adjustBrainLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode - brainloss = min(max(brainloss + amount, 0),(getMaxHealth()*2)) - -/mob/living/proc/setBrainLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode - brainloss = amount - -/mob/living/proc/getHalLoss() - return halloss - -/mob/living/proc/adjustHalLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode - if(amount > 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.incoming_damage_percent)) - amount *= M.incoming_damage_percent - if(!isnull(M.incoming_hal_damage_percent)) - amount *= M.incoming_hal_damage_percent - if(!isnull(M.disable_duration_percent)) - amount *= M.incoming_hal_damage_percent - else if(amount < 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.incoming_healing_percent)) - amount *= M.incoming_healing_percent - halloss = min(max(halloss + amount, 0),(getMaxHealth()*2)) - updatehealth() - -/mob/living/proc/setHalLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode - halloss = amount - -// Use this to get a mob's max health whenever possible. Reading maxHealth directly will give inaccurate results if any modifiers exist. -/mob/living/proc/getMaxHealth() - var/result = maxHealth - for(var/datum/modifier/M in modifiers) - if(!isnull(M.max_health_flat)) - result += M.max_health_flat - // Second loop is so we can get all the flat adjustments first before multiplying, otherwise the result will be different. - for(var/datum/modifier/M in modifiers) - if(!isnull(M.max_health_percent)) - result *= M.max_health_percent - return result - -/mob/living/proc/setMaxHealth(var/newMaxHealth) - health = (health/maxHealth) * (newMaxHealth) //VOREStation Add - Adjust existing health - maxHealth = newMaxHealth - -/mob/living/Stun(amount) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.disable_duration_percent)) - amount = round(amount * M.disable_duration_percent) - ..(amount) - -/mob/living/AdjustStunned(amount) - if(amount > 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.disable_duration_percent)) - amount = round(amount * M.disable_duration_percent) - ..(amount) - -/mob/living/Weaken(amount) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.disable_duration_percent)) - amount = round(amount * M.disable_duration_percent) - ..(amount) - -/mob/living/AdjustWeakened(amount) - if(amount > 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.disable_duration_percent)) - amount = round(amount * M.disable_duration_percent) - ..(amount) - -/mob/living/Paralyse(amount) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.disable_duration_percent)) - amount = round(amount * M.disable_duration_percent) - ..(amount) - -/mob/living/AdjustParalysis(amount) - if(amount > 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.disable_duration_percent)) - amount = round(amount * M.disable_duration_percent) - ..(amount) - -/mob/living/Sleeping(amount) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.disable_duration_percent)) - amount = round(amount * M.disable_duration_percent) - ..(amount) - -/mob/living/AdjustSleeping(amount) - if(amount > 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.disable_duration_percent)) - amount = round(amount * M.disable_duration_percent) - ..(amount) - -/mob/living/Confuse(amount) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.disable_duration_percent)) - amount = round(amount * M.disable_duration_percent) - ..(amount) - -/mob/living/AdjustConfused(amount) - if(amount > 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.disable_duration_percent)) - amount = round(amount * M.disable_duration_percent) - ..(amount) - -/mob/living/Blind(amount) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.disable_duration_percent)) - amount = round(amount * M.disable_duration_percent) - ..(amount) - -/mob/living/AdjustBlinded(amount) - if(amount > 0) - for(var/datum/modifier/M in modifiers) - if(!isnull(M.disable_duration_percent)) - amount = round(amount * M.disable_duration_percent) - ..(amount) - -// ++++ROCKDTBEN++++ MOB PROCS //END - -/mob/proc/get_contents() - - -//Recursive function to find everything a mob is holding. -/mob/living/get_contents(var/obj/item/weapon/storage/Storage = null) - var/list/L = list() - - if(Storage) //If it called itself - L += Storage.return_inv() - - //Leave this commented out, it will cause storage items to exponentially add duplicate to the list - //for(var/obj/item/weapon/storage/S in Storage.return_inv()) //Check for storage items - // L += get_contents(S) - - for(var/obj/item/weapon/gift/G in Storage.return_inv()) //Check for gift-wrapped items - L += G.gift - if(istype(G.gift, /obj/item/weapon/storage)) - L += get_contents(G.gift) - - for(var/obj/item/smallDelivery/D in Storage.return_inv()) //Check for package wrapped items - L += D.wrapped - if(istype(D.wrapped, /obj/item/weapon/storage)) //this should never happen - L += get_contents(D.wrapped) - return L - - else - - L += src.contents - for(var/obj/item/weapon/storage/S in src.contents) //Check for storage items - L += get_contents(S) - - for(var/obj/item/weapon/gift/G in src.contents) //Check for gift-wrapped items - L += G.gift - if(istype(G.gift, /obj/item/weapon/storage)) - L += get_contents(G.gift) - - for(var/obj/item/smallDelivery/D in src.contents) //Check for package wrapped items - L += D.wrapped - if(istype(D.wrapped, /obj/item/weapon/storage)) //this should never happen - L += get_contents(D.wrapped) - return L - -/mob/living/proc/check_contents_for(A) - var/list/L = src.get_contents() - - for(var/obj/B in L) - if(B.type == A) - return 1 - return 0 - - -/mob/living/proc/can_inject() - return 1 - -/mob/living/proc/get_organ_target() - var/mob/shooter = src - var/t = shooter:zone_sel.selecting - if ((t in list( O_EYES, O_MOUTH ))) - t = BP_HEAD - var/obj/item/organ/external/def_zone = ran_zone(t) - return def_zone - - -// heal ONE external organ, organ gets randomly selected from damaged ones. -/mob/living/proc/heal_organ_damage(var/brute, var/burn) - adjustBruteLoss(-brute) - adjustFireLoss(-burn) - src.updatehealth() - -// damage ONE external organ, organ gets randomly selected from damaged ones. -/mob/living/proc/take_organ_damage(var/brute, var/burn, var/emp=0) - if(status_flags & GODMODE) return 0 //godmode - adjustBruteLoss(brute) - adjustFireLoss(burn) - src.updatehealth() - -// heal MANY external organs, in random order -/mob/living/proc/heal_overall_damage(var/brute, var/burn) - adjustBruteLoss(-brute) - adjustFireLoss(-burn) - src.updatehealth() - -// damage MANY external organs, in random order -/mob/living/proc/take_overall_damage(var/brute, var/burn, var/used_weapon = null) - if(status_flags & GODMODE) return 0 //godmode - adjustBruteLoss(brute) - adjustFireLoss(burn) - src.updatehealth() - -/mob/living/proc/restore_all_organs() - return - - - -/mob/living/proc/revive() - rejuvenate() - if(buckled) - buckled.unbuckle_mob() - if(iscarbon(src)) - var/mob/living/carbon/C = src - - if (C.handcuffed && !initial(C.handcuffed)) - C.drop_from_inventory(C.handcuffed) - C.handcuffed = initial(C.handcuffed) - - if (C.legcuffed && !initial(C.legcuffed)) - C.drop_from_inventory(C.legcuffed) - C.legcuffed = initial(C.legcuffed) - BITSET(hud_updateflag, HEALTH_HUD) - BITSET(hud_updateflag, STATUS_HUD) - BITSET(hud_updateflag, LIFE_HUD) - ExtinguishMob() - fire_stacks = 0 - -/mob/living/proc/rejuvenate() - if(reagents) - reagents.clear_reagents() - - // shut down various types of badness - setToxLoss(0) - setOxyLoss(0) - setCloneLoss(0) - setBrainLoss(0) - SetParalysis(0) - SetStunned(0) - SetWeakened(0) - - // shut down ongoing problems - radiation = 0 - nutrition = 400 - bodytemperature = T20C - sdisabilities = 0 - disabilities = 0 - - // fix blindness and deafness - blinded = 0 - SetBlinded(0) - eye_blurry = 0 - ear_deaf = 0 - ear_damage = 0 - heal_overall_damage(getBruteLoss(), getFireLoss()) - - // fix all of our organs - restore_all_organs() - - // remove the character from the list of the dead - if(stat == DEAD) - dead_mob_list -= src - living_mob_list += src - tod = null - timeofdeath = 0 - - // restore us to conciousness - stat = CONSCIOUS - - // make the icons look correct - regenerate_icons() - - BITSET(hud_updateflag, HEALTH_HUD) - BITSET(hud_updateflag, STATUS_HUD) - BITSET(hud_updateflag, LIFE_HUD) - - failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath. - reload_fullscreen() - - return - -/mob/living/proc/UpdateDamageIcon() - return - - -/mob/living/proc/Examine_OOC() - set name = "Examine Meta-Info (OOC)" - set category = "OOC" - set src in view() - //VOREStation Edit Start - Making it so SSD people have prefs with fallback to original style. - if(config.allow_Metadata) - if(ooc_notes) - to_chat(usr, "[src]'s Metainfo:
[ooc_notes]") - else if(client) - to_chat(usr, "[src]'s Metainfo:
[client.prefs.metadata]") - else - to_chat(usr, "[src] does not have any stored infomation!") - else - usr << "OOC Metadata is not supported by this server!" - //VOREStation Edit End - Making it so SSD people have prefs with fallback to original style. - return - -/mob/living/Move(a, b, flag) - - if (buckled && buckled.loc != a) //not updating position - if(istype(buckled, /mob)) //If you're buckled to a mob, a la slime things, keep on rolling. - return buckled.Move(a, b) - else //Otherwise, no running around for you. - return 0 - - if (restrained()) - stop_pulling() - - - var/t7 = 1 - if (restrained()) - for(var/mob/living/M in range(src, 1)) - if ((M.pulling == src && M.stat == 0 && !( M.restrained() ))) - t7 = null - if ((t7 && (pulling && ((get_dist(src, pulling) <= 1 || pulling.loc == loc) && (client && client.moving))))) - var/turf/T = loc - . = ..() - - if (pulling && pulling.loc) - if(!( isturf(pulling.loc) )) - stop_pulling() - return - - ///// - if(pulling && pulling.anchored) - stop_pulling() - return - - if (!restrained()) - var/diag = get_dir(src, pulling) - if ((diag - 1) & diag) - else - diag = null - if ((get_dist(src, pulling) > 1 || diag)) - if (isliving(pulling)) - var/mob/living/M = pulling - var/atom/movable/t = M.pulling - M.stop_pulling() - - if(!istype(M.loc, /turf/space)) - var/area/A = get_area(M) - if(A.has_gravity) - //this is the gay blood on floor shit -- Added back -- Skie - if (M.lying && (prob(M.getBruteLoss() / 6))) - var/bloodtrail = 1 //Checks if it's possible to even spill blood - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species.flags & NO_BLOOD) - bloodtrail = 0 - else - var/blood_volume = round((H.vessel.get_reagent_amount("blood")/H.species.blood_volume)*100) - if(blood_volume < BLOOD_VOLUME_SURVIVE) - bloodtrail = 0 //Most of it's gone already, just leave it be - else - H.vessel.remove_reagent("blood", 1) - if(bloodtrail) - var/turf/location = M.loc - if(istype(location, /turf/simulated)) - location.add_blood(M) - //pull damage with injured people - if(prob(25)) - M.adjustBruteLoss(1) - visible_message("\The [M]'s [M.isSynthetic() ? "state worsens": "wounds open more"] from being dragged!") - if(M.pull_damage()) - if(prob(25)) - M.adjustBruteLoss(2) - visible_message("\The [M]'s [M.isSynthetic() ? "state" : "wounds"] worsen terribly from being dragged!") - var/turf/location = M.loc - if (istype(location, /turf/simulated)) - var/bloodtrail = 1 //Checks if it's possible to even spill blood - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species.flags & NO_BLOOD) - bloodtrail = 0 - else - var/blood_volume = round((H.vessel.get_reagent_amount("blood")/H.species.blood_volume)*100) - if(blood_volume < BLOOD_VOLUME_SURVIVE) - bloodtrail = 0 //Most of it's gone already, just leave it be - else - H.vessel.remove_reagent("blood", 1) - if(bloodtrail) - if(istype(location, /turf/simulated)) - location.add_blood(M) - - step(pulling, get_dir(pulling.loc, T)) - if(t) - M.start_pulling(t) - else - if (pulling) - if (istype(pulling, /obj/structure/window)) - var/obj/structure/window/W = pulling - if(W.is_full_window()) - for(var/obj/structure/window/win in get_step(pulling,get_dir(pulling.loc, T))) - stop_pulling() - if (pulling) - step(pulling, get_dir(pulling.loc, T)) - else - stop_pulling() - . = ..() - - if (s_active && !( s_active in contents ) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much. - s_active.close(src) - -/mob/living/proc/handle_footstep(turf/T) - return FALSE - -/mob/living/verb/resist() - set name = "Resist" - set category = "IC" - - if(!incapacitated(INCAPACITATION_KNOCKOUT) && canClick()) - setClickCooldown(20) - resist_grab() - if(!weakened) - process_resist() - -/mob/living/proc/process_resist() - //Getting out of someone's inventory. - if(istype(src.loc, /obj/item/weapon/holder)) - escape_inventory(src.loc) - return - - //unbuckling yourself - if(buckled) - spawn() escape_buckle() - return TRUE - - //Breaking out of a locker? - if( src.loc && (istype(src.loc, /obj/structure/closet)) ) - var/obj/structure/closet/C = loc - spawn() C.mob_breakout(src) - return TRUE - - if(istype(loc,/obj/item/clothing)) - spawn() escape_clothes(loc) - - if(attempt_vr(src,"vore_process_resist",args)) return TRUE //VOREStation Code - -/mob/living/proc/escape_inventory(obj/item/weapon/holder/H) - if(H != src.loc) return - - var/mob/M = H.loc //Get our mob holder (if any). - - if(istype(M)) - M.drop_from_inventory(H) - to_chat(M, "\The [H] wriggles out of your grip!") - to_chat(src, "You wriggle out of \the [M]'s grip!") - - // Update whether or not this mob needs to pass emotes to contents. - for(var/atom/A in M.contents) - if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder)) - return - - else if(istype(H.loc,/obj/item/clothing/accessory/holster)) - var/obj/item/clothing/accessory/holster/holster = H.loc - if(holster.holstered == H) - holster.clear_holster() - to_chat(src, "You extricate yourself from \the [holster].") - H.forceMove(get_turf(H)) - else if(istype(H.loc,/obj/item)) - to_chat(src, "You struggle free of \the [H.loc].") - H.forceMove(get_turf(H)) - -//TFF 2/5/19: Polaris fix for resisting out of vehicles -/mob/living/proc/escape_buckle() - if(buckled) - if(istype(buckled, /obj/vehicle)) - var/obj/vehicle/vehicle = buckled - vehicle.unload() - else - buckled.user_unbuckle_mob(src, src) - -/mob/living/proc/resist_grab() - var/resisting = 0 - for(var/obj/item/weapon/grab/G in grabbed_by) - resisting++ - G.handle_resist() - if(resisting) - visible_message("[src] resists!") - -/mob/living/verb/lay_down() - set name = "Rest" - set category = "IC" - - resting = !resting - to_chat(src, "You are now [resting ? "resting" : "getting up"]") - update_canmove() - -//called when the mob receives a bright flash -/mob/living/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) - if(override_blindness_check || !(disabilities & BLIND)) - overlay_fullscreen("flash", type) - spawn(25) - if(src) - clear_fullscreen("flash", 25) - return 1 - -/mob/living/proc/cannot_use_vents() - if(mob_size > MOB_SMALL) - return "You can't fit into that vent." - return null - -/mob/living/proc/has_brain() - return 1 - -/mob/living/proc/has_eyes() - return 1 - -/mob/living/proc/slip(var/slipped_on,stun_duration=8) - return 0 - -/mob/living/carbon/drop_from_inventory(var/obj/item/W, var/atom/Target = null) - if(W in internal_organs) - return - ..() - -/mob/living/touch_map_edge() - - //check for nuke disks - if(client && stat != DEAD) //if they are clientless and dead don't bother, the parent will treat them as any other container - if(ticker && istype(ticker.mode, /datum/game_mode/nuclear)) //only really care if the game mode is nuclear - var/datum/game_mode/nuclear/G = ticker.mode - if(G.check_mob(src)) - if(x <= TRANSITIONEDGE) - inertia_dir = 4 - else if(x >= world.maxx -TRANSITIONEDGE) - inertia_dir = 8 - else if(y <= TRANSITIONEDGE) - inertia_dir = 1 - else if(y >= world.maxy -TRANSITIONEDGE) - inertia_dir = 2 - to_chat(src, "Something you are carrying is preventing you from leaving.") - return - - ..() - -//damage/heal the mob ears and adjust the deaf amount -/mob/living/adjustEarDamage(var/damage, var/deaf) - ear_damage = max(0, ear_damage + damage) - ear_deaf = max(0, ear_deaf + deaf) - -//pass a negative argument to skip one of the variable -/mob/living/setEarDamage(var/damage, var/deaf) - if(damage >= 0) - ear_damage = damage - if(deaf >= 0) - ear_deaf = deaf - -/mob/living/proc/vomit(var/skip_wait, var/blood_vomit) - if(!check_has_mouth()) - return - - if(!lastpuke) - lastpuke = 1 - if(isSynthetic()) - to_chat(src, "A sudden, dizzying wave of internal feedback rushes over you!") - src.Weaken(5) - else - if (nutrition <= 100) - to_chat(src, "You gag as you want to throw up, but there's nothing in your stomach!") - src.Weaken(10) - else - to_chat(src, "You feel nauseous...") - - if(!skip_wait) - sleep(150) //15 seconds until second warning - to_chat(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) //TODO: Make add_blood_floor remove blood from human mobs - if(istype(T)) - if(blood_vomit) - T.add_blood_floor(src) - else - T.add_vomit_floor(src, 1) - - if(blood_vomit) - if(getBruteLoss() < 50) - adjustBruteLoss(3) - else - nutrition -= 40 - adjustToxLoss(-3) - - sleep(350) - lastpuke = 0 - -/mob/living/update_canmove() - if(!resting && cannot_stand() && can_stand_overridden()) - lying = 0 - canmove = 1 - else - if(istype(buckled, /obj/vehicle)) - var/obj/vehicle/V = buckled - if(is_physically_disabled()) - lying = 0 - canmove = 1 - if(!V.riding_datum) // If it has a riding datum, the datum handles moving the pixel_ vars. - pixel_y = V.mob_offset_y - 5 - else - if(buckled.buckle_lying != -1) - lying = buckled.buckle_lying - canmove = 1 - if(!V.riding_datum) // If it has a riding datum, the datum handles moving the pixel_ vars. - pixel_y = V.mob_offset_y - else if(buckled) - anchored = 1 - canmove = 0 - if(istype(buckled)) - if(buckled.buckle_lying != -1) - lying = buckled.buckle_lying - if(buckled.buckle_movable) - anchored = 0 - canmove = 1 - else - lying = incapacitated(INCAPACITATION_KNOCKDOWN) - canmove = !incapacitated(INCAPACITATION_DISABLED) - - if(lying) - density = 0 - if(l_hand) unEquip(l_hand) - if(r_hand) unEquip(r_hand) - update_water() // Submerges the mob. - else - density = initial(density) - - for(var/obj/item/weapon/grab/G in grabbed_by) - if(G.state >= GRAB_AGGRESSIVE) - canmove = 0 - break - - if(lying != lying_prev) - lying_prev = lying - update_transform() - //VOREStation Add - if(lying && LAZYLEN(buckled_mobs)) - for(var/rider in buckled_mobs) - var/mob/living/L = rider - if(buckled_mobs[rider] != "riding") - continue // Only boot off riders - if(riding_datum) - riding_datum.force_dismount(L) - else - unbuckle_mob(L) - L.Stun(5) - //VOREStation Add End - - return canmove - -// Adds overlays for specific modifiers. -// You'll have to add your own implementation for non-humans currently, just override this proc. -/mob/living/proc/update_modifier_visuals() - return - -/mob/living/proc/update_water() // Involves overlays for humans. Maybe we'll get submerged sprites for borgs in the future? - return - -/mob/living/proc/can_feel_pain(var/check_organ) - if(isSynthetic()) - return FALSE - return TRUE - -// Gets the correct icon_state for being on fire. See OnFire.dmi for the icons. -/mob/living/proc/get_fire_icon_state() - return "generic" - -// Called by job_controller. -/mob/living/proc/equip_post_job() - return - -// Used to check if something is capable of thought, in the traditional sense. -/mob/living/proc/is_sentient() - return TRUE - - -/mob/living/update_transform() - // First, get the correct size. - var/desired_scale = size_multiplier //VOREStation edit - for(var/datum/modifier/M in modifiers) - if(!isnull(M.icon_scale_percent)) - desired_scale *= M.icon_scale_percent - - // Now for the regular stuff. - var/matrix/M = matrix() - M.Scale(desired_scale) - M.Translate(0, 16*(desired_scale-1)) - src.transform = M - //animate(src, transform = M, time = 10) //VOREStation edit - - -// This handles setting the client's color variable, which makes everything look a specific color. -// This proc is here so it can be called without needing to check if the client exists, or if the client relogs. -/mob/living/update_client_color() - if(!client) - return - - var/list/colors_to_blend = list() - for(var/datum/modifier/M in modifiers) - if(!isnull(M.client_color)) - if(islist(M.client_color)) //It's a color matrix! Forget it. Just use that one. - animate(client, color = M.client_color, time = 10) - return - colors_to_blend += M.client_color - - if(colors_to_blend.len) - var/final_color - if(colors_to_blend.len == 1) // If it's just one color we can skip all of this work. - final_color = colors_to_blend[1] - - else // Otherwise we need to do some messy additive blending. - var/R = 0 - var/G = 0 - var/B = 0 - - for(var/C in colors_to_blend) - var/RGB = hex2rgb(C) - R = between(0, R + RGB[1], 255) - G = between(0, G + RGB[2], 255) - B = between(0, B + RGB[3], 255) - final_color = rgb(R,G,B) - - if(final_color) - var/old_color = client.color // Don't know if BYOND has an internal optimization to not care about animate() calls that effectively do nothing. - if(final_color != old_color) // Gonna do a check just incase. - animate(client, color = final_color, time = 10) - - else // No colors, so remove the client's color. - animate(client, color = null, time = 10) - -/mob/living/swap_hand() - src.hand = !( src.hand ) - if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) - if(hand) //This being 1 means the left hand is in use - hud_used.l_hand_hud_object.icon_state = "l_hand_active" - hud_used.r_hand_hud_object.icon_state = "r_hand_inactive" - else - hud_used.l_hand_hud_object.icon_state = "l_hand_inactive" - hud_used.r_hand_hud_object.icon_state = "r_hand_active" - - // We just swapped hands, so the thing in our inactive hand will notice it's not the focus - var/obj/item/I = get_inactive_hand() - if(I) - if(I.zoom) - I.zoom() - I.in_inactive_hand(src) //This'll do specific things, determined by the item - return - -/mob/living/proc/activate_hand(var/selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand. - - if(istext(selhand)) - selhand = lowertext(selhand) - - if(selhand == "right" || selhand == "r") - selhand = 0 - if(selhand == "left" || selhand == "l") - selhand = 1 - - if(selhand != src.hand) - swap_hand() - -/mob/living/throw_item(atom/target) - src.throw_mode_off() - if(usr.stat || !target) - return - if(target.type == /obj/screen) return - - var/atom/movable/item = src.get_active_hand() - - if(!item) return - - var/throw_range = item.throw_range - if (istype(item, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = item - item = G.throw_held() //throw the person instead of the grab - if(ismob(item)) - var/mob/M = item - - //limit throw range by relative mob size - throw_range = round(M.throw_range * min(src.mob_size/M.mob_size, 1)) - - var/turf/end_T = get_turf(target) - if(end_T) - add_attack_logs(src,M,"Thrown via grab to [end_T.x],[end_T.y],[end_T.z]") - - src.drop_from_inventory(item) - if(!item || !isturf(item.loc)) - return - - //actually throw it! - src.visible_message("[src] has thrown [item].") - - if(!src.lastarea) - src.lastarea = get_area(src.loc) - if((istype(src.loc, /turf/space)) || (src.lastarea.has_gravity == 0)) - src.inertia_dir = get_dir(target, src) - step(src, inertia_dir) - - -/* - if(istype(src.loc, /turf/space) || (src.flags & NOGRAV)) //they're in space, move em one space in the opposite direction - src.inertia_dir = get_dir(target, src) - step(src, inertia_dir) -*/ - - - item.throw_at(target, throw_range, item.throw_speed, src) - -/mob/living/get_sound_env(var/pressure_factor) - if (hallucination) - return PSYCHOTIC - else if (druggy) - return DRUGGED - else if (drowsyness) - return DIZZY - else if (confused) - return DIZZY - else if (sleeping) - return UNDERWATER - else - return ..() - -//Add an entry to overlays, assuming it exists -/mob/living/proc/apply_hud(cache_index, var/image/I) - hud_list[cache_index] = I - if((. = hud_list[cache_index])) - //underlays += . - add_overlay(.) - -//Remove an entry from overlays, and from the list -/mob/living/proc/grab_hud(cache_index) - var/I = hud_list[cache_index] - if(I) - //underlays -= I - cut_overlay(I) - hud_list[cache_index] = null - return I - -/mob/living/proc/make_hud_overlays() - return - - -/mob/living/proc/has_vision() - return !(eye_blind || (disabilities & BLIND) || stat || blinded) +/mob/living //for defining variables which all living mobs needs for various reasons + var/entangle_immunity = 0 + +/mob/living/New() + ..() + + //Prime this list if we need it. + if(has_huds) + add_overlay(backplane,TRUE) //Strap this on here, to block HUDs from appearing in rightclick menus: http://www.byond.com/forum/?post=2336679 + hud_list = list() + hud_list.len = TOTAL_HUDS + make_hud_overlays() + + //I'll just hang my coat up over here + dsoverlay = image('icons/mob/darksight.dmi',global_hud.darksight) //This is a secret overlay! Go look at the file, you'll see. + var/mutable_appearance/dsma = new(dsoverlay) //Changing like ten things, might as well. + dsma.alpha = 0 + dsma.plane = PLANE_LIGHTING + dsma.blend_mode = BLEND_ADD + dsoverlay.appearance = dsma + +/mob/living/Destroy() + dsoverlay.loc = null //I'll take my coat with me + dsoverlay = null + if(buckled) + buckled.unbuckle_mob(src, TRUE) + return ..() + +//mob verbs are faster than object verbs. See mob/verb/examine. +/mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1)) + set name = "Pull" + set category = "Object" + + if(AM.Adjacent(src)) + src.start_pulling(AM) + + return + +//mob verbs are faster than object verbs. See above. +/mob/living/pointed(atom/A as mob|obj|turf in view()) + if(src.stat || !src.canmove || src.restrained()) + return 0 + if(src.status_flags & FAKEDEATH) + return 0 + if(!..()) + return 0 + + usr.visible_message("[src] points to [A]") + return 1 + +/*one proc, four uses +swapping: if it's 1, the mobs are trying to switch, if 0, non-passive is pushing passive +default behaviour is: + - non-passive mob passes the passive version + - passive mob checks to see if its mob_bump_flag is in the non-passive's mob_bump_flags + - if si, the proc returns +*/ +/mob/living/proc/can_move_mob(var/mob/living/swapped, swapping = 0, passive = 0) + if(!swapped) + return 1 + if(!passive) + return swapped.can_move_mob(src, swapping, 1) + else + var/context_flags = 0 + if(swapping) + context_flags = swapped.mob_swap_flags + else + context_flags = swapped.mob_push_flags + if(!mob_bump_flag) //nothing defined, go wild + return 1 + if(mob_bump_flag & context_flags) + return 1 + return 0 + +/mob/living/Bump(atom/movable/AM, yes) + spawn(0) + if ((!( yes ) || now_pushing) || !loc) + return + now_pushing = 1 + if (istype(AM, /mob/living)) + var/mob/living/tmob = AM + + //Even if we don't push/swap places, we "touched" them, so spread fire + spread_fire(tmob) + + for(var/mob/living/M in range(tmob, 1)) + if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) ) + if ( !(world.time % 5) ) + to_chat(src, "[tmob] is restrained, you cannot push past") + now_pushing = 0 + return + if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) ) + if ( !(world.time % 5) ) + to_chat(src, "[tmob] is restraining [M], you cannot push past") + now_pushing = 0 + return + + //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller + var/dense = 0 + if(loc.density) + dense = 1 + for(var/atom/movable/A in loc) + if(A == src) + continue + if(A.density) + if(A.flags&ON_BORDER) + dense = !A.CanPass(src, src.loc) + else + dense = 1 + if(dense) break + + //Leaping mobs just land on the tile, no pushing, no anything. + if(status_flags & LEAPING) + loc = tmob.loc + status_flags &= ~LEAPING + now_pushing = 0 + return + + if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && tmob.canmove && canmove && !tmob.buckled && !buckled && !dense && can_move_mob(tmob, 1, 0)) // mutual brohugs all around! + var/turf/oldloc = loc + forceMove(tmob.loc) + + //VOREstation Edit - Begin + if (istype(tmob, /mob/living/simple_animal)) //check bumpnom chance, if it's a simplemob that's bumped + tmob.Bumped(src) + else if(istype(src, /mob/living/simple_animal)) //otherwise, if it's a simplemob doing the bumping. Simplemob on simplemob doesn't seem to trigger but that's fine. + Bumped(tmob) + if (tmob.loc == src) //check if they got ate, and if so skip the forcemove + now_pushing = 0 + return + + // In case of micros, we don't swap positions; instead occupying the same square! + if (handle_micro_bump_helping(tmob)) + now_pushing = 0 + return + // TODO - Check if we need to do something about the slime.UpdateFeed() we are skipping below. + // VOREStation Edit - End + + tmob.forceMove(oldloc) + now_pushing = 0 + return + + if(!can_move_mob(tmob, 0, 0)) + now_pushing = 0 + return + if(a_intent == I_HELP || src.restrained()) + now_pushing = 0 + return + + // VOREStation Edit - Begin + // Plow that nerd. + if(ishuman(tmob)) + var/mob/living/carbon/human/H = tmob + if(H.species.lightweight == 1 && prob(50)) + H.visible_message("[src] bumps into [H], knocking them off balance!") + H.Weaken(5) + now_pushing = 0 + return + // Handle grabbing, stomping, and such of micros! + if(handle_micro_bump_other(tmob)) return + // VOREStation Edit - End + + if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) + if(prob(40) && !(FAT in src.mutations)) + to_chat(src, "You fail to push [tmob]'s fat ass out of the way.") + now_pushing = 0 + return + if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot)) + if(prob(99)) + now_pushing = 0 + return + if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot)) + if(prob(99)) + now_pushing = 0 + return + if(!(tmob.status_flags & CANPUSH)) + now_pushing = 0 + return + + tmob.LAssailant = src + + now_pushing = 0 + spawn(0) + ..() + if (!istype(AM, /atom/movable) || AM.anchored) + //VOREStation Edit - object-specific proc for running into things + if(((confused || is_blind()) && stat == CONSCIOUS && prob(50) && m_intent=="run") || flying) + AM.stumble_into(src) + //VOREStation Edit End + /* VOREStation Removal - See above + Weaken(2) + playsound(loc, "punch", 25, 1, -1) + visible_message("[src] [pick("ran", "slammed")] into \the [AM]!") + src.apply_damage(5, BRUTE) + src << ("You just [pick("ran", "slammed")] into \the [AM]!") + to_chat(src, "You just [pick("ran", "slammed")] into \the [AM]!") + */ // VOREStation Removal End + return + if (!now_pushing) + if(isobj(AM)) + var/obj/I = AM + if(!can_pull_size || can_pull_size < I.w_class) + return + now_pushing = 1 + + var/t = get_dir(src, AM) + if (istype(AM, /obj/structure/window)) + for(var/obj/structure/window/win in get_step(AM,t)) + now_pushing = 0 + return + step(AM, t) + if(ishuman(AM) && AM:grabbed_by) + for(var/obj/item/weapon/grab/G in AM:grabbed_by) + step(G:assailant, get_dir(G:assailant, AM)) + G.adjust_position() + now_pushing = 0 + return + return + +/mob/living/verb/succumb() + set hidden = 1 + if ((src.health < 0 && src.health > (5-src.getMaxHealth()))) // Health below Zero but above 5-away-from-death, as before, but variable + src.death() + to_chat(src, "You have given up life and succumbed to death.") + else + to_chat(src, "You are not injured enough to succumb to death!") + +/mob/living/proc/updatehealth() + if(status_flags & GODMODE) + health = 100 + stat = CONSCIOUS + else + health = getMaxHealth() - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss() - halloss + + +//This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually +//affects them once clothing is factored in. ~Errorage +/mob/living/proc/calculate_affecting_pressure(var/pressure) + return + + +//sort of a legacy burn method for /electrocute, /shock, and the e_chair +/mob/living/proc/burn_skin(burn_amount) + if(istype(src, /mob/living/carbon/human)) + //world << "DEBUG: burn_skin(), mutations=[mutations]" + if(mShock in src.mutations) //shockproof + return 0 + if (COLD_RESISTANCE in src.mutations) //fireproof + return 0 + var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part + var/divided_damage = (burn_amount)/(H.organs.len) + var/extradam = 0 //added to when organ is at max dam + for(var/obj/item/organ/external/affecting in H.organs) + if(!affecting) continue + if(affecting.take_damage(0, divided_damage+extradam)) //TODO: fix the extradam stuff. Or, ebtter yet...rewrite this entire proc ~Carn + H.UpdateDamageIcon() + H.updatehealth() + return 1 + else if(istype(src, /mob/living/silicon/ai)) + return 0 + +/mob/living/proc/adjustBodyTemp(actual, desired, incrementboost) + var/temperature = actual + var/difference = abs(actual-desired) //get difference + var/increments = difference/10 //find how many increments apart they are + var/change = increments*incrementboost // Get the amount to change by (x per increment) + + // Too cold + if(actual < desired) + temperature += change + if(actual > desired) + temperature = desired + // Too hot + if(actual > desired) + temperature -= change + if(actual < desired) + temperature = desired +// if(istype(src, /mob/living/carbon/human)) +// world << "[src] ~ [src.bodytemperature] ~ [temperature]" + return temperature + + +// ++++ROCKDTBEN++++ MOB PROCS -- Ask me before touching. +// Stop! ... Hammertime! ~Carn +// I touched them without asking... I'm soooo edgy ~Erro (added nodamage checks) + +/mob/living/proc/getBruteLoss() + return bruteloss + +/mob/living/proc/getShockBruteLoss() //Only checks for things that'll actually hurt (not robolimbs) + return bruteloss + +/mob/living/proc/getActualBruteLoss() // Mostly for humans with robolimbs. + return getBruteLoss() + +//'include_robo' only applies to healing, for legacy purposes, as all damage typically hurts both types of organs +/mob/living/proc/adjustBruteLoss(var/amount,var/include_robo) + if(status_flags & GODMODE) return 0 //godmode + + if(amount > 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.incoming_damage_percent)) + amount *= M.incoming_damage_percent + if(!isnull(M.incoming_brute_damage_percent)) + amount *= M.incoming_brute_damage_percent + else if(amount < 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.incoming_healing_percent)) + amount *= M.incoming_healing_percent + + bruteloss = min(max(bruteloss + amount, 0),(getMaxHealth()*2)) + updatehealth() + +/mob/living/proc/getOxyLoss() + return oxyloss + +/mob/living/proc/adjustOxyLoss(var/amount) + if(status_flags & GODMODE) return 0 //godmode + + if(amount > 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.incoming_damage_percent)) + amount *= M.incoming_damage_percent + if(!isnull(M.incoming_oxy_damage_percent)) + amount *= M.incoming_oxy_damage_percent + else if(amount < 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.incoming_healing_percent)) + amount *= M.incoming_healing_percent + + oxyloss = min(max(oxyloss + amount, 0),(getMaxHealth()*2)) + updatehealth() + +/mob/living/proc/setOxyLoss(var/amount) + if(status_flags & GODMODE) return 0 //godmode + oxyloss = amount + +/mob/living/proc/getToxLoss() + return toxloss + +/mob/living/proc/adjustToxLoss(var/amount) + if(status_flags & GODMODE) return 0 //godmode + + if(amount > 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.incoming_damage_percent)) + amount *= M.incoming_damage_percent + if(!isnull(M.incoming_tox_damage_percent)) + amount *= M.incoming_tox_damage_percent + else if(amount < 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.incoming_healing_percent)) + amount *= M.incoming_healing_percent + + toxloss = min(max(toxloss + amount, 0),(getMaxHealth()*2)) + updatehealth() + +/mob/living/proc/setToxLoss(var/amount) + if(status_flags & GODMODE) return 0 //godmode + toxloss = amount + +/mob/living/proc/getFireLoss() + return fireloss + +/mob/living/proc/getShockFireLoss() //Only checks for things that'll actually hurt (not robolimbs) + return fireloss + +/mob/living/proc/getActualFireLoss() // Mostly for humans with robolimbs. + return getFireLoss() + +//'include_robo' only applies to healing, for legacy purposes, as all damage typically hurts both types of organs +/mob/living/proc/adjustFireLoss(var/amount,var/include_robo) + if(status_flags & GODMODE) return 0 //godmode + if(amount > 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.incoming_damage_percent)) + amount *= M.incoming_damage_percent + if(!isnull(M.incoming_fire_damage_percent)) + amount *= M.incoming_fire_damage_percent + else if(amount < 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.incoming_healing_percent)) + amount *= M.incoming_healing_percent + + fireloss = min(max(fireloss + amount, 0),(getMaxHealth()*2)) + updatehealth() + +/mob/living/proc/getCloneLoss() + return cloneloss + +/mob/living/proc/adjustCloneLoss(var/amount) + if(status_flags & GODMODE) return 0 //godmode + + if(amount > 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.incoming_damage_percent)) + amount *= M.incoming_damage_percent + if(!isnull(M.incoming_clone_damage_percent)) + amount *= M.incoming_clone_damage_percent + else if(amount < 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.incoming_healing_percent)) + amount *= M.incoming_healing_percent + + cloneloss = min(max(cloneloss + amount, 0),(getMaxHealth()*2)) + updatehealth() + +/mob/living/proc/setCloneLoss(var/amount) + if(status_flags & GODMODE) return 0 //godmode + cloneloss = amount + +/mob/living/proc/getBrainLoss() + return brainloss + +/mob/living/proc/adjustBrainLoss(var/amount) + if(status_flags & GODMODE) return 0 //godmode + brainloss = min(max(brainloss + amount, 0),(getMaxHealth()*2)) + +/mob/living/proc/setBrainLoss(var/amount) + if(status_flags & GODMODE) return 0 //godmode + brainloss = amount + +/mob/living/proc/getHalLoss() + return halloss + +/mob/living/proc/adjustHalLoss(var/amount) + if(status_flags & GODMODE) return 0 //godmode + if(amount > 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.incoming_damage_percent)) + amount *= M.incoming_damage_percent + if(!isnull(M.incoming_hal_damage_percent)) + amount *= M.incoming_hal_damage_percent + if(!isnull(M.disable_duration_percent)) + amount *= M.incoming_hal_damage_percent + else if(amount < 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.incoming_healing_percent)) + amount *= M.incoming_healing_percent + halloss = min(max(halloss + amount, 0),(getMaxHealth()*2)) + updatehealth() + +/mob/living/proc/setHalLoss(var/amount) + if(status_flags & GODMODE) return 0 //godmode + halloss = amount + +// Use this to get a mob's max health whenever possible. Reading maxHealth directly will give inaccurate results if any modifiers exist. +/mob/living/proc/getMaxHealth() + var/result = maxHealth + for(var/datum/modifier/M in modifiers) + if(!isnull(M.max_health_flat)) + result += M.max_health_flat + // Second loop is so we can get all the flat adjustments first before multiplying, otherwise the result will be different. + for(var/datum/modifier/M in modifiers) + if(!isnull(M.max_health_percent)) + result *= M.max_health_percent + return result + +/mob/living/proc/setMaxHealth(var/newMaxHealth) + health = (health/maxHealth) * (newMaxHealth) //VOREStation Add - Adjust existing health + maxHealth = newMaxHealth + +/mob/living/Stun(amount) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.disable_duration_percent)) + amount = round(amount * M.disable_duration_percent) + ..(amount) + +/mob/living/AdjustStunned(amount) + if(amount > 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.disable_duration_percent)) + amount = round(amount * M.disable_duration_percent) + ..(amount) + +/mob/living/Weaken(amount) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.disable_duration_percent)) + amount = round(amount * M.disable_duration_percent) + ..(amount) + +/mob/living/AdjustWeakened(amount) + if(amount > 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.disable_duration_percent)) + amount = round(amount * M.disable_duration_percent) + ..(amount) + +/mob/living/Paralyse(amount) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.disable_duration_percent)) + amount = round(amount * M.disable_duration_percent) + ..(amount) + +/mob/living/AdjustParalysis(amount) + if(amount > 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.disable_duration_percent)) + amount = round(amount * M.disable_duration_percent) + ..(amount) + +/mob/living/Sleeping(amount) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.disable_duration_percent)) + amount = round(amount * M.disable_duration_percent) + ..(amount) + +/mob/living/AdjustSleeping(amount) + if(amount > 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.disable_duration_percent)) + amount = round(amount * M.disable_duration_percent) + ..(amount) + +/mob/living/Confuse(amount) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.disable_duration_percent)) + amount = round(amount * M.disable_duration_percent) + ..(amount) + +/mob/living/AdjustConfused(amount) + if(amount > 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.disable_duration_percent)) + amount = round(amount * M.disable_duration_percent) + ..(amount) + +/mob/living/Blind(amount) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.disable_duration_percent)) + amount = round(amount * M.disable_duration_percent) + ..(amount) + +/mob/living/AdjustBlinded(amount) + if(amount > 0) + for(var/datum/modifier/M in modifiers) + if(!isnull(M.disable_duration_percent)) + amount = round(amount * M.disable_duration_percent) + ..(amount) + +// ++++ROCKDTBEN++++ MOB PROCS //END + +/mob/proc/get_contents() + + +//Recursive function to find everything a mob is holding. +/mob/living/get_contents(var/obj/item/weapon/storage/Storage = null) + var/list/L = list() + + if(Storage) //If it called itself + L += Storage.return_inv() + + //Leave this commented out, it will cause storage items to exponentially add duplicate to the list + //for(var/obj/item/weapon/storage/S in Storage.return_inv()) //Check for storage items + // L += get_contents(S) + + for(var/obj/item/weapon/gift/G in Storage.return_inv()) //Check for gift-wrapped items + L += G.gift + if(istype(G.gift, /obj/item/weapon/storage)) + L += get_contents(G.gift) + + for(var/obj/item/smallDelivery/D in Storage.return_inv()) //Check for package wrapped items + L += D.wrapped + if(istype(D.wrapped, /obj/item/weapon/storage)) //this should never happen + L += get_contents(D.wrapped) + return L + + else + + L += src.contents + for(var/obj/item/weapon/storage/S in src.contents) //Check for storage items + L += get_contents(S) + + for(var/obj/item/weapon/gift/G in src.contents) //Check for gift-wrapped items + L += G.gift + if(istype(G.gift, /obj/item/weapon/storage)) + L += get_contents(G.gift) + + for(var/obj/item/smallDelivery/D in src.contents) //Check for package wrapped items + L += D.wrapped + if(istype(D.wrapped, /obj/item/weapon/storage)) //this should never happen + L += get_contents(D.wrapped) + return L + +/mob/living/proc/check_contents_for(A) + var/list/L = src.get_contents() + + for(var/obj/B in L) + if(B.type == A) + return 1 + return 0 + + +/mob/living/proc/can_inject() + return 1 + +/mob/living/proc/get_organ_target() + var/mob/shooter = src + var/t = shooter:zone_sel.selecting + if ((t in list( O_EYES, O_MOUTH ))) + t = BP_HEAD + var/obj/item/organ/external/def_zone = ran_zone(t) + return def_zone + + +// heal ONE external organ, organ gets randomly selected from damaged ones. +/mob/living/proc/heal_organ_damage(var/brute, var/burn) + adjustBruteLoss(-brute) + adjustFireLoss(-burn) + src.updatehealth() + +// damage ONE external organ, organ gets randomly selected from damaged ones. +/mob/living/proc/take_organ_damage(var/brute, var/burn, var/emp=0) + if(status_flags & GODMODE) return 0 //godmode + adjustBruteLoss(brute) + adjustFireLoss(burn) + src.updatehealth() + +// heal MANY external organs, in random order +/mob/living/proc/heal_overall_damage(var/brute, var/burn) + adjustBruteLoss(-brute) + adjustFireLoss(-burn) + src.updatehealth() + +// damage MANY external organs, in random order +/mob/living/proc/take_overall_damage(var/brute, var/burn, var/used_weapon = null) + if(status_flags & GODMODE) return 0 //godmode + adjustBruteLoss(brute) + adjustFireLoss(burn) + src.updatehealth() + +/mob/living/proc/restore_all_organs() + return + + + +/mob/living/proc/revive() + rejuvenate() + if(buckled) + buckled.unbuckle_mob() + if(iscarbon(src)) + var/mob/living/carbon/C = src + + if (C.handcuffed && !initial(C.handcuffed)) + C.drop_from_inventory(C.handcuffed) + C.handcuffed = initial(C.handcuffed) + + if (C.legcuffed && !initial(C.legcuffed)) + C.drop_from_inventory(C.legcuffed) + C.legcuffed = initial(C.legcuffed) + BITSET(hud_updateflag, HEALTH_HUD) + BITSET(hud_updateflag, STATUS_HUD) + BITSET(hud_updateflag, LIFE_HUD) + ExtinguishMob() + fire_stacks = 0 + +/mob/living/proc/rejuvenate() + if(reagents) + reagents.clear_reagents() + + // shut down various types of badness + setToxLoss(0) + setOxyLoss(0) + setCloneLoss(0) + setBrainLoss(0) + SetParalysis(0) + SetStunned(0) + SetWeakened(0) + + // shut down ongoing problems + radiation = 0 + nutrition = 400 + bodytemperature = T20C + sdisabilities = 0 + disabilities = 0 + + // fix blindness and deafness + blinded = 0 + SetBlinded(0) + eye_blurry = 0 + ear_deaf = 0 + ear_damage = 0 + heal_overall_damage(getBruteLoss(), getFireLoss()) + + // fix all of our organs + restore_all_organs() + + // remove the character from the list of the dead + if(stat == DEAD) + dead_mob_list -= src + living_mob_list += src + tod = null + timeofdeath = 0 + + // restore us to conciousness + stat = CONSCIOUS + + // make the icons look correct + regenerate_icons() + + BITSET(hud_updateflag, HEALTH_HUD) + BITSET(hud_updateflag, STATUS_HUD) + BITSET(hud_updateflag, LIFE_HUD) + + failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath. + reload_fullscreen() + + return + +/mob/living/proc/UpdateDamageIcon() + return + + +/mob/living/proc/Examine_OOC() + set name = "Examine Meta-Info (OOC)" + set category = "OOC" + set src in view() + //VOREStation Edit Start - Making it so SSD people have prefs with fallback to original style. + if(config.allow_Metadata) + if(ooc_notes) + to_chat(usr, "[src]'s Metainfo:
[ooc_notes]") + else if(client) + to_chat(usr, "[src]'s Metainfo:
[client.prefs.metadata]") + else + to_chat(usr, "[src] does not have any stored infomation!") + else + usr << "OOC Metadata is not supported by this server!" + //VOREStation Edit End - Making it so SSD people have prefs with fallback to original style. + return + +/mob/living/Move(a, b, flag) + + if (buckled && buckled.loc != a) //not updating position + if(istype(buckled, /mob)) //If you're buckled to a mob, a la slime things, keep on rolling. + return buckled.Move(a, b) + else //Otherwise, no running around for you. + return 0 + + if (restrained()) + stop_pulling() + + + var/t7 = 1 + if (restrained()) + for(var/mob/living/M in range(src, 1)) + if ((M.pulling == src && M.stat == 0 && !( M.restrained() ))) + t7 = null + if ((t7 && (pulling && ((get_dist(src, pulling) <= 1 || pulling.loc == loc) && (client && client.moving))))) + var/turf/T = loc + . = ..() + + if (pulling && pulling.loc) + if(!( isturf(pulling.loc) )) + stop_pulling() + return + + ///// + if(pulling && pulling.anchored) + stop_pulling() + return + + if (!restrained()) + var/diag = get_dir(src, pulling) + if ((diag - 1) & diag) + else + diag = null + if ((get_dist(src, pulling) > 1 || diag)) + if (isliving(pulling)) + var/mob/living/M = pulling + var/atom/movable/t = M.pulling + M.stop_pulling() + + if(!istype(M.loc, /turf/space)) + var/area/A = get_area(M) + if(A.has_gravity) + //this is the gay blood on floor shit -- Added back -- Skie + if (M.lying && (prob(M.getBruteLoss() / 6))) + var/bloodtrail = 1 //Checks if it's possible to even spill blood + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species.flags & NO_BLOOD) + bloodtrail = 0 + else + var/blood_volume = round((H.vessel.get_reagent_amount("blood")/H.species.blood_volume)*100) + if(blood_volume < BLOOD_VOLUME_SURVIVE) + bloodtrail = 0 //Most of it's gone already, just leave it be + else + H.vessel.remove_reagent("blood", 1) + if(bloodtrail) + var/turf/location = M.loc + if(istype(location, /turf/simulated)) + location.add_blood(M) + //pull damage with injured people + if(prob(25)) + M.adjustBruteLoss(1) + visible_message("\The [M]'s [M.isSynthetic() ? "state worsens": "wounds open more"] from being dragged!") + if(M.pull_damage()) + if(prob(25)) + M.adjustBruteLoss(2) + visible_message("\The [M]'s [M.isSynthetic() ? "state" : "wounds"] worsen terribly from being dragged!") + var/turf/location = M.loc + if (istype(location, /turf/simulated)) + var/bloodtrail = 1 //Checks if it's possible to even spill blood + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species.flags & NO_BLOOD) + bloodtrail = 0 + else + var/blood_volume = round((H.vessel.get_reagent_amount("blood")/H.species.blood_volume)*100) + if(blood_volume < BLOOD_VOLUME_SURVIVE) + bloodtrail = 0 //Most of it's gone already, just leave it be + else + H.vessel.remove_reagent("blood", 1) + if(bloodtrail) + if(istype(location, /turf/simulated)) + location.add_blood(M) + + step(pulling, get_dir(pulling.loc, T)) + if(t) + M.start_pulling(t) + else + if (pulling) + if (istype(pulling, /obj/structure/window)) + var/obj/structure/window/W = pulling + if(W.is_full_window()) + for(var/obj/structure/window/win in get_step(pulling,get_dir(pulling.loc, T))) + stop_pulling() + if (pulling) + step(pulling, get_dir(pulling.loc, T)) + else + stop_pulling() + . = ..() + + if (s_active && !( s_active in contents ) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much. + s_active.close(src) + +/mob/living/proc/handle_footstep(turf/T) + return FALSE + +/mob/living/verb/resist() + set name = "Resist" + set category = "IC" + + if(!incapacitated(INCAPACITATION_KNOCKOUT) && canClick()) + setClickCooldown(20) + resist_grab() + if(!weakened) + process_resist() + +/mob/living/proc/process_resist() + //Getting out of someone's inventory. + if(istype(src.loc, /obj/item/weapon/holder)) + escape_inventory(src.loc) + return + + //unbuckling yourself + if(buckled) + spawn() escape_buckle() + return TRUE + + //Breaking out of a locker? + if( src.loc && (istype(src.loc, /obj/structure/closet)) ) + var/obj/structure/closet/C = loc + spawn() C.mob_breakout(src) + return TRUE + + if(istype(loc,/obj/item/clothing)) + spawn() escape_clothes(loc) + + if(attempt_vr(src,"vore_process_resist",args)) return TRUE //VOREStation Code + +/mob/living/proc/escape_inventory(obj/item/weapon/holder/H) + if(H != src.loc) return + + var/mob/M = H.loc //Get our mob holder (if any). + + if(istype(M)) + M.drop_from_inventory(H) + to_chat(M, "\The [H] wriggles out of your grip!") + to_chat(src, "You wriggle out of \the [M]'s grip!") + + // Update whether or not this mob needs to pass emotes to contents. + for(var/atom/A in M.contents) + if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder)) + return + + else if(istype(H.loc,/obj/item/clothing/accessory/holster)) + var/obj/item/clothing/accessory/holster/holster = H.loc + if(holster.holstered == H) + holster.clear_holster() + to_chat(src, "You extricate yourself from \the [holster].") + H.forceMove(get_turf(H)) + else if(istype(H.loc,/obj/item)) + to_chat(src, "You struggle free of \the [H.loc].") + H.forceMove(get_turf(H)) + +//TFF 2/5/19: Polaris fix for resisting out of vehicles +/mob/living/proc/escape_buckle() + if(buckled) + if(istype(buckled, /obj/vehicle)) + var/obj/vehicle/vehicle = buckled + vehicle.unload() + else + buckled.user_unbuckle_mob(src, src) + +/mob/living/proc/resist_grab() + var/resisting = 0 + for(var/obj/item/weapon/grab/G in grabbed_by) + resisting++ + G.handle_resist() + if(resisting) + visible_message("[src] resists!") + +/mob/living/verb/lay_down() + set name = "Rest" + set category = "IC" + + resting = !resting + to_chat(src, "You are now [resting ? "resting" : "getting up"]") + update_canmove() + +//called when the mob receives a bright flash +/mob/living/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) + if(override_blindness_check || !(disabilities & BLIND)) + overlay_fullscreen("flash", type) + spawn(25) + if(src) + clear_fullscreen("flash", 25) + return 1 + +/mob/living/proc/cannot_use_vents() + if(mob_size > MOB_SMALL) + return "You can't fit into that vent." + return null + +/mob/living/proc/has_brain() + return 1 + +/mob/living/proc/has_eyes() + return 1 + +/mob/living/proc/slip(var/slipped_on,stun_duration=8) + return 0 + +/mob/living/carbon/drop_from_inventory(var/obj/item/W, var/atom/Target = null) + if(W in internal_organs) + return + ..() + +/mob/living/touch_map_edge() + + //check for nuke disks + if(client && stat != DEAD) //if they are clientless and dead don't bother, the parent will treat them as any other container + if(ticker && istype(ticker.mode, /datum/game_mode/nuclear)) //only really care if the game mode is nuclear + var/datum/game_mode/nuclear/G = ticker.mode + if(G.check_mob(src)) + if(x <= TRANSITIONEDGE) + inertia_dir = 4 + else if(x >= world.maxx -TRANSITIONEDGE) + inertia_dir = 8 + else if(y <= TRANSITIONEDGE) + inertia_dir = 1 + else if(y >= world.maxy -TRANSITIONEDGE) + inertia_dir = 2 + to_chat(src, "Something you are carrying is preventing you from leaving.") + return + + ..() + +//damage/heal the mob ears and adjust the deaf amount +/mob/living/adjustEarDamage(var/damage, var/deaf) + ear_damage = max(0, ear_damage + damage) + ear_deaf = max(0, ear_deaf + deaf) + +//pass a negative argument to skip one of the variable +/mob/living/setEarDamage(var/damage, var/deaf) + if(damage >= 0) + ear_damage = damage + if(deaf >= 0) + ear_deaf = deaf + +/mob/living/proc/vomit(var/skip_wait, var/blood_vomit) + if(!check_has_mouth()) + return + + if(!lastpuke) + lastpuke = 1 + if(isSynthetic()) + to_chat(src, "A sudden, dizzying wave of internal feedback rushes over you!") + src.Weaken(5) + else + if (nutrition <= 100) + to_chat(src, "You gag as you want to throw up, but there's nothing in your stomach!") + src.Weaken(10) + else + to_chat(src, "You feel nauseous...") + + if(!skip_wait) + sleep(150) //15 seconds until second warning + to_chat(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) //TODO: Make add_blood_floor remove blood from human mobs + if(istype(T)) + if(blood_vomit) + T.add_blood_floor(src) + else + T.add_vomit_floor(src, 1) + + if(blood_vomit) + if(getBruteLoss() < 50) + adjustBruteLoss(3) + else + nutrition -= 40 + adjustToxLoss(-3) + + sleep(350) + lastpuke = 0 + +/mob/living/update_canmove() + if(!resting && cannot_stand() && can_stand_overridden()) + lying = 0 + canmove = 1 + else + if(istype(buckled, /obj/vehicle)) + var/obj/vehicle/V = buckled + if(is_physically_disabled()) + lying = 0 + canmove = 1 + if(!V.riding_datum) // If it has a riding datum, the datum handles moving the pixel_ vars. + pixel_y = V.mob_offset_y - 5 + else + if(buckled.buckle_lying != -1) + lying = buckled.buckle_lying + canmove = 1 + if(!V.riding_datum) // If it has a riding datum, the datum handles moving the pixel_ vars. + pixel_y = V.mob_offset_y + else if(buckled) + anchored = 1 + canmove = 0 + if(istype(buckled)) + if(buckled.buckle_lying != -1) + lying = buckled.buckle_lying + if(buckled.buckle_movable) + anchored = 0 + canmove = 1 + else + lying = incapacitated(INCAPACITATION_KNOCKDOWN) + canmove = !incapacitated(INCAPACITATION_DISABLED) + + if(lying) + density = 0 + if(l_hand) unEquip(l_hand) + if(r_hand) unEquip(r_hand) + update_water() // Submerges the mob. + else + density = initial(density) + + for(var/obj/item/weapon/grab/G in grabbed_by) + if(G.state >= GRAB_AGGRESSIVE) + canmove = 0 + break + + if(lying != lying_prev) + lying_prev = lying + update_transform() + //VOREStation Add + if(lying && LAZYLEN(buckled_mobs)) + for(var/rider in buckled_mobs) + var/mob/living/L = rider + if(buckled_mobs[rider] != "riding") + continue // Only boot off riders + if(riding_datum) + riding_datum.force_dismount(L) + else + unbuckle_mob(L) + L.Stun(5) + //VOREStation Add End + + return canmove + +// Adds overlays for specific modifiers. +// You'll have to add your own implementation for non-humans currently, just override this proc. +/mob/living/proc/update_modifier_visuals() + return + +/mob/living/proc/update_water() // Involves overlays for humans. Maybe we'll get submerged sprites for borgs in the future? + return + +/mob/living/proc/can_feel_pain(var/check_organ) + if(isSynthetic()) + return FALSE + return TRUE + +// Gets the correct icon_state for being on fire. See OnFire.dmi for the icons. +/mob/living/proc/get_fire_icon_state() + return "generic" + +// Called by job_controller. +/mob/living/proc/equip_post_job() + return + +// Used to check if something is capable of thought, in the traditional sense. +/mob/living/proc/is_sentient() + return TRUE + + +/mob/living/update_transform() + // First, get the correct size. + var/desired_scale = size_multiplier //VOREStation edit + for(var/datum/modifier/M in modifiers) + if(!isnull(M.icon_scale_percent)) + desired_scale *= M.icon_scale_percent + + // Now for the regular stuff. + var/matrix/M = matrix() + M.Scale(desired_scale) + M.Translate(0, 16*(desired_scale-1)) + src.transform = M + //animate(src, transform = M, time = 10) //VOREStation edit + + +// This handles setting the client's color variable, which makes everything look a specific color. +// This proc is here so it can be called without needing to check if the client exists, or if the client relogs. +/mob/living/update_client_color() + if(!client) + return + + var/list/colors_to_blend = list() + for(var/datum/modifier/M in modifiers) + if(!isnull(M.client_color)) + if(islist(M.client_color)) //It's a color matrix! Forget it. Just use that one. + animate(client, color = M.client_color, time = 10) + return + colors_to_blend += M.client_color + + if(colors_to_blend.len) + var/final_color + if(colors_to_blend.len == 1) // If it's just one color we can skip all of this work. + final_color = colors_to_blend[1] + + else // Otherwise we need to do some messy additive blending. + var/R = 0 + var/G = 0 + var/B = 0 + + for(var/C in colors_to_blend) + var/RGB = hex2rgb(C) + R = between(0, R + RGB[1], 255) + G = between(0, G + RGB[2], 255) + B = between(0, B + RGB[3], 255) + final_color = rgb(R,G,B) + + if(final_color) + var/old_color = client.color // Don't know if BYOND has an internal optimization to not care about animate() calls that effectively do nothing. + if(final_color != old_color) // Gonna do a check just incase. + animate(client, color = final_color, time = 10) + + else // No colors, so remove the client's color. + animate(client, color = null, time = 10) + +/mob/living/swap_hand() + src.hand = !( src.hand ) + if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) + if(hand) //This being 1 means the left hand is in use + hud_used.l_hand_hud_object.icon_state = "l_hand_active" + hud_used.r_hand_hud_object.icon_state = "r_hand_inactive" + else + hud_used.l_hand_hud_object.icon_state = "l_hand_inactive" + hud_used.r_hand_hud_object.icon_state = "r_hand_active" + + // We just swapped hands, so the thing in our inactive hand will notice it's not the focus + var/obj/item/I = get_inactive_hand() + if(I) + if(I.zoom) + I.zoom() + I.in_inactive_hand(src) //This'll do specific things, determined by the item + return + +/mob/living/proc/activate_hand(var/selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand. + + if(istext(selhand)) + selhand = lowertext(selhand) + + if(selhand == "right" || selhand == "r") + selhand = 0 + if(selhand == "left" || selhand == "l") + selhand = 1 + + if(selhand != src.hand) + swap_hand() + +/mob/living/throw_item(atom/target) + src.throw_mode_off() + if(usr.stat || !target) + return + if(target.type == /obj/screen) return + + var/atom/movable/item = src.get_active_hand() + + if(!item) return + + var/throw_range = item.throw_range + if (istype(item, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = item + item = G.throw_held() //throw the person instead of the grab + if(ismob(item)) + var/mob/M = item + + //limit throw range by relative mob size + throw_range = round(M.throw_range * min(src.mob_size/M.mob_size, 1)) + + var/turf/end_T = get_turf(target) + if(end_T) + add_attack_logs(src,M,"Thrown via grab to [end_T.x],[end_T.y],[end_T.z]") + + src.drop_from_inventory(item) + if(!item || !isturf(item.loc)) + return + + //actually throw it! + src.visible_message("[src] has thrown [item].") + + if(!src.lastarea) + src.lastarea = get_area(src.loc) + if((istype(src.loc, /turf/space)) || (src.lastarea.has_gravity == 0)) + src.inertia_dir = get_dir(target, src) + step(src, inertia_dir) + + +/* + if(istype(src.loc, /turf/space) || (src.flags & NOGRAV)) //they're in space, move em one space in the opposite direction + src.inertia_dir = get_dir(target, src) + step(src, inertia_dir) +*/ + + + item.throw_at(target, throw_range, item.throw_speed, src) + +/mob/living/get_sound_env(var/pressure_factor) + if (hallucination) + return PSYCHOTIC + else if (druggy) + return DRUGGED + else if (drowsyness) + return DIZZY + else if (confused) + return DIZZY + else if (sleeping) + return UNDERWATER + else + return ..() + +//Add an entry to overlays, assuming it exists +/mob/living/proc/apply_hud(cache_index, var/image/I) + hud_list[cache_index] = I + if((. = hud_list[cache_index])) + //underlays += . + add_overlay(.) + +//Remove an entry from overlays, and from the list +/mob/living/proc/grab_hud(cache_index) + var/I = hud_list[cache_index] + if(I) + //underlays -= I + cut_overlay(I) + hud_list[cache_index] = null + return I + +/mob/living/proc/make_hud_overlays() + return + + +/mob/living/proc/has_vision() + return !(eye_blind || (disabilities & BLIND) || stat || blinded) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 3358d1855e..af5d5f4dc4 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -33,7 +33,10 @@ "Fox" = "fox", "Parrot" = "parrot", "Rabbit" = "rabbit", - "Bear" = "bear" //VOREStation Edit + "Bear" = "bear", //VOREStation Edit + "Raccoon" = "raccoon", //Chompstation Edit + "Rat" = "rat", //Chompstation Edit + "Panther" = "panther" //Chompstation Edit ) var/global/list/possible_say_verbs = list( @@ -42,7 +45,8 @@ "Beep" = list("beeps","beeps loudly","boops"), "Chirp" = list("chirps","chirrups","cheeps"), "Feline" = list("purrs","yowls","meows"), - "Canine" = list("yaps","barks","woofs") + "Canine" = list("yaps","barks","woofs"), + "Rodent" = list("squeaks", "SQUEAKS", "sqiks")//Chompstation Edit ) var/obj/item/weapon/pai_cable/cable // The cable we produce and use when door or camera jacking @@ -315,7 +319,7 @@ return close_up() - +/*CHOMPstation edit | redefined in pai_vr.dm /mob/living/silicon/pai/proc/choose_chassis() set category = "pAI Commands" set name = "Choose Chassis" @@ -328,11 +332,11 @@ if(!choice) return icon_state = possible_chassis[choice] - finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes") + finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes")//CHOMPStation edit chassis = possible_chassis[choice] verbs |= /mob/living/proc/hide - +*/ /mob/living/silicon/pai/proc/choose_verbs() set category = "pAI Commands" set name = "Choose Speech Verbs" diff --git a/code/modules/mob/living/silicon/pai/pai_vr.dm b/code/modules/mob/living/silicon/pai/pai_vr.dm index c5de247595..4700660ad9 100644 --- a/code/modules/mob/living/silicon/pai/pai_vr.dm +++ b/code/modules/mob/living/silicon/pai/pai_vr.dm @@ -1,6 +1,10 @@ /mob/living/silicon/pai var/people_eaten = 0 icon = 'icons/mob/pai_vr.dmi' + var/global/list/wide_chassis = list( + "rat", + "panther" + ) /mob/living/silicon/pai/proc/pai_nom(var/mob/living/T in oview(1)) set name = "pAI Nom" @@ -31,6 +35,13 @@ else if(people_eaten && resting) icon_state = "[chassis]_rest_full" + if(chassis in wide_chassis) + icon = 'icons/mob/pai_vr64x64.dmi' + pixel_x = -16 + else + icon = 'icons/mob/pai_vr.dmi' + pixel_x = 0 + /mob/living/silicon/pai/update_icons() //And other functions cause this to occur, such as digesting someone. ..() update_fullness_pai() @@ -42,3 +53,21 @@ icon_state = "[chassis]_full" else if(people_eaten && resting) icon_state = "[chassis]_rest_full" + + if(chassis in wide_chassis) + icon = 'icons/mob/pai_vr64x64.dmi' + pixel_x = -16 + else + icon = 'icons/mob/pai_vr.dmi' + pixel_x = 0 +//proc override to avoid pAI players being invisible while the chassis selection window is open +/mob/living/silicon/pai/proc/choose_chassis() + set category = "pAI Commands" + set name = "Choose Chassis" + var/choice + + choice = input(usr,"What would you like to use for your mobile chassis icon?") as null|anything in possible_chassis + if(!choice) return + chassis = possible_chassis[choice] + verbs |= /mob/living/proc/hide + update_icon() diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm index 8fd9261325..d3cba5a43f 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm @@ -421,3 +421,27 @@ T.apply_damage(20, HALLOSS,, armor_block, armor_soak) if(prob(33)) T.apply_effect(3, WEAKEN, armor_block) + +/mob/living/silicon/robot/proc/reskin_booze() + set name = "Change Drink Color" + set category = "Robot Commands" + set desc = "Choose the color of drink displayed inside you." + + var/mob/M = usr + var/list/options = list() + options["Beer"] = "Beer Buddy" + options["Curacao"] = "Brilliant Blue" + options["Coffee"] = "Caffine Dispenser" + options["Space Mountain Wind"] = "Gamer Juice Maker" + options["Whiskey Soda"] = "Liqour Licker" + options["Grape Soda"] = "The Grapist" + options["Demon's Blood"] = "Vampire's Aid" + options["Slav Vodka"] = "Vodka Komrade" + var/choice = input(M,"Choose your drink!") in options + if(src && choice && !M.stat && in_range(M,src)) + icontype = options[choice] + var/active_sound = 'sound/effects/bubbles.ogg' + playsound(src.loc, "[active_sound]", 100, 0, 4) + M << "Your Tank now displays [choice]. Drink up and enjoy!" + updateicon() + return 1 diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 7ef49f4b7b..acb3ef890e 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -683,4 +683,34 @@ /obj/item/device/dogborg/sleeper/medical name = "Borg Mounted Sleeper" desc = "A stretchy stomach for a vore enabled medical borg, it can hold crew for healing or as emergency power." - icon_state = "belly-medical" \ No newline at end of file + icon_state = "belly-medical" + +/obj/item/device/dogborg/sleeper/compactor/brewer //Boozehound gut. + name = "Brew Belly" + desc = "A mounted drunk tank unit with fuel processor." + icon_state = "brewer" + injection_chems = list("vodka","beer","gin") //Injected alcohol is 3 times as strong + max_item_count = 1 + +/obj/item/device/dogborg/sleeper/compactor/brewer/inject_chem(mob/user, chem) + if(patient && patient.reagents) + if(chem in injection_chems + "inaprovaline") + if(hound.cell.charge < 200) //This is so borgs don't kill themselves with it. + to_chat(hound, "You don't have enough power to synthesize fluids.") + return + else if(patient.reagents.get_reagent_amount(chem) + 10 >= 50) //Preventing people from accidentally killing themselves by trying to inject too many chemicals! + to_chat(hound, "Your stomach is currently too full of fluids to secrete more fluids of this kind.") + else if(patient.reagents.get_reagent_amount(chem) + 10 <= 50) //No overdoses for you + patient.reagents.add_reagent(chem, inject_amount) + drain(100) //-100 charge per injection + var/units = round(patient.reagents.get_reagent_amount(chem)) + to_chat(hound, "Injecting [units] unit\s of [chemical_reagents_list[chem]] into occupant.") //If they were immersed, the reagents wouldn't leave with them. + +// PLACEHOLDER SERVICE BORG BELLY +/obj/item/device/dogborg/sleeper/servborg + name = "Gourmet Gut" + desc = "An underslung microwave, with optional fuel processor." + icon_state = "decompiler" + max_item_count = 10 + injection_chems = null + diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm index b1467ed101..75ca4e499c 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm @@ -43,6 +43,8 @@ robot_modules["Janihound"] = /obj/item/weapon/robot_module/robot/scrubpup robot_modules["Sci-borg"] = /obj/item/weapon/robot_module/robot/science robot_modules["Pupdozer"] = /obj/item/weapon/robot_module/robot/engiedog + robot_modules["BoozeHound"] = /obj/item/weapon/robot_module/robot/booze + robot_modules["Service-borg"] = /obj/item/weapon/robot_module/robot/servborg robot_modules["Vore Services"] = /obj/item/weapon/robot_module/robot/servore//edit chompers robot_modules["Medivore"] = /obj/item/weapon/robot_module/robot/medical/vore return 1 @@ -445,6 +447,105 @@ R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill ..() +/obj/item/weapon/robot_module/robot/booze + name = "BoozeHound robot module" + channels = list("Service" = 1) + languages = list( + LANGUAGE_SOL_COMMON = 1, + LANGUAGE_UNATHI = 1, + LANGUAGE_SIIK = 1, + LANGUAGE_AKHANI = 1, + LANGUAGE_SKRELLIAN = 1, + LANGUAGE_SKRELLIANFAR = 0, + LANGUAGE_ROOTLOCAL = 0, + LANGUAGE_TRADEBAND = 1, + LANGUAGE_GUTTER = 0, + LANGUAGE_SCHECHI = 1, + LANGUAGE_EAL = 1, + LANGUAGE_TERMINUS = 1, + LANGUAGE_SIGN = 0 + ) + +/obj/item/weapon/robot_module/robot/booze + sprites = list( + "Beer Buddy" = "boozeborg", + "Brilliant Blue" = "boozeborg(blue)", + "Caffine Dispenser" = "boozeborg(coffee)", + "Gamer Juice Maker" = "boozeborg(green)", + "Liqour Licker" = "boozeborg(orange)", + "The Grapist" = "boozeborg(purple)", + "Vampire's Aid" = "boozeborg(red)", + "Vodka Komrade" = "boozeborg(vodka)" + ) +/obj/item/weapon/robot_module/robot/booze/New(var/mob/living/silicon/robot/R) + src.modules += new /obj/item/weapon/gripper/service(src) + //src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src) + //src.modules += new /obj/item/weapon/material/minihoe(src) + //src.modules += new /obj/item/device/analyzer/plant_analyzer(src) + //src.modules += new /obj/item/weapon/storage/bag/plants(src) + //src.modules += new /obj/item/weapon/robot_harvester(src) + src.modules += new /obj/item/weapon/material/knife(src) + src.modules += new /obj/item/weapon/material/kitchen/rollingpin(src) + src.modules += new /obj/item/device/multitool(src) //to freeze trays + src.modules += new /obj/item/weapon/dogborg/jaws/small(src) + src.modules += new /obj/item/device/dogborg/boop_module(src) + src.modules += new /obj/item/device/dogborg/sleeper/compactor/brewer(src) + src.modules += new /obj/item/weapon/reagent_containers/glass/beaker(src)//For holding the ALCOHOL + src.emag = new /obj/item/weapon/dogborg/pounce(src) + R.verbs += /mob/living/silicon/robot/proc/reskin_booze + + var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) + M.stored_matter = 30 + src.modules += M + + src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src) + + var/obj/item/weapon/flame/lighter/zippo/L = new /obj/item/weapon/flame/lighter/zippo(src) + L.lit = 1 + src.modules += L + + var/datum/matter_synth/water = new /datum/matter_synth() + water.name = "Water reserves" + water.recharge_rate = 0.1 // Recharging water for plants - hehe drooly borg + water.max_energy = 1000 + water.energy = 0 + R.water_res = water + synths += water + + var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src) + T.water = water + src.modules += T + + + src.modules += new /obj/item/weapon/tray/robotray(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/service/booze(src) + src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src) + + var/datum/reagents/N = new/datum/reagents(50) + src.emag.reagents = N + N.my_atom = src.emag + N.add_reagent("beer2", 50) + src.emag.name = "Mickey Finn's Special Brew" + + R.can_buckle = 1 + R.icon = 'icons/mob/widerobot_colors_vr.dmi' + R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' + R.ui_style_vr = TRUE + R.pixel_x = -16 + R.old_x = -16 + R.default_pixel_x = -16 + R.dogborg = TRUE + R.wideborg = TRUE + R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill + ..() + +/obj/item/weapon/robot_module/robot/booze/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules + E.reagents.add_reagent("enzyme", 2 * amount) + if(src.emag) + var/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer/B = src.emag + B.reagents.add_reagent("beer2", 2 * amount) + /obj/item/weapon/robot_module/robot/engiedog name = "Construction Hound module" can_buckle = 1 @@ -569,6 +670,83 @@ R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill ..() +// SKYVAAL ADDED SERVICE BORG CODE +/obj/item/weapon/robot_module/robot/servborg + name = "Service Hound Module" + can_buckle = 1 + sprites = list( + "Chef-borg" = "servborg", + "Booze-borg" = "boozeborg" + ) + channels = list("Service" = 1) + can_be_pushed = 0 + +/obj/item/weapon/robot_module/robot/servborg/New(var/mob/living/silicon/robot/R) + + var/datum/matter_synth/water = new /datum/matter_synth() + water.name = "Water reserves" + water.recharge_rate = 0.1 // Recharging water for plants - hehe drooly borg + water.max_energy = 1000 + water.energy = 0 + R.water_res = water + synths += water + + // Dogborg Standard + src.modules += new /obj/item/weapon/dogborg/jaws/small(src) + src.modules += new /obj/item/device/dogborg/boop_module(src) + + var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src) + T.water = water + src.modules += T + + // PLACEHOLDER AS 'BRIGBELLY' UNTIL MICROWAVE BELLY SORTED + var/obj/item/device/dogborg/sleeper/servborg/B = new /obj/item/device/dogborg/sleeper/servborg(src) + B.water = water + src.modules += B + + //Service Module Copy/Paste + src.modules += new /obj/item/weapon/gripper/service(src) + src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src) + src.modules += new /obj/item/weapon/material/minihoe(src) + src.modules += new /obj/item/weapon/material/knife/machete/hatchet(src) + src.modules += new /obj/item/device/analyzer/plant_analyzer(src) + src.modules += new /obj/item/weapon/storage/bag/plants(src) + src.modules += new /obj/item/weapon/robot_harvester(src) + src.modules += new /obj/item/weapon/material/knife(src) + src.modules += new /obj/item/weapon/material/kitchen/rollingpin(src) + src.modules += new /obj/item/device/multitool(src) //to freeze trays + + var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) + M.stored_matter = 30 + src.modules += M + + src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src) + + var/obj/item/weapon/flame/lighter/zippo/L = new /obj/item/weapon/flame/lighter/zippo(src) + L.lit = 1 + src.modules += L + + src.modules += new /obj/item/weapon/tray/robotray(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src) + src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src) + + var/datum/reagents/F = new/datum/reagents(50) + src.emag.reagents = F + F.my_atom = src.emag + F.add_reagent("beer2", 50) + src.emag.name = "Mickey Finn's Special Brew" + + R.icon = 'icons/mob/widerobot_vr.dmi' + R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' + R.ui_style_vr = TRUE + R.pixel_x = -16 + R.old_x = -16 + R.default_pixel_x = -16 + R.dogborg = TRUE + R.wideborg = TRUE + R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill + ..() + /obj/item/weapon/robot_module/Reset(var/mob/living/silicon/robot/R) R.pixel_x = initial(pixel_x) R.pixel_y = initial(pixel_y) diff --git a/code/modules/mob/living/simple_animal/aliens/zerg.dm b/code/modules/mob/living/simple_animal/aliens/zerg.dm index 4799b338f9..697f699230 100644 --- a/code/modules/mob/living/simple_animal/aliens/zerg.dm +++ b/code/modules/mob/living/simple_animal/aliens/zerg.dm @@ -23,28 +23,12 @@ var/zerg_types = list("Zerg Drone" = /mob/living/simple_animal/hostile/hivebot/zerg/worker,) + isSynthetic() + return FALSE -/mob/living/simple_animal/hostile/hivebot/zerg/isSynthetic() - return FALSE - -/mob/living/simple_animal/hostile/hivebot/zerg/larva/proc/evolve() - //TODDO MAke this work nicely - set name = "EVOLVE" - set desc = "Performs larva evolution." - set category = "Abilities" - var/location = get_turf(src) - chosentype = input(usr,"What type would you like to be?") as null|anything in zerg_types - if(!chosentype) return - if(!src.ckey) - death() - qdel(src) - new /mob/living/simple_animal/hostile/hivebot/zerg/worker(location) - else - var/myuser = src.key - death() - qdel(src) - var/mob/living/simple_animal/hostile/newmob = new chosentype(location) - newmob.ckey = myuser +///////////////////////////////////////////////////////////////// +///////////////////// LARVA "CORE" ////////////////////////////// +///////////////////////////////////////////////////////////////// /mob/living/simple_animal/hostile/hivebot/zerg/larva name = "zerg larva" @@ -54,17 +38,45 @@ maxHealth = 0.2 LASERS_TO_KILL health = 0.2 LASERS_TO_KILL var/chosentype = null -/mob/living/simple_animal/hostile/hivebot/zerg/larva/Life() - ..() - -/mob/living/simple_animal/hostile/hivebot/zerg/larva/New() - ..() - verbs |= /mob/living/simple_animal/hostile/hivebot/zerg/larva/proc/evolve -/mob/living/simple_animal/hostile/hivebot/zerg/larva/initialize() - spawn(1200) - if(!src.ckey) - evolve() + Life() + ..() + + New() + ..() + verbs |= /mob/living/simple_animal/hostile/hivebot/zerg/larva/proc/evolve + + initialize() + ..() + spawn(1200) + if(!src.client) + evolve() + +///////////////////////////////////////////////////////////////// +///////////////////// EVOLUTION ///////////////////////////////// +///////////////////////////////////////////////////////////////// +/mob/living/simple_animal/hostile/hivebot/zerg/larva/proc/evolve() + //TODDO MAke this work nicely + set name = "EVOLVE" + set desc = "Performs larva evolution." + set category = "Abilities" + var/location = get_turf(src) + chosentype = input(usr,"What type would you like to be?") as null|anything in zerg_types + if(!chosentype && src.ckey) return + if(!src.client) + qdel(src) + new /mob/living/simple_animal/hostile/hivebot/zerg/worker(location) + else + + var/myuser = src.key + var/mob/living/simple_animal/hostile/newmob = chosentype + death() + qdel(src) + newmob.ckey = myuser + new newmob(location) +///////////////////////////////////////////////////////////////// +///////////////////// ZERG TYPES //////////////////////////////// +///////////////////////////////////////////////////////////////// /mob/living/simple_animal/hostile/hivebot/zerg/worker name = "Zerg Drone" desc = "Drones are fundamental to economic and tech development, as they harvest resources and construct buildings." @@ -72,3 +84,17 @@ health = 1 LASERS_TO_KILL melee_damage_lower = 1 melee_damage_upper = 1 + +/mob/living/simple_animal/hostile/hivebot/zerg/broodsack + name = "Zerg Brood" + desc = "Brood sacks are living creatures who's sole purpose it is to incubate larva." + maxHealth = 1 + health = 1 + melee_damage_lower = 0 + melee_damage_upper = 0 + Life() + sleep(3000) + new /mob/living/simple_animal/hostile/hivebot/zerg/larva(src.loc) + new /mob/living/simple_animal/hostile/hivebot/zerg/larva(src.loc) + new /mob/living/simple_animal/hostile/hivebot/zerg/larva(src.loc) + diff --git a/code/modules/mob/living/simple_animal/animals/bat.dm b/code/modules/mob/living/simple_animal/animals/bat.dm index 905853ab25..c91f52bce4 100644 --- a/code/modules/mob/living/simple_animal/animals/bat.dm +++ b/code/modules/mob/living/simple_animal/animals/bat.dm @@ -16,9 +16,9 @@ turns_per_move = 3 speed = 4 - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "hits" harm_intent_damage = 10 diff --git a/code/modules/mob/living/simple_animal/animals/carp.dm b/code/modules/mob/living/simple_animal/animals/carp.dm index 7e7ae92876..261cb521b3 100644 --- a/code/modules/mob/living/simple_animal/animals/carp.dm +++ b/code/modules/mob/living/simple_animal/animals/carp.dm @@ -15,9 +15,9 @@ speed = 4 turns_per_move = 5 - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "hits" harm_intent_damage = 8 melee_damage_lower = 15 diff --git a/code/modules/mob/living/simple_animal/animals/crab.dm b/code/modules/mob/living/simple_animal/animals/crab.dm index ce5230eb75..f32e1e165b 100644 --- a/code/modules/mob/living/simple_animal/animals/crab.dm +++ b/code/modules/mob/living/simple_animal/animals/crab.dm @@ -46,7 +46,7 @@ desc = "It's Coffee, the other pet!" response_help = "pets" response_disarm = "gently pushes aside" - response_harm = "stomps" + response_harm = "stomps on" //Sif Crabs /mob/living/simple_animal/giant_crab @@ -78,18 +78,18 @@ meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat response_help = "pets" response_disarm = "gently pushes aside" - response_harm = "stomps" + response_harm = "kicks" friendly = "pinches" speak_chance = 1 speak_emote = list("clicks") emote_hear = list("clicks") emote_see = list("clacks") - - - + + + //Enemy version. -/mob/living/simple_animal/hostile/giant_crab +/mob/living/simple_animal/hostile/giant_crab name = "giant crab" desc = "A giant enemy crab." tt_desc = "S Cancer holligus" @@ -116,7 +116,7 @@ attack_sharp = 1 attack_edge = 1 - armor = list( + armor = list( "melee" = 40, "bullet" = 10, "laser" = 25, @@ -128,7 +128,7 @@ meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat response_help = "pets" response_disarm = "gently pushes aside" - response_harm = "stomps" + response_harm = "kicks" friendly = "pinches" speak_chance = 1 diff --git a/code/modules/mob/living/simple_animal/animals/deer.dm b/code/modules/mob/living/simple_animal/animals/deer.dm index 4c4e7dd2d3..979873452c 100644 --- a/code/modules/mob/living/simple_animal/animals/deer.dm +++ b/code/modules/mob/living/simple_animal/animals/deer.dm @@ -1,5 +1,5 @@ /mob/living/simple_animal/deer - name = "Deer" + name = "deer" desc = "An animal with impressive antlers and skittish personality, though this one seems domesticated." tt_desc = "Cervus elaphus" icon_state = "Deer" @@ -50,7 +50,7 @@ response_help = "pets" response_disarm = "barely manage to push aside" - response_harm = "nibbles" + response_harm = "hits" attacktext = list("nibbled") speak_chance = 20 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 99d6c2f18f..29134b6edb 100644 --- a/code/modules/mob/living/simple_animal/animals/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/animals/giant_spider.dm @@ -83,6 +83,7 @@ Nurse Family poison_type = "spidertoxin" // VOREStation edit, original is stoxin. (sleep toxins) var/fed = 0 + var/fedsmall = 0 var/atom/cocoon_target var/egg_inject_chance = 5 @@ -518,7 +519,7 @@ Spider Procs else //third, lay an egg cluster there var/obj/effect/spider/eggcluster/E = locate() in get_turf(src) - if(!E && fed > 0) + if(!E && fed > 0 || fedsmall > 0) busy = LAYING_EGGS src.visible_message("\The [src] begins to lay a cluster of eggs.") stop_automated_movement = 1 @@ -526,8 +527,12 @@ Spider Procs if(busy == LAYING_EGGS) E = locate() in get_turf(src) if(!E) - new /obj/effect/spider/eggcluster(loc, src) - fed-- + if(fed >= 1) + new /obj/effect/spider/eggcluster(loc, src) + fed-- + if(fedsmall >= 1) + new /obj/effect/spider/eggcluster/small(loc, src) + fedsmall-- busy = 0 stop_automated_movement = 0 else @@ -562,7 +567,10 @@ Spider Procs if(istype(M, /mob/living/simple_animal/hostile/giant_spider)) continue large_cocoon = 1 - fed++ + if(istiny(cocoon_target)) + fedsmall++ + if(!istiny(cocoon_target)) + fed++ src.visible_message("\The [src] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out.") M.forceMove(C) C.pixel_x = M.pixel_x diff --git a/code/modules/mob/living/simple_animal/animals/goose.dm b/code/modules/mob/living/simple_animal/animals/goose.dm index f05baf7acf..bfe2b1eb9b 100644 --- a/code/modules/mob/living/simple_animal/animals/goose.dm +++ b/code/modules/mob/living/simple_animal/animals/goose.dm @@ -15,9 +15,9 @@ turns_per_move = 5 - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "hits" harm_intent_damage = 5 melee_damage_lower = 5 //they're meant to be annoying, not threatening. diff --git a/code/modules/mob/living/simple_animal/animals/lizard.dm b/code/modules/mob/living/simple_animal/animals/lizard.dm index 79b57578fa..5a117b6c88 100644 --- a/code/modules/mob/living/simple_animal/animals/lizard.dm +++ b/code/modules/mob/living/simple_animal/animals/lizard.dm @@ -1,5 +1,5 @@ /mob/living/simple_animal/lizard - name = "Lizard" + name = "lizard" desc = "A cute tiny lizard." faction = "lizard" tt_desc = "E Anolis cuvieri" @@ -25,11 +25,11 @@ speak_emote = list("hisses") var/amount_grown = 0 - - + + /mob/living/simple_animal/lizard/event desc = "This one looks like it is growing huge!" - + /mob/living/simple_animal/lizard/event/Life() . = ..() if(amount_grown >= 0) @@ -43,7 +43,7 @@ if(prob(99.999)) new /mob/living/simple_animal/hostile/lizardman(get_turf(src)) qdel(src) - else + else new /mob/living/simple_animal/hostile/deathclaw(get_turf(src)) qdel(src) - + diff --git a/code/modules/mob/living/simple_animal/animals/raccoon.dm b/code/modules/mob/living/simple_animal/animals/raccoon.dm new file mode 100644 index 0000000000..004acbe88c --- /dev/null +++ b/code/modules/mob/living/simple_animal/animals/raccoon.dm @@ -0,0 +1,63 @@ +//raccoon +/mob/living/simple_animal/raccoon + name = "raccoon" + desc = "A raccoon, also known as a trash panda." + tt_desc = "E purgamentum raccoonus" + intelligence_level = SA_ANIMAL + icon = 'icons/mob/animal_vr.dmi' + icon_state = "raccoon" + item_state = "raccoon" + icon_living = "raccoon" + icon_dead = "raccoon_dead" + + investigates = 1 + specific_targets = 1 //Only targets with Found() + run_at_them = 0 //DOMESTICATED + view_range = 5 + + turns_per_move = 5 + see_in_dark = 6 + + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "kicks" + + min_oxy = 16 //Require atleast 16kPA oxygen + minbodytemp = 223 //Below -50 Degrees Celcius + maxbodytemp = 323 //Above 50 Degrees Celcius + + + speak_chance = 1 + speak = list("HSSSSS") + speak_emote = list("purrs") + emote_see = list("shakes their head", "shivers","grooms self", "nibbles on some trash") + say_maybe_target = list("Hss?") + say_got_target = list("HSSSS!","REEER!") + + meat_amount = 1 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + + var/turns_since_scan = 0 + var/mob/flee_target + +/mob/living/simple_animal/raccoon/proc/handle_flee_target() + //see if we should stop fleeing + if (flee_target && !(flee_target in ListTargets(view_range))) + flee_target = null + GiveUpMoving() + + if (flee_target && !stat && !buckled) + if (resting) + lay_down() + if(prob(25)) say("HSSSSS") + stop_automated_movement = 1 + walk_away(src, flee_target, 7, 2) + +/mob/living/simple_animal/raccoon/react_to_attack(var/atom/A) + if(A == src) return + flee_target = A + turns_since_scan = 5 + +/mob/living/simple_animal/raccoon/ex_act() + . = ..() + react_to_attack(src.loc) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/animals/sculpture.dm b/code/modules/mob/living/simple_animal/animals/sculpture.dm index be0057f501..716e1a3a68 100644 --- a/code/modules/mob/living/simple_animal/animals/sculpture.dm +++ b/code/modules/mob/living/simple_animal/animals/sculpture.dm @@ -9,9 +9,9 @@ icon_dead = "sculpture" emote_hear = list("makes a faint scraping sound") emote_see = list("twitches slightly", "shivers") - response_help = "touches the" - response_disarm = "pushes the" - response_harm = "hits the" + response_help = "touches" + response_disarm = "pushes" + response_harm = "hits" see_in_dark = 8 //Needs to see in darkness to snap in darkness pass_flags = PASSTABLE var/response_snap = "snapped the neck of" //Past tense because it "happened before you could see it" diff --git a/code/modules/mob/living/simple_animal/animals/synx.dm b/code/modules/mob/living/simple_animal/animals/synx.dm index 2054acb7cf..0c88de9581 100644 --- a/code/modules/mob/living/simple_animal/animals/synx.dm +++ b/code/modules/mob/living/simple_animal/animals/synx.dm @@ -20,6 +20,7 @@ var/transformed = FALSE var/memorysize = 50 //Var for how many messages synxes remember if they know speechcode var/list/voices = list() + var/forcefeedchance = 20 faction = "Synx" intelligence_level = SA_ANIMAL @@ -40,8 +41,8 @@ "rad" = 100) has_hands = 1 - response_help = "pets" - response_disarm = "gently pushes aside" + response_help = "pets the" + response_disarm = "gently pushes aside the" pass_flags = PASSTABLE @@ -182,7 +183,7 @@ mob/living/simple_animal/synx/PunchTarget() metabolism = REM * 1 //ten times faster for convenience of testers. color = "#00FFFF" overdose = REAGENTS_OVERDOSE * 20 //it's all fake. But having nanomachines move through you is not good at a certain amount. - + /datum/reagent/inaprovaline/synxchem/holo/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) if(prob(5)) @@ -230,8 +231,8 @@ mob/living/simple_animal/synx/PunchTarget() M.adjustHalLoss(1) //dealing 5 times the amount of brute healed as halo, but we cant feel pain yet // ^ I have no idea what this might cause, my ideal plan is that once the pain killer wears off you suddenly collapse; //Since Halloss is not "real" damage this should not cause death - - + + /datum/reagent/inaprovaline/synxchem/overdose(var/mob/living/carbon/M, var/alien, var/removed) ..() if(alien != IS_DIONA) @@ -242,7 +243,7 @@ mob/living/simple_animal/synx/PunchTarget() M.AdjustStunned(1) if(prob(2)) M.AdjustParalysis(1) - + /datum/reagent/inaprovaline/synxchem/holo/overdose(var/mob/living/carbon/M, var/alien, var/removed) return @@ -257,7 +258,7 @@ mob/living/simple_animal/synx/PunchTarget() if(.) // If we succeeded in hitting. if(isliving(A)) var/mob/living/L = A - if(prob(20))//Forcefeeding code + if(prob(forcefeedchance))//Forcefeeding code L.Weaken(5) stop_automated_movement = 1 src.feed_self_to_grabbed(src,L) @@ -274,6 +275,7 @@ mob/living/simple_animal/synx/PunchTarget() /mob/living/simple_animal/retaliate/synx/hear_say(message,verb,language,fakename,isItalics,var/mob/living/speaker) . = ..() if(!message) return + if (speaker == src) return speaker = speaker.GetVoice() speak += message voices += speaker @@ -298,7 +300,7 @@ mob/living/simple_animal/synx/PunchTarget() /mob/living/simple_animal/retaliate/synx/handle_idle_speaking() if(voices && prob(speak_chance/2)) randomspeech() - + ////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////// POWERS!!!! ///////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// @@ -349,7 +351,7 @@ mob/living/simple_animal/synx/PunchTarget() set category = "Abilities" if(speak && voices) handle_mimic() - else + else usr << "YOU NEED TO HEAR THINGS FIRST, try using Ventcrawl to eevesdrop on nerds" /mob/living/simple_animal/retaliate/synx/proc/handle_mimic() @@ -370,14 +372,14 @@ mob/living/simple_animal/synx/PunchTarget() glow_range = 4 glow_toggle = 1 player_msg = "You aren't supposed to be in this. Wrong mob." - + /mob/living/simple_animal/retaliate/synx/pet/init_vore() ..() var/obj/belly/B = vore_selected B.vore_verb = "swallow" B.digest_burn = 1 B.digest_brute = 0 - + /mob/living/simple_animal/retaliate/synx/pet/holo/init_vore() ..() var/obj/belly/B = vore_selected @@ -408,7 +410,7 @@ mob/living/simple_animal/synx/PunchTarget() var/location = get_turf(src) new /obj/item/seeds/hardlightseed/typesx(location) qdel(src) - + /mob/living/simple_animal/retaliate/synx/pet/holo/gib() visible_message("\The [src] fades away!") var/location = get_turf(src) @@ -469,7 +471,7 @@ mob/living/simple_animal/synx/PunchTarget() icon_state = "synx_diablo_living" icon_living = "synx_diablo_living" icon_dead = "synx_diablo_dead" - speak = list( ) + speak = list( ) //Vore Section vore_capacity = 2 @@ -479,7 +481,7 @@ mob/living/simple_animal/synx/PunchTarget() icon_state = "synx_diablo_living" icon_living = "synx_diablo_living" icon_dead = "synx_diablo_dead" - speak = list( ) + speak = list( ) //Vore Section vore_capacity = 2 @@ -502,7 +504,7 @@ mob/living/simple_animal/synx/PunchTarget() //Vore Section vore_default_mode = DM_HEAL vore_capacity = 10 - vore_digest_chance = 0 + vore_digest_chance = 0 vore_pounce_chance = 1 //MAKE THEM HONK vore_bump_chance = 0 //lowered bump chance vore_escape_chance = 100 @@ -549,3 +551,80 @@ mob/living/simple_animal/synx/PunchTarget() else return pick(prob(50);/mob/living/simple_animal/retaliate/synx/pet/greed, prob(50);/mob/living/simple_animal/retaliate/synx/pet/diablo, prob(50);/mob/living/simple_animal/retaliate/synx/pet/holo,) + +//////////////////////////////////////////////////////////////////////////// +//////////////////////////NOT A SYNX///////but looks kinda like one///////// +//////////////////////////////////////////////////////////////////////////// +//So we got base synxes pretty much done, how about some special variants +/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers + name = "Synx?" + desc = "A cold blooded, genderless, parasitic eel? Is it crying?" + tt_desc = "Synxus?" + forcefeedchance = 99 //You have a stomach? yeah they go in. + poison_per_bite = 0 //no poison + + hostile = 1 + + faction = "synx?" + melee_damage_lower = 1 + melee_damage_upper = 1 + environment_smash = 1 + destroy_surroundings = 1 + +/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers/New() + ..() + faction = rand(1,5) + switch(faction) + if(1 , 2) + voices |= "Unidentifiable Weeping" + name = "Weeper" + melee_damage_upper = 4 + if(3) + voices |= "Radio Static" + name = "Whistler" + melee_damage_upper = 20 + if(4 , 5) + voices |= "Unidentifiable Wailing" + name= "Wailer" + melee_damage_upper = 10 + speak |= "No one" + + voices -= "Garbled voice" + voices -= "Unidentifiable Voice" + speak -= "Who is there?" + speak -= "What is that thing?!" + +/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers/MoveToTarget() + var/mob/living/speaker + if(target_mob) + speaker = target_mob + speak |= speaker.GetVoice() + ..() + +/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers/Life() + ..() + if(prob(1) && faction <= 5) + handlemutations(rand(1,5)) + +/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers/proc/handlemutations(faction) + switch(faction) + if(1 , 2 , 11 , 12) + voices = "Unidentifiable Weeping" + name = "Weeper" + melee_damage_upper = 4 + if(3 , 13) + voices = "Radio Static" + name = "Whistler" + melee_damage_upper = 20 + if(4 , 5 , 14 , 15) + voices = "Unidentifiable Wailing" + name= "Wailer" + melee_damage_upper = 10 + if(6 to 10 , 16 to 20) + voices = "Breathing" + name= "Silent" + else return + +//WEEPING END + + diff --git a/code/modules/mob/living/simple_animal/animals/tomato.dm b/code/modules/mob/living/simple_animal/animals/tomato.dm index 59da8d5bb3..dbbcc14d83 100644 --- a/code/modules/mob/living/simple_animal/animals/tomato.dm +++ b/code/modules/mob/living/simple_animal/animals/tomato.dm @@ -1,215 +1,226 @@ -/mob/living/simple_animal/hostile/tomato - name = "tomato" - desc = "It's a horrifyingly enormous beef tomato, and it's packing extra beef!" - tt_desc = "X Solanum abominable" - icon_state = "tomato" - icon_living = "tomato" - icon_dead = "tomato_dead" - intelligence_level = SA_PLANT - - faction = "plants" - maxHealth = 15 - health = 15 - turns_per_move = 5 - - response_help = "prods" - response_disarm = "pushes aside" - response_harm = "smacks" - - harm_intent_damage = 5 - melee_damage_upper = 15 - melee_damage_lower = 10 - attacktext = list("mauled") - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat - -//CHOMPEDIT PIRANHA PLANT. -//When I stop being lazy I'll give this its own file -shark -//Yes I'm basing this shit on the tomato, sue me. -shark -//No longer based on tomato because evolved too far -shark -/mob/living/simple_animal/hostile/piranhaplant - name = "Piranha Plant" - desc = "It's a plant, that eats people!" - tt_desc = "Packun Flower" - - faction = "plants" - intelligence_level = SA_PLANT - - maxHealth = 50 - health = 50 - meat_type = null - - //Mob icon/appearance settings - icon = 'icons/mob/plantmobs32x32.dmi' //Thanks to vorebound mod and Estelle - icon_living = "piranha-plant" - icon_state = "piranha-plant" - icon_dead = "piranha-plant_dead" - icon_gib = "generic_gib" // The iconstate for being gibbed, optional. Defaults to a generic gib animation. - //icon_rest = null // The iconstate for resting, optional - attack_icon = 'icons/effects/effects.dmi' //Just the default, played like the weapon attack anim - attack_icon_state = "slash" //Just the default //gonna have to make teeth chomping version - - //Vore stuff - vore_active = 1 - vore_capacity = 1 - vore_pounce_chance = 10 - vore_standing_too = 1 - vore_ignores_undigestable = 0 - vore_default_mode = DM_DIGEST - vore_digest_chance = 99 - vore_absorb_chance = 0 - vore_escape_chance = 5 - vore_icons = SA_ICON_LIVING - swallowTime = 10 SECONDS //CHOMPED - - //Movement Stuff - wander = 0 // Does the mob wander around when idle? - wander_distance = 0 // How far the mob will wander before going home (assuming they are allowed to do that) - returns_home = 1 // Mob knows how to return to wherever it started - turns_per_move = 4 // How many life() cycles to wait between each wander mov? - stop_when_pulled = 0 // When set to 1 this stops the animal from moving when someone is pulling it. - follow_dist = 0 // Distance the mob tries to follow a friend - speed = 4 // Higher speed is slower, negative speed is faster. - - //Talk/Emote stuff - speak_chance = 0 // Probability that I talk (this is 'X in 200' chance since even 1/100 is pretty noisy) - reacts = 1 // Reacts to some things being said - speak = list() // Things I might say if I talk - emote_hear = list("chomps","snaps at the air") // Hearable emotes I might perform - emote_see = list() // Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps - say_understood = list() // List of things to say when accepting an order - say_cannot = list() // List of things to say when they cannot comply - say_maybe_target = list() // List of things to say when they spot something barely - say_got_target = list() // List of things to say when they engage a target - reactions = list("chomp" = "!chomps",) // List of "string" = "reaction" and things they hear will be searched for string. - - //Hostility war bloodshed, RAWR - hostile = 1 // Do I even attack? - view_range = 2 // Scan for targets in this range. - investigates = 1 // Do I investigate if I saw someone briefly? - cooperative = 1 // Do I ask allies to help me? - assist_distance = 2 // Radius in which I'll ask my comrades for help. - grab_resist = 100 // Chance of me resisting a grab attempt. - taser_kill = 1 // Is the mob weak to tasers - - //Melee behaviour - melee_damage_lower = 1 // Lower bound of randomized melee damage - melee_damage_upper = 25 // Upper bound of randomized melee damage - attacktext = list("chomped","bit","hompfed","crunched","cronched") // "You are [attacktext] by the mob!" - friendly = list("nuzzles") // "The mob [friendly] the person." - //attack_sound = null // Sound to play when I attack - environment_smash = 0 // How much environment damage do I do when I hit stuff? - melee_miss_chance = 1 // percent chance to miss a melee attack. - melee_attack_minDelay = 5 // How long between attacks at least - melee_attack_maxDelay = 20 // How long between attacks at most - attack_armor_type = "bio" // What armor does this check? - attack_armor_pen = 50 // How much armor pen this attack has. - attack_sharp = 1 // Is the attack sharp? - attack_edge = 0 // Does the attack have an edge? - - //Stuff for people wanting to be a fucking plant. Weirdos - show_stat_health = 1 // Does the percentage health show in the stat panel for the mob - ai_inactive = 0 // Set to 1 to turn off most AI actions - has_hands = 1 // Set to 1 to enable the use of hands and the hands hud - humanoid_hands = 1 // Can a player in this mob use things like guns or AI cards? - //hand_form = "hands" // Used in IsHumanoidToolUser. 'Your X are not fit-'. - //hud_gears // Slots to show on the hud (typically none) - //ui_icons // Icon file path to use for the HUD, otherwise generic icons are used - //r_hand_sprite = "piranha_r" // If they have hands, //TODO make a leaf sprite for this - //l_hand_sprite = "piranha_l" // they could use some icons. - player_msg = "PLANT GO CHOMP" // Message to print to players about 'how' to play this mob on login. - -//Ranged variation -/mob/living/simple_animal/hostile/piranhaplant/spitter - //might snatch the code for that uranium ray for this since it should poison - name = "Piranha Spitter" - attack_armor_pen = 0 - //Attack ranged settings. - ranged = 1 // Do I attack at range? - shoot_range = 6 // How far away do I start shooting from? - view_range = 5 //More range, more hurt, more... plant? - rapid = 1 // Three-round-burst fire mode - firing_lines = 0 // Avoids shooting allies - projectiletype = /obj/item/projectile/energy/piranhaspit // The projectiles I shoot - projectilesound = 'sound/weapons/thudswoosh.ogg' // The sound I make when I do it - casingtype = /obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha // What to make the hugely laggy casings pile out of - -//Piranha unique projectile -/obj/item/projectile/energy/piranhaspit - name = "piranhaspit" - icon_state = "neurotoxin" - damage = 4 //Reduced damage to 4 from 10, 3 fired projectiles mean might do 12 total if all 3 hit - damage_type = TOX - check_armour = "bio" //yup biohazard protection works here - flash_strength = 0 - agony = 10 - combustion = FALSE - -/obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha - name = "Soylent" - desc = "This was spat out by a strange plant that eats people." - icon_state = "soylent_green" - filling_color = "#B8E6B5" - center_of_mass = list("x"=15, "y"=11) - -/obj/item/projectile/energy/piranhaspit/on_hit(var/atom/soyled) - soyl(soyled) - ..() - -/obj/item/projectile/energy/piranhaspit/proc/soyl(var/mob/M) - var/location = get_turf(M) - new /obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha(location) - -//VORE FLUFF section and extended gut settings -/mob/living/simple_animal/hostile/piranhaplant/init_vore() - ..() - var/obj/belly/B = vore_selected - B.vore_verb = "chomp up" - B.name = "stomach" - B.desc = "You're pulled into the tight stomach of the plant. The walls knead weakly around you, coating you in thick, viscous fluids that cling to your body, that soon starts to tingle and burn..." - B.digest_burn = 0 - B.digest_brute = 12 - -/mob/living/simple_animal/hostile/piranhaplant/pitcher - icon_state = "pitcher" - icon_living = "pitcher" - name = "Pitcher Plant" - desc = "It's a plant! How pretty" - tt_desc = "Brig Flower" - health = 50 - maxHealth = 50 //starts with 50 - var/antispam = 0 - -/mob/living/simple_animal/hostile/piranhaplant/pitcher/death() - ..() - new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location) - new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location) - new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location) - new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location) - qdel(src) - -/mob/living/simple_animal/hostile/piranhaplant/pitcher/Life() - ..() - if(!anchored) - anchored=1 - if(maxHealth <= 499) //Ok maybe there are limits - maxHealth = health //Limits are merely a suggestion - if(vore_fullness && !antispam) - antispam = 1 - spawn(10) - if(maxHealth <= 499) - maxHealth += 1 - health += 1 - antispam = !antispam - - if(size_multiplier!=1*health/100) - size_multiplier=1*health/100 - update_icons() - -/mob/living/simple_animal/hostile/piranhaplant/pitcher/init_vore() - ..() - var/obj/belly/B = vore_selected - B.digest_burn = 0.5 - B.digest_brute = 0 - B.vore_verb = "slurped up" - B.name = "pitcher" +/mob/living/simple_animal/hostile/tomato + name = "tomato" + desc = "It's a horrifyingly enormous beef tomato, and it's packing extra beef!" + tt_desc = "X Solanum abominable" + icon_state = "tomato" + icon_living = "tomato" + icon_dead = "tomato_dead" + intelligence_level = SA_PLANT + + faction = "plants" + maxHealth = 15 + health = 15 + turns_per_move = 5 + + response_help = "prods" + response_disarm = "pushes aside" + response_harm = "smacks" + + harm_intent_damage = 5 + melee_damage_upper = 15 + melee_damage_lower = 10 + attacktext = list("mauled") + + meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat + +//CHOMPEDIT PIRANHA PLANT. +//When I stop being lazy I'll give this its own file -shark +//Yes I'm basing this shit on the tomato, sue me. -shark +//No longer based on tomato because evolved too far -shark +/mob/living/simple_animal/hostile/piranhaplant + name = "Piranha Plant" + desc = "It's a plant, that eats people!" + tt_desc = "Packun Flower" + + faction = "plants" + intelligence_level = SA_PLANT + + maxHealth = 50 + health = 50 + meat_type = null + + //Mob icon/appearance settings + icon = 'icons/mob/plantmobs32x32.dmi' //Thanks to vorebound mod and Estelle + icon_living = "piranha-plant" + icon_state = "piranha-plant" + icon_dead = "piranha-plant_dead" + icon_gib = "generic_gib" // The iconstate for being gibbed, optional. Defaults to a generic gib animation. + //icon_rest = null // The iconstate for resting, optional + attack_icon = 'icons/effects/effects.dmi' //Just the default, played like the weapon attack anim + attack_icon_state = "slash" //Just the default //gonna have to make teeth chomping version + + //Vore stuff + vore_active = 1 + vore_capacity = 1 + vore_pounce_chance = 10 + vore_standing_too = 1 + vore_ignores_undigestable = 0 + vore_default_mode = DM_DIGEST + vore_digest_chance = 99 + vore_absorb_chance = 0 + vore_escape_chance = 5 + vore_icons = SA_ICON_LIVING + swallowTime = 10 SECONDS //CHOMPED + + //Movement Stuff + wander = 0 // Does the mob wander around when idle? + wander_distance = 0 // How far the mob will wander before going home (assuming they are allowed to do that) + returns_home = 1 // Mob knows how to return to wherever it started + turns_per_move = 4 // How many life() cycles to wait between each wander mov? + stop_when_pulled = 0 // When set to 1 this stops the animal from moving when someone is pulling it. + follow_dist = 0 // Distance the mob tries to follow a friend + speed = 4 // Higher speed is slower, negative speed is faster. + entangle_immunity = 1 //makes mob immune to entangle effect of vines and also wont get stabbed by vines that has thorns + + //Talk/Emote stuff + speak_chance = 0 // Probability that I talk (this is 'X in 200' chance since even 1/100 is pretty noisy) + reacts = 1 // Reacts to some things being said + speak = list() // Things I might say if I talk + emote_hear = list("chomps","snaps at the air") // Hearable emotes I might perform + emote_see = list() // Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps + say_understood = list() // List of things to say when accepting an order + say_cannot = list() // List of things to say when they cannot comply + say_maybe_target = list() // List of things to say when they spot something barely + say_got_target = list() // List of things to say when they engage a target + reactions = list("chomp" = "!chomps",) // List of "string" = "reaction" and things they hear will be searched for string. + + //Hostility war bloodshed, RAWR + hostile = 1 // Do I even attack? + view_range = 2 // Scan for targets in this range. + investigates = 1 // Do I investigate if I saw someone briefly? + cooperative = 1 // Do I ask allies to help me? + assist_distance = 2 // Radius in which I'll ask my comrades for help. + grab_resist = 100 // Chance of me resisting a grab attempt. + taser_kill = 1 // Is the mob weak to tasers + + //Melee behaviour + melee_damage_lower = 1 // Lower bound of randomized melee damage + melee_damage_upper = 25 // Upper bound of randomized melee damage + attacktext = list("chomped","bit","hompfed","crunched","cronched") // "You are [attacktext] by the mob!" + friendly = list("nuzzles") // "The mob [friendly] the person." + //attack_sound = null // Sound to play when I attack + environment_smash = 0 // How much environment damage do I do when I hit stuff? + melee_miss_chance = 1 // percent chance to miss a melee attack. + melee_attack_minDelay = 5 // How long between attacks at least + melee_attack_maxDelay = 20 // How long between attacks at most + attack_armor_type = "bio" // What armor does this check? + attack_armor_pen = 50 // How much armor pen this attack has. + attack_sharp = 1 // Is the attack sharp? + attack_edge = 0 // Does the attack have an edge? + + //Stuff for people wanting to be a fucking plant. Weirdos + show_stat_health = 1 // Does the percentage health show in the stat panel for the mob + ai_inactive = 0 // Set to 1 to turn off most AI actions + has_hands = 1 // Set to 1 to enable the use of hands and the hands hud + humanoid_hands = 1 // Can a player in this mob use things like guns or AI cards? + //hand_form = "hands" // Used in IsHumanoidToolUser. 'Your X are not fit-'. + //hud_gears // Slots to show on the hud (typically none) + //ui_icons // Icon file path to use for the HUD, otherwise generic icons are used + //r_hand_sprite = "piranha_r" // If they have hands, //TODO make a leaf sprite for this + //l_hand_sprite = "piranha_l" // they could use some icons. + player_msg = "PLANT GO CHOMP" // Message to print to players about 'how' to play this mob on login. + +//Ranged variation +/mob/living/simple_animal/hostile/piranhaplant/spitter + //might snatch the code for that uranium ray for this since it should poison + name = "Piranha Spitter" + attack_armor_pen = 0 + //Attack ranged settings. + ranged = 1 // Do I attack at range? + shoot_range = 6 // How far away do I start shooting from? + view_range = 5 //More range, more hurt, more... plant? + rapid = 1 // Three-round-burst fire mode + firing_lines = 0 // Avoids shooting allies + projectiletype = /obj/item/projectile/energy/piranhaspit // The projectiles I shoot + projectilesound = 'sound/weapons/thudswoosh.ogg' // The sound I make when I do it + ranged_ignore_incapitated = 1 //make it so our spitter doesnt stun lock dorks + ranged_cooldown_time = 90 + +//mob/living/simple_animal/hostile/piranhaplant/spitter/proc/Shoot() + //TOX/HALLOSS swap code goes here //TODO + +//Piranha unique projectile +/obj/item/projectile/energy/piranhaspit + name = "piranha spit" + icon_state = "neurotoxin" + damage = 10 + damage_type = HALLOSS + check_armour = "bio" //yup biohazard protection works here + flash_strength = 0 + agony = 10 + combustion = FALSE + +/obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha + name = "Soylent" + desc = "This was spat out by a strange plant that eats people." + icon_state = "soylent_green" + filling_color = "#B8E6B5" + center_of_mass = list("x"=15, "y"=11) + +/obj/item/projectile/energy/piranhaspit/on_hit(var/atom/soyled) + if(prob(5)) + soyl(soyled) + ..() + +/obj/item/projectile/energy/piranhaspit/proc/soyl(var/mob/M) + var/location = get_turf(M) + new /obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha(location) + +//VORE FLUFF section and extended gut settings +/mob/living/simple_animal/hostile/piranhaplant/init_vore() + ..() + var/obj/belly/B = vore_selected + B.vore_verb = "chomp up" + B.name = "stomach" + B.desc = "You're pulled into the tight stomach of the plant. The walls knead weakly around you, coating you in thick, viscous fluids that cling to your body, that soon starts to tingle and burn..." + B.digest_burn = 0 + B.digest_brute = 12 + +/mob/living/simple_animal/hostile/piranhaplant/pitcher + icon_state = "pitcher-plant" + icon_living = "pitcher-plant" + icon_dead = "pitcher-plant_dead" + name = "Pitcher Plant" + desc = "It's a plant! How pretty" + tt_desc = "Brig Flower" + health = 500 + maxHealth = 500 + var/antispam = 0 + swallowTime = 3 SECONDS //If you get to close to a pitcher, its your own fault ;p + +/mob/living/simple_animal/hostile/piranhaplant/pitcher/death() + ..() + new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location) + new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location) + new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location) + new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location) + qdel(src) + +/mob/living/simple_animal/hostile/piranhaplant/pitcher/Life() + ..() + if(!anchored) + anchored=1 + if(vore_fullness && !antispam) + antispam = 1 + spawn(10) + if(bruteloss >= 1) + bruteloss -= 1 + antispam = !antispam + if(prob(3)) + new /obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha(src.loc) + + if(size_multiplier!=1*health/100 && health >= 50 && health <= 300) + size_multiplier=1*health/100 + update_icons() + +/mob/living/simple_animal/hostile/piranhaplant/pitcher/New() + ..() + bruteloss = 400 + +/mob/living/simple_animal/hostile/piranhaplant/pitcher/init_vore() + ..() + var/obj/belly/B = vore_selected + B.digest_burn = 0.5 + B.digest_brute = 0 + B.vore_verb = "slurp up" + B.name = "pitcher" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/animals/worm.dm b/code/modules/mob/living/simple_animal/animals/worm.dm index da30dbf8fd..c7f32acbe7 100644 --- a/code/modules/mob/living/simple_animal/animals/worm.dm +++ b/code/modules/mob/living/simple_animal/animals/worm.dm @@ -20,7 +20,7 @@ response_help = "touches" response_disarm = "flails at" - response_harm = "punches the" + response_harm = "punches" harm_intent_damage = 2 diff --git a/code/modules/mob/living/simple_animal/humanoids/clown.dm b/code/modules/mob/living/simple_animal/humanoids/clown.dm index adc9527e19..a95294da8f 100644 --- a/code/modules/mob/living/simple_animal/humanoids/clown.dm +++ b/code/modules/mob/living/simple_animal/humanoids/clown.dm @@ -19,7 +19,7 @@ firing_lines = TRUE investigates = TRUE assist_distance = 100 - + turns_per_move = 5 stop_when_pulled = 0 @@ -85,9 +85,9 @@ icon_gib = "clown_gib" speak_chance = 50 turns_per_move = 5 - response_help = "pokes the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" + response_help = "pokes" + response_disarm = "gently pushes aside" + response_harm = "hits" speak = list("HONK", "Honk!") speak_emote = list("squeals", "cries","sobs") emote_hear = list("honks sadly") @@ -127,15 +127,15 @@ icon_state = "ClownGoblin" icon_living = "ClownGoblin" icon_dead = null - response_help = "honks the" + response_help = "honks" speak = list("Honk!") speak_emote = list("sqeaks") emote_hear = list("honks") maxHealth = 100 health = 100 - + view_range = 30//owo - + speed = 1 turns_per_move = 1 @@ -165,7 +165,7 @@ /mob/living/simple_animal/clowngang name = "Pandoras box" desc = "A honkmotherload of fun" - + /mob/living/simple_animal/clowngang/Life() death() /mob/living/simple_animal/clowngang/death() diff --git a/code/modules/mob/living/simple_animal/humanoids/pirate.dm b/code/modules/mob/living/simple_animal/humanoids/pirate.dm index a02e4382bb..15eee5e18e 100644 --- a/code/modules/mob/living/simple_animal/humanoids/pirate.dm +++ b/code/modules/mob/living/simple_animal/humanoids/pirate.dm @@ -1,5 +1,5 @@ /mob/living/simple_animal/hostile/pirate - name = "Pirate" + name = "pirate" desc = "Does what he wants cause a pirate is free." tt_desc = "E Homo sapiens" icon_state = "piratemelee" diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index c1751ef5ba..f6a0d921ce 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -121,7 +121,8 @@ var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat. var/minimum_distance = 1 //Minimum approach distance, so ranged mobs chase targets down, but still keep their distance set in tiles to the target, set higher to make mobs keep distance var/move_shoot = 0 - + var/ranged_ignore_incapitated = 0 //Ranged mobs will by default keep shooting on unconscious targets, if set to 1 the mob will ignore unconscious victims. + //Mob melee settings var/melee_damage_lower = 2 // Lower bound of randomized melee damage var/melee_damage_upper = 6 // Upper bound of randomized melee damage @@ -1270,19 +1271,24 @@ ai_log("AttackTarget() special",3) if(SpecialAtkTarget()) //Might not succeed/be allowed, do something else. return 1 - + //AAAAH! if(distance <= 1) ai_log("AttackTarget() melee",3) PunchTarget() return 1 - + //Open fire! else if(ranged && (distance <= shoot_range) && ranged_cooldown <= world.time) + if(ishuman(target_mob) && ranged_ignore_incapitated) + var/mob/living/carbon/human/TA = target_mob + if(TA.stat == UNCONSCIOUS) + LoseTarget(TA) + return ai_log("AttackTarget() ranged",3) ShootTarget(target_mob) return 1 - + else ai_log("AttackTarget() out of range!",3) stoplag(1) // Unfortunately this is needed to protect from ClosestDistance() sometimes not updating fast enough to prevent an infinite loop. @@ -1777,5 +1783,5 @@ /mob/living/simple_animal/get_nametag_desc(mob/user) return "[tt_desc]" - - + + diff --git a/code/modules/mob/living/simple_animal/vore/awoo.dm b/code/modules/mob/living/simple_animal/vore/awoo.dm index d71d9ba97b..d984c0d807 100644 --- a/code/modules/mob/living/simple_animal/vore/awoo.dm +++ b/code/modules/mob/living/simple_animal/vore/awoo.dm @@ -18,9 +18,9 @@ returns_home = 1 reacts = 1 - response_help = "pats the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" + response_help = "pats" + response_disarm = "gently pushes aside" + response_harm = "hits" harm_intent_damage = 8 melee_damage_lower = 15 diff --git a/code/modules/mob/living/simple_animal/vore/bee.dm b/code/modules/mob/living/simple_animal/vore/bee.dm index 7026b00ee7..87a0d164cb 100644 --- a/code/modules/mob/living/simple_animal/vore/bee.dm +++ b/code/modules/mob/living/simple_animal/vore/bee.dm @@ -9,9 +9,9 @@ speak = list("Buzzzz") speak_chance = 1 - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "hits" turns_per_move = 5 speed = 5 diff --git a/code/modules/mob/living/simple_animal/vore/corrupt_hounds.dm b/code/modules/mob/living/simple_animal/vore/corrupt_hounds.dm index 46f360c571..537ed08101 100644 --- a/code/modules/mob/living/simple_animal/vore/corrupt_hounds.dm +++ b/code/modules/mob/living/simple_animal/vore/corrupt_hounds.dm @@ -25,9 +25,9 @@ say_maybe_target = list("MEAT?", "N0w YOU DNE FcukED UP b0YO!", "WHAT!", "Not again. NOT AGAIN!") say_got_target = list("D##FIN1Tly DNE FcukED UP nOW b0YO!", "YOU G1T D#V0VRED nOW!", "FUEL ME bOYO!", "I*M SO SORRY?!", "D1E Meat. DIG#ST!", "G1T DVNKED DWN The HaaTCH!", "Not again. NOT AGAIN!") - response_help = "pets the" - response_disarm = "bops the" - response_harm = "hits the" + response_help = "pets" + response_disarm = "bops" + response_harm = "hits" attacktext = list("ravaged") friendly = list("nuzzles", "slobberlicks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on") diff --git a/code/modules/mob/living/simple_animal/vore/dragon.dm b/code/modules/mob/living/simple_animal/vore/dragon.dm index 0e968b00b8..39d803dc73 100644 --- a/code/modules/mob/living/simple_animal/vore/dragon.dm +++ b/code/modules/mob/living/simple_animal/vore/dragon.dm @@ -61,3 +61,70 @@ // maxHealth = 200 // health = 200 // faction = "virgo3b" + + +/mob/living/simple_animal/hostile/dragon/phoron + name = "phoron dragon" + desc = "A big imposing phoron dragon, it looks tough and would likely not go down without a fierce fight." + icon_dead = "phoron_dragon_dead" + icon_living = "phoron_dragon" + icon_state = "phoron_dragon" + maxHealth = 1000 // Super Boss + health = 1000 + var/image/eye_layer = null + +/mob/living/simple_animal/hostile/dragon/phoron/New(var/location, var/atom/parent) + if(!eye_layer) + get_light_and_color(parent) + add_glow() + ..() + +/mob/living/simple_animal/hostile/dragon/phoron/proc/add_glow() + eye_layer = image(icon, "[icon_state]-glow") + eye_layer.plane = PLANE_LIGHTING_ABOVE + + overlays |= eye_layer + +/mob/living/simple_animal/hostile/dragon/phoron/death() + remove_glow() + ..() + +/mob/living/simple_animal/hostile/dragon/phoron/proc/remove_glow() + overlays -= eye_layer + +/mob/living/simple_animal/hostile/dragon/phoron/update_icon() + . = ..() + if(stat >= DEAD) + return + add_glow() + + +/mob/living/simple_animal/hostile/dragon/phoron/init_vore() + ..() + + var/obj/belly/B = vore_selected + B.name = "Belly" + B.desc = "The phoron dragon tackles you to the ground with a mighty roar, swiftly gobbling up your head! You feel the gravity shift as it raises it's head up in pride, bobbing you up and down as it busily swallowed around your form. You start to realise that the warm fluid that you mistook for it's saliva has a strong and somewhat familiar scent, but before you can identify it, your ride is over - with a powerful swallow, the dragon pushes the entirety of your body down into it's stomach, with more of that strange liquid pooling up on the bottom. As you push out in protest against the surrounding walls, you realise that the flesh feels squishy and sponge-like under your digits, coating them in dark, pink substance... A pleased rumble from above tells you that the dragon clearly doesn't seem to mind your futile struggles, clenching its stomach around you possessively!" + + B.emote_lists[DM_HOLD] = list( + "The sway of the dragon's belly sloshes the purple tinted fluid around you, splashing it all over your body.", + "You can feel a small prod from the outside as the dragon accidentally brushes his gut against a wall. The soft flesh cushions it just enough for it to be barely noticeable...", + "You briefly get lost in thoughts as you listen to the noises the dragon's body emits... A slightly muffled snort from above that is enough for you to snap back.", + "A sizeable paw smacks on the side of the dragon's belly, kneading into you through the thick layer of flesh while a low, ominous chuckle can be heard.", + "A low, guttural grumble can be heard all around you as the dragon idly flumps down, bringing its weight down to smoosh you against the bottom of its gut!", + "You can feel a faint, rythmic thumping coming off from the sides of the belly - it doesn't take long to realise that the dragon is drumming on its stuffed gut with its wings.", + "The dragon sways its hips briefly, making its stomach - and by extension, you - sway along, letting out an ammused rumble!", + "You can feel the stomach clench around you, briefly pushing you out towards the dragon's gullet, but before you can gather your wits, it simply swallows you back down with a taunting rumble.", + "You sigh and idly drag your hand over the stomach walls, silently pondering your life choices. It surprises you to feel a large paw tracing your movements from outside!") + + B.emote_lists[DM_DIGEST] = list( + "The sway of the dragon's belly sloshes the purple tinted fluid around you, splashing it all over your body.", + "You can feel a small prod from the outside as the dragon accidentally brushes his gut against a wall. The soft flesh cushions it just enough for it to be barely noticeable...", + "A sizeable paw smacks on the side of the dragon's belly, kneading into you through the thick layer of flesh while a low, ominous chuckle can be heard.", + "A low, guttural grumble can be heard all around you as the dragon idly flumps down, bringing its weight down to smoosh you against the bottom of its gut!", + "You can feel a faint, rythmic thumping coming off from the sides of the belly - it doesn't take long to realise that the dragon is drumming on its stuffed gut with its wings.", + "The dragon sways its hips briefly, making its stomach - and by extension, you - sway along, letting out an ammused rumble!", + "You can feel the stomach clench around you, briefly pushing you out towards the dragon's gullet, but before you can gather your wits, it simply swallows you back down with a taunting rumble.") + + //Didnt put in since it works better as active struggle messages, but not gonna write any at the moment :c + //You struggle to push out against the surrounding flesh, but as soon as you ease up on the pressure, the dragon's gut simply pushes back to hide the bulge. diff --git a/code/modules/mob/living/simple_animal/vore/fennec.dm b/code/modules/mob/living/simple_animal/vore/fennec.dm index 49a3e3161b..0445d4dfef 100644 --- a/code/modules/mob/living/simple_animal/vore/fennec.dm +++ b/code/modules/mob/living/simple_animal/vore/fennec.dm @@ -12,9 +12,9 @@ maxHealth = 30 health = 30 - response_help = "pats the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" + response_help = "pats" + response_disarm = "gently pushes aside" + response_harm = "hits" harm_intent_damage = 5 melee_damage_lower = 5 diff --git a/code/modules/mob/living/simple_animal/vore/lizardman.dm b/code/modules/mob/living/simple_animal/vore/lizardman.dm index 26261fcbce..ed8baa7994 100644 --- a/code/modules/mob/living/simple_animal/vore/lizardman.dm +++ b/code/modules/mob/living/simple_animal/vore/lizardman.dm @@ -24,9 +24,9 @@ speak_emote = list("growls","hisses") say_maybe_target = list("Rawr?") say_got_target = list("GWAR!!") - response_help = "pets the" - response_disarm = "bops the" - response_harm = "hits the" + response_help = "pets" + response_disarm = "bops" + response_harm = "hits" attacktext = list("bit") friendly = list("nuzzles", "licks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on") diff --git a/code/modules/mob/living/simple_animal/vore/metroidsSimple.dm b/code/modules/mob/living/simple_animal/vore/metroidsSimple.dm index 794acf7e76..e42aa0828e 100644 --- a/code/modules/mob/living/simple_animal/vore/metroidsSimple.dm +++ b/code/modules/mob/living/simple_animal/vore/metroidsSimple.dm @@ -19,9 +19,9 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. maxHealth = 25 health = 25 speed = 4 - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "hits" harm_intent_damage = 5 isEdible = 0 //They cannot be eaten while alive. var/canEvolve = 1 //A variable for admins to turn off and on for when they like assign a player as a mob. I want to add a verb so that they can do it on command when the conditions are right in the future. @@ -49,14 +49,14 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. emote_see = list("SKREE's") meat_type = /obj/item/toy/figure/samus - + var/mob/living/victim = null // the person the metroid is currently feeding on var/optimal_combat = FALSE // Used to dumb down the combat AI somewhat. If true, the metroid tends to be really dangerous to fight alone due to stunlocking. var/power_charge = 0 var/evo_point = 0 var/evo_limit = 0 var/next = null - + //Stuff for if a person is playing as a metroid. show_stat_health = 1 // Does the percentage health show in the stat panel for the mob ai_inactive = 0 // Set to 1 to turn off most AI actions @@ -68,10 +68,10 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. //r_hand_sprite = "piranha_r" // If they have hands, //TODO make a leaf sprite for this //l_hand_sprite = "piranha_l" // they could use some icons. player_msg = "SUCC." // Message to print to players about 'how' to play this mob on login. - - - - + + + + /mob/living/simple_animal/hostile/metroid //activate noms vore_active = 1 vore_pounce_chance = 25 @@ -81,8 +81,8 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. /mob/living/simple_animal/hostile/metroid/death() playsound(src, 'sound/effects/metroiddeath.ogg', 50, 1) ..() - - + + /mob/living/simple_animal/hostile/metroid/mine name = "Mochtroid" @@ -125,7 +125,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. melee_damage_lower = 1 melee_damage_upper = 5 melee_miss_chance = 0 - armor = list( + armor = list( "melee" = 50, "bullet" = 30, "laser" = 80, @@ -164,20 +164,20 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. cooperative = 1 evo_point = 800 evo_limit = 1000 - next = "/mob/living/simple_animal/hostile/metroid/evolution/super" + next = "/mob/living/simple_animal/hostile/metroid/evolution/super" vore_active = 0 - + /mob/living/simple_animal/hostile/metroid/evolution/baby/New() playsound(src, 'sound/metroid/metroidsee.ogg', 100, 1) ..() - - - -//------------------------------------------------------------------------------------------------------------ - +//------------------------------------------------------------------------------------------------------------ + + + + /mob/living/simple_animal/hostile/metroid/evolution/super name = "super metroid" desc = "Some kind of head sucky thing!" @@ -193,7 +193,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. melee_damage_lower = 2 melee_damage_upper = 5 melee_miss_chance = 0 - armor = list( + armor = list( "melee" = 50, "bullet" = 30, "laser" = 90, @@ -232,7 +232,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. evo_point = 1200 evo_limit = 1400 next = "/mob/living/simple_animal/hostile/metroid/combat/alpha" - + vore_active = 1 vore_bump_chance = 0 vore_capacity = 1 @@ -240,20 +240,20 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. vore_pounce_chance = 25 //Metroids only eat incapacitated targets vore_default_mode = DM_DIGEST swallowTime = 1 SECONDS //Hungry little bastards. - vore_escape_chance = 25 + vore_escape_chance = 25 /mob/living/simple_animal/hostile/metroid/evolution/super/New() playsound(src, 'sound/metroid/metroidsee.ogg', 100, 1) ..() - + /mob/living/simple_animal/hostile/metroid/evolution/super/death() playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1) ..() - - - -//------------------------------------------------------------------------------------------------------------ + + + +//------------------------------------------------------------------------------------------------------------ @@ -272,7 +272,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. melee_damage_upper = 15 melee_miss_chance = 5 attacktext = list("rammed") - armor = list( + armor = list( "melee" = 60, "bullet" = 45, "laser" = 50, @@ -283,7 +283,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. gender = NEUTER faction = "metroids" move_to_delay = 3 - + //Alphas lose their vulnerability to cold. minbodytemp = 0 min_oxy = 0 @@ -327,14 +327,14 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. vore_icons = SA_ICON_LIVING vore_pounce_chance = 15 //Alphas will try knocking targets over since they lost their stun ability from the initial phases. vore_default_mode = DM_DIGEST - swallowTime = 3 SECONDS + swallowTime = 3 SECONDS vore_escape_chance = 25 - - - - - + + + + + //------------------------------------------------------------------------------------------------------------ @@ -354,7 +354,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. melee_damage_upper = 20 melee_miss_chance = 5 attacktext = list("rammed") - armor = list( + armor = list( "melee" = 60, "bullet" = 50, "laser" = 50, @@ -365,7 +365,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. gender = NEUTER faction = "metroids" move_to_delay = 4 - + move_shoot = 1 //Move and shoot at the same time. ranged_cooldown = 0 //What the starting cooldown is on ranged attacks ranged_cooldown_time = 150 //How long, in deciseconds, the cooldown of ranged attacks is @@ -407,7 +407,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. /mob/living/simple_animal/hostile/metroid/combat/gamma/New() playsound(src, 'sound/metroid/metroidgamma.ogg', 100, 1) ..() - + /mob/living/simple_animal/hostile/metroid/combat/gamma/death() playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1) ..() @@ -417,14 +417,14 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. vore_bump_chance = 0 vore_capacity = 1 vore_icons = SA_ICON_LIVING - vore_pounce_chance = 15 + vore_pounce_chance = 15 vore_default_mode = DM_DIGEST - swallowTime = 3 SECONDS + swallowTime = 3 SECONDS vore_escape_chance = 20 - - - -//------------------------------------------------------------------------------------------------------------ + + + +//------------------------------------------------------------------------------------------------------------ @@ -444,7 +444,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. melee_miss_chance = 5 attack_armor_pen = 10 attacktext = list("slashed") - armor = list( + armor = list( "melee" = 70, "bullet" = 60, "laser" = 50, @@ -455,7 +455,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. gender = NEUTER faction = "metroids" move_to_delay = 4 - + move_shoot = 1 //Move and shoot at the same time. ranged_cooldown = 0 //What the starting cooldown is on ranged attacks ranged_cooldown_time = 60 //How long, in deciseconds, the cooldown of ranged attacks is @@ -474,7 +474,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. min_n2 = 0 max_n2 = 0 unsuitable_atoms_damage = 0 - + pixel_x = -16 pixel_y = -16 old_x = -16 @@ -499,7 +499,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. /mob/living/simple_animal/hostile/metroid/combat/zeta/New() playsound(src, 'sound/metroid/metroidzeta.ogg', 100, 1) ..() - + /mob/living/simple_animal/hostile/metroid/combat/zeta/death() playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1) ..() @@ -509,15 +509,15 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. vore_bump_chance = 0 vore_capacity = 1 vore_icons = SA_ICON_LIVING - vore_pounce_chance = 20 + vore_pounce_chance = 20 vore_default_mode = DM_DIGEST - swallowTime = 3 SECONDS + swallowTime = 3 SECONDS vore_escape_chance = 15 - - - - -//------------------------------------------------------------------------------------------------------------ + + + + +//------------------------------------------------------------------------------------------------------------ @@ -537,7 +537,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. melee_miss_chance = 5 attack_armor_pen = 20 attacktext = list("slashed") - armor = list( + armor = list( "melee" = 75, "bullet" = 60, "laser" = 55, @@ -549,7 +549,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. faction = "metroids" speed = 4 move_to_delay = 5 - + move_shoot = 1 //Move and shoot at the same time. ranged_cooldown = 0 //What the starting cooldown is on ranged attacks ranged_cooldown_time = 150 //How long, in deciseconds, the cooldown of ranged attacks is @@ -568,7 +568,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. min_n2 = 0 max_n2 = 0 unsuitable_atoms_damage = 0 - + old_x = -16 old_y = 0 default_pixel_x = -16 @@ -593,7 +593,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. /mob/living/simple_animal/hostile/metroid/combat/omega/New() playsound(src, 'sound/metroid/metroidomega.ogg', 100, 1) ..() - + /mob/living/simple_animal/hostile/metroid/combat/omega/death() playsound(src, 'sound/metroid/metroidomegadeath.ogg', 100, 1) ..() @@ -603,21 +603,21 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. vore_bump_chance = 0 vore_capacity = 2 vore_icons = SA_ICON_LIVING - vore_pounce_chance = 40 + vore_pounce_chance = 40 vore_default_mode = DM_DIGEST swallowTime = 3 SECONDS vore_escape_chance = 5 - - - - -//------------------------------------------------------------------------------------------------------------ + + + + +//------------------------------------------------------------------------------------------------------------ /mob/living/simple_animal/hostile/metroid/combat/queen name = "queen metroid" - desc = "The mother of all Metroids, allowed to have grown too far!" + desc = "The mother of all Metroids - allowed to have grown too far!" tt_desc = "Maximus Queenamus Deathamus" icon = 'icons/mob/metroid/queen.dmi' icon_dead = "queen_dead" @@ -631,7 +631,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. melee_miss_chance = 5 attack_armor_pen = 20 attacktext = list("gnashed") - armor = list( + armor = list( "melee" = 75, "bullet" = 60, "laser" = 60, @@ -661,7 +661,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. min_n2 = 0 max_n2 = 0 unsuitable_atoms_damage = 0 - + pixel_x = -16 pixel_y = -16 old_x = -16 @@ -677,18 +677,19 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. cooperative = 1 evo_point = 1100 evo_limit = INFINITY - next = "/mob/living/simple_animal/hostile/metroid/evolution/super" - + next = null + /mob/living/simple_animal/hostile/metroid/combat/queen/New() playsound(src, 'sound/metroid/metroidqueen.ogg', 100, 1) + queen_amount++ ..() - + /mob/living/simple_animal/hostile/metroid/combat/queen/death() playsound(src, 'sound/metroid/metroidqueendeath.ogg', 100, 1) queen_amount-- ..() - + /mob/living/simple_animal/hostile/metroid/combat/queen //active noms vore_active = 1 vore_bump_chance = 0 @@ -705,13 +706,13 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. /* -//Objects related to the Metroids. +//Objects related to the Metroids. //Projectile for the Metroids. */ /obj/item/projectile/energy/metroidacid - + name = "metroid acid" icon_state = "neurotoxin" damage = 10 @@ -719,7 +720,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. agony = 10 check_armour = "bio" armor_penetration = 50 - + //EGG! Metroid egg and its mechanics. Ripped from spiders. /obj/effect/metroid/egg name = "egg cluster" @@ -757,9 +758,9 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. //------------------------------------------------------------------------------------------------------------ - - + + /* //LIFE STUFF, AND MECHANICS! @@ -775,7 +776,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. release_vore_contents() prey_excludes.Cut() stop_consumption() - + if(canEvolve == 1 && nutrition >= evo_point && !buckled && vore_fullness == 0 && !victim) playsound(src, 'sound/metroid/metroidgrow.ogg', 50, 1) paralysis = 7998 @@ -793,8 +794,8 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. new next(get_turf(src)) visible_message("\The [src] suddenly evolves!") qdel(src) - - + + /mob/living/simple_animal/hostile/metroid/evolution/handle_regular_status_updates() if(stat != DEAD) @@ -816,7 +817,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. visible_message("\The [src] starts trying to slide itself into the vent!") sleep(50) //Let's stop the metroid for five seconds to do its parking job ..() - if(entry_vent.network && entry_vent.network.normal_members.len) + if(!victim && !buckled && vore_fullness == 0 && entry_vent.network && entry_vent.network.normal_members.len) var/list/vents = list() for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in entry_vent.network.normal_members) vents.Add(temp_vent) @@ -848,7 +849,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. if(prob(input * 2)) // Gain around one level per 50 nutrition power_charge = min(power_charge++, 10) - + /mob/living/simple_animal/hostile/metroid/evolution/PunchTarget() //this segment determines what the mob does depending on its intent. if(victim) return // Already eatting someone. @@ -953,7 +954,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. /mob/living/simple_animal/hostile/metroid/evolution/DoPunch(var/mob/living/L) //Metroid melee. var/damage_to_do = rand(melee_damage_lower, melee_damage_upper) var/armor_modifier = abs((L.getarmor(null, "bio") / 100) - 1) - + if(!Adjacent(L)) // Might've moved away in the meantime. return @@ -1061,8 +1062,8 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. paralysis = 7998 sleep(50) paralysis = 0 - - + + /mob/living/simple_animal/hostile/metroid/evolution/FindTarget() //This makes it so it doesn't go after another target while succing. if(victim) // Don't worry about finding another target if we're sucking on someone's head. return @@ -1080,9 +1081,9 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. return else ..() - - - + + + /mob/living/simple_animal/hostile/metroid/evolution/baby/Found(mob/living/L) if(isliving(L)) if(SA_attackable(L)) @@ -1093,21 +1094,21 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. return H // Monkeys are always food. else return - + if(ishuman(L)) var/mob/living/carbon/human/H = L if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too. return H // Monkeys are always food. return - + /* -//LIFE PROCS! -//FOR THE COMBAT FORMS +//LIFE PROCS! +//FOR THE COMBAT FORMS */ @@ -1118,32 +1119,23 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. if(canEvolve == 1 && nutrition >= evo_limit && vore_fullness == TRUE) //spit dat crap out if nutrition gets too high! release_vore_contents() prey_excludes.Cut() - - if(canEvolve == 1 && nutrition >= evo_point && vore_fullness == 0) + + if(canEvolve == 1 && nutrition >= evo_point && vore_fullness == 0 && next != "/mob/living/simple_animal/hostile/metroid/combat/queen") playsound(src, 'sound/metroid/metroidgrow.ogg', 50, 1) paralysis = 7998 sleep(50) paralysis = 0 expand_troid() return - if(stance == 7) //Necessary to fix a bug where if their prey or latching victim is laying down when they evolve, they get stuck in stance 7 and do nothing. - stance = 4 - return - -/mob/living/simple_animal/hostile/metroid/combat/omega/Life() - . = ..() - if(queen_amount == 0 && prob(5) && canEvolve == 1 && nutrition >= evo_point) + else if(queen_amount == 0 && prob(5) && canEvolve == 1 && nutrition >= evo_point && vore_fullness == 0 && next == "/mob/living/simple_animal/hostile/metroid/combat/queen") playsound(src, 'sound/metroid/metroidgrow.ogg', 50, 1) - queen_amount++ + paralysis = 7998 + sleep(50) + paralysis = 0 expand_troid() - - -/mob/living/simple_animal/hostile/metroid/combat/queen/Life() - . = ..() - var/obj/effect/metroid/egg/E = locate() in get_turf(src) - if(canEvolve == 1 && nutrition >= evo_point && !E) + else if(next == null && canEvolve == 1 && nutrition >= evo_point) playsound(src, 'sound/metroid/metroidgrow.ogg', 50, 1) src.visible_message("\The [src] begins to lay an egg.") stop_automated_movement = 1 @@ -1153,7 +1145,12 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. nutrition = 400 return - + if(stance == 7) //Necessary to fix a bug where if their prey or latching victim is laying down when they evolve, they get stuck in stance 7 and do nothing. + stance = 4 + return + + + /mob/living/simple_animal/hostile/metroid/combat/proc/adjust_nutrition(input) nutrition = (nutrition + input) //It handles the metroid's nutrition gain from melee. @@ -1171,7 +1168,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. /mob/living/simple_animal/hostile/metroid/combat/DoPunch(var/mob/living/L) //Metroid actions vs the player. var/damage_to_do = rand(melee_damage_lower, melee_damage_upper) var/armor_modifier = abs((L.getarmor(null, "bio") / 100) - 1) - + if(!Adjacent(L)) // Might've moved away in the meantime. return @@ -1187,12 +1184,12 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world. if(I_HURT) //The metroid does this if it can't latch onto the target or it decides not to try knocking them down. ai_log("DoPunch() against [L], hurting.",2) - - + + L.attack_generic(src, damage_to_do, pick(attacktext)) playsound(src, 'sound/weapons/bite.ogg', 75, 1) - + // Give the Metroid some nutrition, if applicable, even if not attached. if(!L.isSynthetic()) if(ishuman(L)) diff --git a/code/modules/mob/living/simple_animal/vore/otie.dm b/code/modules/mob/living/simple_animal/vore/otie.dm index 649e064e85..960a9c70e7 100644 --- a/code/modules/mob/living/simple_animal/vore/otie.dm +++ b/code/modules/mob/living/simple_animal/vore/otie.dm @@ -34,9 +34,9 @@ say_got_target = list("Rurrr!", "ROAR!", "MARR!", "RERR!", "RAHH!", "RAH!", "WARF!") melee_damage_lower = 5 melee_damage_upper = 15 //Don't break my bones bro - response_help = "pets the" - response_disarm = "bops the" - response_harm = "hits the" + response_help = "pets" + response_disarm = "bops" + response_harm = "hits" attacktext = list("mauled") friendly = list("nuzzles", "slobberlicks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on") meat_amount = 6 diff --git a/code/modules/mob/living/simple_animal/vore/rat.dm b/code/modules/mob/living/simple_animal/vore/rat.dm index 53b2e73c12..dd18a80ff1 100644 --- a/code/modules/mob/living/simple_animal/vore/rat.dm +++ b/code/modules/mob/living/simple_animal/vore/rat.dm @@ -25,9 +25,9 @@ emote_see = list("runs in a circle", "shakes", "scritches at something") say_maybe_target = list("Squeek?") say_got_target = list("SQUEEK!") - response_help = "pets the" - response_disarm = "bops the" - response_harm = "hits the" + response_help = "pets" + response_disarm = "bops" + response_harm = "hits" attacktext = list("ravaged") friendly = list("nuzzles", "licks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on") diff --git a/code/modules/mob/living/simple_animal/vore/redpanda.dm b/code/modules/mob/living/simple_animal/vore/redpanda.dm index ab034b1724..1a585bda99 100644 --- a/code/modules/mob/living/simple_animal/vore/redpanda.dm +++ b/code/modules/mob/living/simple_animal/vore/redpanda.dm @@ -12,9 +12,9 @@ maxHealth = 30 health = 30 - response_help = "pats the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" + response_help = "pats" + response_disarm = "gently pushes aside" + response_harm = "hits" harm_intent_damage = 5 melee_damage_lower = 5 @@ -56,3 +56,40 @@ health = 100 melee_damage_lower = 10 melee_damage_upper = 20 + +/mob/living/simple_animal/redpanda/alt + icon = 'icons/mob/vore48x48.dmi' + icon_state = "wah_alt" + icon_living = "wah_alt" + icon_dead = "wah_alt_dead" + + pixel_x = -7 + +/mob/living/simple_animal/redpanda/alt/waaah + name = "waaah" + desc = "It's a waaah! Waaaaaaaaaah!" + tt_desc = "Ailurus waaahius" + icon_state = "wah_altwaaah" + icon_living = "wah_altwaaah" + icon_dead = "wah_altwaaah_dead" + + maxHealth = 150 + health = 150 + + response_help = "pats" + response_disarm = "gently pushes aside" + response_harm = "hits" + + harm_intent_damage = 5 + melee_damage_lower = 5 + melee_damage_upper = 2 + attacktext = list("bapped rapidly!") + + turns_per_move = 1 + + speak_chance = 25 + speak = list("Waaah!", + "Waaah?", + "Waaaaaaaaaah!") + emote_hear = list("wahs!","wahs even more!") + emote_see = list("trundles around wahing","rears up onto their hind legs and wahs at everyone!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/rakshasa_abilities.dm b/code/modules/mob/living/simple_animal/vore/shadekin/rakshasa_abilities.dm new file mode 100644 index 0000000000..2457afb7b8 --- /dev/null +++ b/code/modules/mob/living/simple_animal/vore/shadekin/rakshasa_abilities.dm @@ -0,0 +1,203 @@ +/mob/living/simple_animal/shadekin/initialize() + var/list/ability_types = subtypesof(/obj/effect/shadekin_ability) + if(name == "Rakshasa") + ability_types += subtypesof(/obj/effect/rakshasa_ability) + shadekin_abilities = list() + for(var/type in ability_types) + shadekin_abilities += new type(src) + + update_icon() + + return ..() + + +/obj/effect/rakshasa_ability + name = "" + desc = "" + icon = 'icons/mob/screen_spells.dmi' + var/ability_name = "FIX ME" + var/cost = 50 + var/mob/living/simple_animal/shadekin/my_kin + var/shift_mode = NOT_WHILE_SHIFTED + var/ab_sound + +/obj/effect/rakshasa_ability/New(var/new_kin) + ..() + my_kin = new_kin + loc = null + +/obj/effect/rakshasa_ability/Destroy() + my_kin = null + return ..() + +/obj/effect/rakshasa_ability/proc/atom_button_text() + var/shift_denial + + if(shift_mode == NOT_WHILE_SHIFTED && (my_kin.ability_flags & AB_PHASE_SHIFTED)) + shift_denial = "Physical Only" + else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_kin.ability_flags & AB_PHASE_SHIFTED)) + shift_denial = "Shifted Only" + + if(shift_denial) + name = shift_denial + else + name = my_kin.energy >= cost ? "Activate" : "No Energy" + return src + +/obj/effect/rakshasa_ability/Click(var/location, var/control, var/params) + if(my_kin.stat) return + + var/list/clickprops = params2list(params) + var/opts = clickprops["shift"] + + if(opts) + to_chat(my_kin,"[name] (Cost: [cost]%) - [desc]") + else + do_ability(my_kin) + +/obj/effect/rakshasa_ability/proc/do_ability() + if(my_kin.stat) + to_chat(my_kin,"Can't use that ability in your state!") + return FALSE + if(shift_mode == NOT_WHILE_SHIFTED && (my_kin.ability_flags & AB_PHASE_SHIFTED)) + to_chat(my_kin,"Can't use that ability while phase shifted!") + return FALSE + else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_kin.ability_flags & AB_PHASE_SHIFTED)) + to_chat(my_kin,"Can only use that ability while phase shifted!") + return FALSE + else if(my_kin.energy < cost) + to_chat(my_kin,"Not enough energy for that ability!") + return FALSE + + my_kin.energy -= cost + if(ab_sound) + playsound(src,ab_sound,75,1) + + return TRUE + + + + +/obj/effect/rakshasa_ability/phase_shift2 + ability_name = "Goo Shift" + desc = "Shift yourself with goopy effects." + icon_state = "tech_passwall" + cost = 100 + shift_mode = SHIFTED_OR_NOT + ab_sound = 'sound/effects/stealthoff.ogg' +/obj/effect/rakshasa_ability/phase_shift2/do_ability() + if(!..()) + return + new /obj/effect/decal/cleanable/blood/oil(loc, src) + playsound(src, 'sound/rakshasa/Corrosion1.ogg', 100, 1) + my_kin.phase_shift() + if(my_kin.ability_flags & AB_PHASE_SHIFTED) + cost = 0 //Shifting back is free (but harmful in light) + new /obj/effect/decal/cleanable/blood/oil(my_kin.loc) + var/goo_sounds = list ( + 'sound/rakshasa/Decay1.ogg', + 'sound/rakshasa/Decay2.ogg', + 'sound/rakshasa/Decay3.ogg' + ) + var/sound = pick(goo_sounds) + playsound(my_kin.loc, sound, 100, 1) + else + cost = initial(cost) + new /obj/effect/decal/cleanable/blood/oil(my_kin.loc) + playsound(my_kin.loc, 'sound/rakshasa/Emerge0.ogg', 100, 1) +///////////////////////////////////////////////////////////////// +/obj/effect/rakshasa_ability/phase_shift3 + ability_name = "Goo Shift No Emerge" + desc = "Shift yourself with goopy effects." + icon_state = "tech_passwall" + cost = 100 + shift_mode = SHIFTED_OR_NOT + ab_sound = 'sound/effects/stealthoff.ogg' +/obj/effect/rakshasa_ability/phase_shift3/do_ability() + if(!..()) + return + new /obj/effect/decal/cleanable/blood/oil(loc, src) + playsound(src, 'sound/rakshasa/Corrosion1.ogg', 100, 1) + my_kin.phase_shift() + if(my_kin.ability_flags & AB_PHASE_SHIFTED) + cost = 0 //Shifting back is free (but harmful in light) + new /obj/effect/decal/cleanable/blood/oil(my_kin.loc) + var/goo_sounds = list ( + 'sound/rakshasa/Decay1.ogg', + 'sound/rakshasa/Decay2.ogg', + 'sound/rakshasa/Decay3.ogg' + ) + var/sound = pick(goo_sounds) + playsound(my_kin.loc, sound, 100, 1) + else + cost = initial(cost) + new /obj/effect/decal/cleanable/blood/oil(my_kin.loc) + var/goo_sounds = list ( + 'sound/rakshasa/Decay1.ogg', + 'sound/rakshasa/Decay2.ogg', + 'sound/rakshasa/Decay3.ogg' + ) + var/sound = pick(goo_sounds) + playsound(my_kin.loc, sound, 100, 1) +///////////////////////////////////////////////////////////////// +/obj/effect/rakshasa_ability/drip_oil + ability_name = "Goo Drip" + desc = "Drip some goo." + icon_state = "" + cost = 0 + shift_mode = SHIFTED_OR_NOT + ab_sound = 'sound/effects/stealthoff.ogg' +/obj/effect/rakshasa_ability/drip_oil/do_ability() + if(!..()) + return + new /obj/effect/decal/cleanable/blood/oil(my_kin.loc) + var/goo_sounds = list ( + 'sound/rakshasa/Decay1.ogg', + 'sound/rakshasa/Decay2.ogg', + 'sound/rakshasa/Decay3.ogg' + ) + var/sound = pick(goo_sounds) + playsound(my_kin.loc, sound, 100, 1) +///////////////////////////////////////////////////////////////// +/obj/effect/rakshasa_ability/laugh + ability_name = "Laugh" + desc = "Laugh." + icon_state = "" + cost = 0 + shift_mode = SHIFTED_OR_NOT + ab_sound = 'sound/effects/stealthoff.ogg' +/obj/effect/rakshasa_ability/laugh/do_ability() + if(!..()) + return + playsound(my_kin.loc, 'sound/rakshasa/Laugh.ogg', 100, 1) +///////////////////////////////////////////////////////////////// +/obj/effect/rakshasa_ability/no + ability_name = "Say No" + desc = "Say no!" + icon_state = "" + cost = 0 + shift_mode = SHIFTED_OR_NOT + ab_sound = 'sound/effects/stealthoff.ogg' +/obj/effect/rakshasa_ability/no/do_ability() + if(!..()) + return + playsound(my_kin.loc, 'sound/rakshasa/No.ogg', 100, 1) +///////////////////////////////////////////////////////////////// +/obj/effect/rakshasa_ability/trap + ability_name = "Lay Trap" + desc = "Lay a trap that will notify you when someone steps in it." + icon_state = "" + cost = 0 + shift_mode = SHIFTED_OR_NOT + ab_sound = 'sound/effects/stealthoff.ogg' +/obj/effect/rakshasa_ability/trap/do_ability() + if(!..()) + return + var/goo_sounds = list ( + 'sound/rakshasa/Corrosion1.ogg', + 'sound/rakshasa/Corrosion2.ogg', + 'sound/rakshasa/Corrosion3.ogg' + ) + var/sound = pick(goo_sounds) + playsound(my_kin.loc, sound, 100, 1) + new /obj/structure/gootrap (my_kin.loc) diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/rakshasa_trap.dm b/code/modules/mob/living/simple_animal/vore/shadekin/rakshasa_trap.dm new file mode 100644 index 0000000000..2d44ca6279 --- /dev/null +++ b/code/modules/mob/living/simple_animal/vore/shadekin/rakshasa_trap.dm @@ -0,0 +1,76 @@ +/obj/structure/gootrap + name = "goo" + throw_speed = 2 + throw_range = 1 + gender = PLURAL + icon = 'icons/effects/blood.dmi' + var/base_icon = 'icons/effects/blood.dmi' + icon_state = "mfloor1" + var/basecolor="#030303" + desc = "" + throwforce = 0 + w_class = ITEMSIZE_NORMAL + matter = list(DEFAULT_WALL_MATERIAL = 18750) + var/deployed = 1 + anchored = 1 + +/obj/structure/gootrap/proc/can_use(mob/user) + return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained()) + +/obj/structure/gootrap/update_icon() + ..() + color = basecolor + +/obj/structure/gootrap/New() + ..() + update_icon() + return + +/obj/structure/gootrap/attack_hand(mob/user as mob) + if(has_buckled_mobs() && can_use(user)) + var/victim = english_list(buckled_mobs) + user.visible_message( + "[user] begins freeing [victim] from \the [src].", + "You carefully begin to free [victim] from \the [src].", + ) + if(do_after(user, 5)) + user.visible_message("[victim] has been freed from \the [src] by [user].") + for(var/A in buckled_mobs) + unbuckle_mob(A) + anchored = 0 + else + ..() + +/obj/structure/gootrap/proc/attack_mob(mob/living/L) + //trap the victim in place + set_dir(L.dir) + can_buckle = 1 + buckle_mob(L) + var/goo_sounds = list ( + 'sound/rakshasa/Decay1.ogg', + 'sound/rakshasa/Decay2.ogg', + 'sound/rakshasa/Decay3.ogg' + ) + var/sound = pick(goo_sounds) + playsound(src, sound, 100, 1) + L << "You hear a gooey schlorp as \the [src] ensnares your leg, trapping you in place!" + deployed = 0 + can_buckle = initial(can_buckle) + + +/obj/structure/gootrap/Crossed(AM as mob|obj) + if(deployed && isliving(AM)) + var/mob/living/L = AM + if(L.m_intent == "run") + L.visible_message( + "[L] steps on \the [src].", + "You step on \the [src]!", + "You hear a gooey schlorp as the goo ensnares your leg!" + ) + attack_mob(L) + if(!has_buckled_mobs()) + anchored = 0 + deployed = 0 + message_admins("[key_name(usr)] has stepped in the goo trap.") + ..() + diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm b/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm index b91937f38c..6c878d2748 100644 --- a/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm +++ b/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm @@ -43,9 +43,9 @@ emote_see = list("tailtwitches", "earflicks") say_maybe_target = list("...mar?") say_got_target = list("MAR!!!") - response_help = "pets the" - response_disarm = "bops the" - response_harm = "hits the" + response_help = "pets" + response_disarm = "bops" + response_harm = "hits" attacktext = list("mauled","slashed","clawed") friendly = list("boops", "pawbs", "mars softly at", "sniffs on") reactions = list("Mar?" = "Marrr!", "Mar!" = "Marrr???", "Mar." = "Marrr.") diff --git a/code/modules/mob/new_player/sprite_accessories_ch.dm b/code/modules/mob/new_player/sprite_accessories_ch.dm index af5dd49294..62426524a2 100644 --- a/code/modules/mob/new_player/sprite_accessories_ch.dm +++ b/code/modules/mob/new_player/sprite_accessories_ch.dm @@ -52,6 +52,24 @@ color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_HEAD) + athena_panels + name = "Hephaestus - Athena FBP Panels" + icon_state = "athena_p" + color_blend_mode = ICON_MULTIPLY + 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,BP_HEAD) + + athena_panels_body + name = "Hephaestus - Athena FBP Panels (body)" + icon_state = "athena_p" + color_blend_mode = ICON_MULTIPLY + 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) + + athena_panels_head + name = "Hephaestus - Athena FBP Panels (head)" + icon_state = "athena_p" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + rook_lights name = "Bishop - Rook lights" icon_state = "rook-l" diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index 925a2c2519..b8854e1d3d 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -103,3 +103,44 @@ chloral spawn_reagent = "chloralhydrate" cryoxadone spawn_reagent = "cryoxadone" clonexadone spawn_reagent = "clonexadone" + + // Chems that are used but not meant for cargo supplies, at least for now. + champagne spawn_reagent = "champagne" + grapesoda spawn_reagent = "grapesoda" + singulo spawn_reagent = "singulo" + doctorsdelight spawn_reagent = "doctorsdelight" + nothing spawn_reagent = "nothing" + banana spawn_reagent = "banana" + honey spawn_reagent = "honey" + egg spawn_reagent = "egg" + coco spawn_reagent = "coco" + cherryjelly spawn_reagent = "cherryjelly" + carrot spawn_reagent = "carrot" + apple spawn_reagent = "apple" + tomato spawn_reagent = "tomato" + nutbutter spawn_reagent = "nutbutter" //ha + soymilk spawn_reagent = "soymilk" + grenadine spawn_reagent = "grenadine" + gingerale spawn_reagent = "gingerale" + royrogers spawn_reagent = "royrogers" + patron spawn_reagent = "patron" + goldschlager spawn_reagent = "goldschlager" + gelatin spawn_reagent = "gelatin" + melonliquor spawn_reagent = "melonliquor" + bluecuracao spawn_reagent = "bluecuracao" + thirteenloko spawn_reagent = "thirteenloko" + deadrum spawn_reagent = "deadrum" + sake spawn_reagent = "sake" + acidspit spawn_reagent = "acidspit" + amasec spawn_reagent = "amasec" + beepsky_smash spawn_reagent = "beepsky_smash" + atomicbomb spawn_reagent = "atomicbomb" + nuka_cola spawn_reagent = "nuka_cola" + threemileisland spawn_reagent = "threemileisland" + manhattan_proj spawn_reagent = "manhattan_proj" + psilocybin spawn_reagent = "psilocybin" + moonshine spawn_reagent = "moonshine" + specialwhiskey spawn_reagent = "specialwhiskey" + unathiliquor spawn_reagent = "unathiliquor" + winebrandy spawn_reagent = "winebrandy" + snaps spawn_reagent = "snaps" diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index d5a1f0571a..9cc15f8499 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -157,3 +157,14 @@ reagent_volumes[reagent_ids[mode]] -= t user << "You transfer [t] units of the solution to [target]." return + +/obj/item/weapon/reagent_containers/borghypo/service/booze + name = "cyborg drink synthesizer" + desc = "A portable drink dispencer." + icon = 'icons/obj/drinks.dmi' + icon_state = "shaker" + charge_cost = 20 + recharge_time = 3 + volume = 120 + possible_transfer_amounts = list(1 ,5, 10, 20, 30) + reagent_ids = list("ale", "beer", "berryjuice", "blood", "bitters", "cherryjelly", "coffee", "cognac", "cola", "demonsblood", "dr_gibb","eggnog", "gin", "gingerale", "hot_coco", "honey", "highpower", "ice", "icetea", "kahlua", "lemonjuice", "lemon_lime", "limejuice", "mead", "milk", "mint", "orangejuice", "gargleblaster", "phoronspecial", "rum", "sake", "sodawater", "soymilk", "space_up", "spacemountainwind", "specialwhiskey", "sugar", "sitonmyface", "spiderdrink", "syndicatebomb", "tea", "tequilla", "tomatojuice", "tonic", "vermouth", "vodka", "virginsip", "water", "watermelonjuice", "whiskey", "wine") diff --git a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm index cadbb3727c..4a33ced54d 100644 --- a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm @@ -150,11 +150,20 @@ name = "Wolf (Taur)" icon_state = "wolf_s" suit_sprites = 'icons/mob/taursuits_wolf_vr.dmi' + +/datum/sprite_accessory/tail/taur/fatwolf + name = "Fat Wolf (Taur)" + icon_state = "fatwolf_s" /datum/sprite_accessory/tail/taur/wolf/wolf_2c name = "Wolf dual-color (Taur)" icon_state = "wolf_s" extra_overlay = "wolf_markings" + +/datum/sprite_accessory/tail/taur/wolf/fatwolf_2c + name = "Fat Wolf dual-color (Taur)" + icon_state = "fatwolf_s" + extra_overlay = "fatwolf_markings" /datum/sprite_accessory/tail/taur/wolf/synthwolf name = "SynthWolf dual-color (Taur)" @@ -327,16 +336,30 @@ name = "Feline (Taur)" icon_state = "feline_s" +/datum/sprite_accessory/tail/taur/fatfeline + name = "Fat Feline (Taur)" + icon_state = "fatfeline_s" + /datum/sprite_accessory/tail/taur/feline_wag name = "Feline (Taur) (vwag)" icon_state = "feline_s" ani_state = "feline_w" + +/datum/sprite_accessory/tail/taur/fatfeline_wag + name = "Fat Feline (Taur) (vwag)" + icon_state = "fatfeline_s" + ani_state = "fatfeline_w" /datum/sprite_accessory/tail/taur/feline/feline_2c name = "Feline dual-color (Taur)" icon_state = "feline_s" extra_overlay = "feline_markings" +/datum/sprite_accessory/tail/taur/feline/fatfeline_2c + name = "Fat Feline dual-color (Taur)" + icon_state = "fatfeline_s" + extra_overlay = "fatfeline_markings" + /datum/sprite_accessory/tail/taur/feline/feline_spots name = "Feline spots (Taur)" icon_state = "feline_s" diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 8f779502a6..a9c8195cdc 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -60,7 +60,7 @@ //Numbing flag if(mode_flags & DM_FLAG_NUMBING) - if(H.bloodstr.get_reagent_amount("numbenzyme") < 2) + if(H.bloodstr.get_reagent_amount("numbenzyme") < 2 && !H.synthetic) H.bloodstr.add_reagent("numbenzyme",4) //Stripping flag @@ -184,7 +184,7 @@ if(M.absorbed && owner.nutrition >= 100) M.absorbed = 0 - to_chat(M,"You suddenly feel solid again ") + to_chat(M,"You suddenly feel solid again.") to_chat(owner,"You feel like a part of you is missing.") owner.nutrition -= 100 to_update = TRUE diff --git a/code/modules/vore/eating/contaminate_vr.dm b/code/modules/vore/eating/contaminate_vr.dm index dac679b0a2..1f21eff605 100644 --- a/code/modules/vore/eating/contaminate_vr.dm +++ b/code/modules/vore/eating/contaminate_vr.dm @@ -25,8 +25,9 @@ var/image/gurgled_overlay = image('icons/effects/sludgeoverlay_vr.dmi') /obj/item/proc/can_gurgle() if(flags & PHORONGUARD) return FALSE - else if(phoronproof == TRUE) - return FALSE +//TFF 2/8/19 - removed to prevent contamination damage. +// else if(phoronproof == TRUE) +// return FALSE else if(unacidable) return FALSE else diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 8d1717b320..be51a3c39a 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -384,8 +384,16 @@ belly = pred.vore_selected return perform_the_nom(user, prey, pred, belly) -/mob/living/proc/feed_self_to_grabbed(var/mob/living/user, var/mob/living/pred) - var/belly = input("Choose Belly") in pred.vore_organs +/mob/living/proc/feed_self_to_grabbed(var/mob/living/user, var/mob/living/pred, var/belly, var/list/bellys) + //CHOMPEDIT: AUTO BELLY SELECTOR + if (!user.client) + for(var/obj/belly/guttoviolate in pred.vore_organs) + if(guttoviolate.name == "fstomach") + bellys |= guttoviolate + if(!bellys)return + belly = pick(bellys) + //CHOMPEDIT: END + else belly = input("Choose Belly") in pred.vore_organs return perform_the_nom(user, user, pred, belly) /mob/living/proc/feed_grabbed_to_other(var/mob/living/user, var/mob/living/prey, var/mob/living/pred) diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 5b7be77ea5..c2d66dc0ce 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -812,8 +812,9 @@ user.client.prefs_vr.digestable = user.digestable //TFF 30/4/19: Ports VoreStation Remains Option - add option that goes paw in paw with belly setting; allow yourself to leave bones behind after you're digested + //TFF 2/8/19 - Add admin message notification for setting this ON. if(href_list["toggledlm"]) - var/choice = alert(user, "This button allows preds to have your remains be left in their belly after you are digested. This will only happen if pred sets their belly to do so. Remains consist of skeletal parts. Currently you are [user.digest_leave_remains? "" : "not"] leaving remains.", "", "Allow Post-digestion Remains", "Cancel", "Disallow Post-digestion Remains") + var/choice = alert(user, "This button allows preds to have your remains be left in their belly after you are digested. This will only happen if pred sets their belly to do so. Remains consist of skeletal parts. Setting this will notify admins. Currently you are [user.digest_leave_remains? "" : "not"] leaving remains.", "", "Allow Post-digestion Remains", "Cancel", "Disallow Post-digestion Remains") switch(choice) if("Cancel") return 0 @@ -822,6 +823,8 @@ if("Disallow Post-digestion Remains") user.digest_leave_remains = FALSE + message_admins("[key_name(user)] toggled their ability to leave remains to [user.digest_leave_remains] ([user ? "JMP" : "null"])") + if(user.client.prefs_vr) user.client.prefs_vr.digest_leave_remains = user.digest_leave_remains diff --git a/icons/mob/animal_vr.dmi b/icons/mob/animal_vr.dmi index 2d8cd7a6a1..15cb1a26a8 100644 Binary files a/icons/mob/animal_vr.dmi and b/icons/mob/animal_vr.dmi differ diff --git a/icons/mob/head_vr.dmi b/icons/mob/head_vr.dmi index 798bff510a..620019a527 100644 Binary files a/icons/mob/head_vr.dmi and b/icons/mob/head_vr.dmi differ diff --git a/icons/mob/human_races/markings_ch.dmi b/icons/mob/human_races/markings_ch.dmi index 5a391fb8bd..622d66256c 100644 Binary files a/icons/mob/human_races/markings_ch.dmi and b/icons/mob/human_races/markings_ch.dmi differ diff --git a/icons/mob/pai_vr.dmi b/icons/mob/pai_vr.dmi index 7bbdaee11b..d277ed1676 100644 Binary files a/icons/mob/pai_vr.dmi and b/icons/mob/pai_vr.dmi differ diff --git a/icons/mob/pai_vr64x64.dmi b/icons/mob/pai_vr64x64.dmi new file mode 100644 index 0000000000..f9c99e51eb Binary files /dev/null and b/icons/mob/pai_vr64x64.dmi differ diff --git a/icons/mob/plantmobs32x32.dmi b/icons/mob/plantmobs32x32.dmi index a000b245d6..83c5d1bdde 100644 Binary files a/icons/mob/plantmobs32x32.dmi and b/icons/mob/plantmobs32x32.dmi differ diff --git a/icons/mob/species/seromi/synth_facemask.dmi b/icons/mob/species/seromi/synth_facemask.dmi new file mode 100644 index 0000000000..d85b0ff129 Binary files /dev/null and b/icons/mob/species/seromi/synth_facemask.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 9e50b538ac..de0f1e8a3a 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/mob/vore/taurs_vr.dmi b/icons/mob/vore/taurs_vr.dmi index cfce2ed69d..c523fc38d7 100644 Binary files a/icons/mob/vore/taurs_vr.dmi and b/icons/mob/vore/taurs_vr.dmi differ diff --git a/icons/mob/vore48x48.dmi b/icons/mob/vore48x48.dmi new file mode 100644 index 0000000000..6606332017 Binary files /dev/null and b/icons/mob/vore48x48.dmi differ diff --git a/icons/mob/vore64x64.dmi b/icons/mob/vore64x64.dmi index 73ab63fe0b..03f38f75ac 100644 Binary files a/icons/mob/vore64x64.dmi and b/icons/mob/vore64x64.dmi differ diff --git a/icons/mob/vore_shadekin64.dmi b/icons/mob/vore_shadekin64.dmi index e2da6db20a..7c209923b1 100644 Binary files a/icons/mob/vore_shadekin64.dmi and b/icons/mob/vore_shadekin64.dmi differ diff --git a/icons/mob/widerobot_colors_vr.dmi b/icons/mob/widerobot_colors_vr.dmi index 777486649a..9f696112ce 100644 Binary files a/icons/mob/widerobot_colors_vr.dmi and b/icons/mob/widerobot_colors_vr.dmi differ diff --git a/icons/mob/widerobot_vr.dmi b/icons/mob/widerobot_vr.dmi index f96999f321..883f8a4b2f 100644 Binary files a/icons/mob/widerobot_vr.dmi and b/icons/mob/widerobot_vr.dmi differ diff --git a/icons/obj/casino.dmi b/icons/obj/casino.dmi new file mode 100644 index 0000000000..12af34017f Binary files /dev/null and b/icons/obj/casino.dmi differ diff --git a/icons/obj/clothing/hats_vr.dmi b/icons/obj/clothing/hats_vr.dmi index f20d7c13d6..cc3a5e5326 100644 Binary files a/icons/obj/clothing/hats_vr.dmi and b/icons/obj/clothing/hats_vr.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 2d8e89049e..959c3dcf68 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/maps/northern_star/northern_star.dm b/maps/northern_star/northern_star.dm index 6c2e45053b..19d9928546 100644 --- a/maps/northern_star/northern_star.dm +++ b/maps/northern_star/northern_star.dm @@ -1,22 +1,22 @@ -#if !defined(USING_MAP_DATUM) - - #include "polaris-1.dmm" - #include "polaris-2.dmm" - #include "polaris-3.dmm" - #include "polaris-4.dmm" - #include "polaris-5.dmm" -// #include "polaris-6.dmm" - - #include "northern_star_defines.dm" - #include "northern_star_areas.dm" - #include "northern_star_shuttles.dm" - //TFF: Include new file for new camera network. - #include "northern_star_things.dm" - - #define USING_MAP_DATUM /datum/map/northern_star - -#elif !defined(MAP_OVERRIDE) - - #warn A map has already been included, ignoring Northern Star - +#if !defined(USING_MAP_DATUM) + + #include "polaris-1.dmm" + #include "polaris-2.dmm" + #include "polaris-3.dmm" + #include "polaris-4.dmm" + #include "polaris-5.dmm" + #include "polaris-6.dmm" + + #include "northern_star_defines.dm" + #include "northern_star_areas.dm" + #include "northern_star_shuttles.dm" + //TFF: Include new file for new camera network. + #include "northern_star_things.dm" + + #define USING_MAP_DATUM /datum/map/northern_star + +#elif !defined(MAP_OVERRIDE) + + #warn A map has already been included, ignoring Northern Star + #endif \ No newline at end of file diff --git a/maps/northern_star/northern_star_shuttles.dm b/maps/northern_star/northern_star_shuttles.dm index 886eebaac2..f2ec8f365b 100644 --- a/maps/northern_star/northern_star_shuttles.dm +++ b/maps/northern_star/northern_star_shuttles.dm @@ -208,7 +208,7 @@ docking_controller_tag = "trade_shuttle" dock_target_station = "trade_shuttle_dock_airlock" dock_target_offsite = "trade_shuttle_bay" -/* + //Casino /datum/shuttle/ferry/casino name = "Casino" @@ -217,9 +217,9 @@ area_offsite = /area/shuttle/casino/ship area_station = /area/shuttle/casino/station docking_controller_tag = "casino_shuttle" - dock_target_offsite = "casino_shuttle_bay" dock_target_station = "casino_shuttle_dock_airlock" -*/ + dock_target_offsite = "casino_shuttle_bay" + // Is this even used? /datum/shuttle/ferry/alien diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm index 2fc103a967..7820f4eecb 100644 --- a/maps/northern_star/polaris-1.dmm +++ b/maps/northern_star/polaris-1.dmm @@ -1049,7 +1049,7 @@ "aui" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/chapel_hallway) "auj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/chapel_hallway) "auk" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/cigbutt/cigarbutt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/vacant/vacant_site) -"aul" = (/obj/structure/table/gamblingtable,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/vacant/vacant_site) +"aul" = (/obj/structure/table/gamblingtable,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/deck/cagse,/turf/simulated/floor/wood,/area/vacant/vacant_site) "aum" = (/obj/structure/table/gamblingtable,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/random/toy,/turf/simulated/floor/wood,/area/vacant/vacant_site) "aun" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/vacant/vacant_site) "auo" = (/obj/structure/bed/chair/comfy/brown,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/vacant/vacant_site) @@ -1119,7 +1119,7 @@ "avA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/barricade,/turf/simulated/floor/plating,/area/vacant/vacant_site) "avB" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood,/area/vacant/vacant_site) "avC" = (/obj/structure/table/gamblingtable,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/turf/simulated/floor/wood,/area/vacant/vacant_site) -"avD" = (/obj/structure/table/gamblingtable,/turf/simulated/floor/wood,/area/vacant/vacant_site) +"avD" = (/obj/structure/table/gamblingtable,/obj/item/weapon/deck/cagse/black,/turf/simulated/floor/wood,/area/vacant/vacant_site) "avE" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/gamblingtable,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/deck/cards,/turf/simulated/floor,/area/vacant/vacant_site) "avF" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/chapel) "avG" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/gun{pixel_x = 3; pixel_y = 3},/obj/item/weapon/gun/energy/gun,/obj/effect/floor_decal/corner/blue/full{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 8},/obj/machinery/door/window/brigdoor/eastleft{name = "Energy"},/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/turf/simulated/floor/tiled/dark,/area/security/armoury) @@ -9661,7 +9661,7 @@ "dDO" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2) "dDP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D2) "dDQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D3) -"dDR" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_three_aft_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3) +"dDR" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "casino_shuttle_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = -26; req_access = list(13)},/obj/effect/floor_decal/sign/dock/three,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) "dDS" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1331; icon_state = "door_locked"; id_tag = "nuke_shuttle_dock_inner"; locked = 1; name = "Dock Four Internal Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D4) "dDT" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1331; icon_state = "door_locked"; id_tag = "nuke_shuttle_dock_inner"; locked = 1; name = "Dock Four Internal Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D4) "dDU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/entry/D4) @@ -9731,7 +9731,6 @@ "dFg" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "trade_shuttle_dock_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "trade_shuttle_dock_sensor"; pixel_x = 30; pixel_y = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1) "dFh" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "admin_shuttle_dock_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "admin_shuttle_dock_sensor"; pixel_x = -30; pixel_y = 8},/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) "dFi" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "admin_shuttle_dock_pump"},/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Dock 2 End"; dir = 9},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"dFj" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "casino_shuttle_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = -26; req_access = list(13)},/obj/effect/floor_decal/sign/dock/three,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) "dFk" = (/obj/machinery/door/airlock{name = "Bathroom Stall"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) "dFl" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "nuke_shuttle_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "nuke_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D4) "dFm" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4) @@ -9765,8 +9764,8 @@ "dFO" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D2) "dFP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D2) "dFQ" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D3) -"dFR" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_three_aft_outer"; locked = 1; name = "Dock Three External Access"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3) -"dFS" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "dock_three_aft_airlock"; name = "exterior access button"; pixel_x = 28; pixel_y = -6; req_access = list(13)},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "dock_three_aft_outer"; locked = 1; name = "Dock Three External Access"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3) +"dFR" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "dock_three_aft_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3) +"dFS" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "casino_shuttle_dock_airlock"; pixel_w = 57; pixel_x = -28; pixel_y = 0; req_one_access = list(13); tag_airpump = "casino_dock_vent"; tag_chamber_sensor = "casino_dock_sensor"; tag_exterior_door = "dock_three_aft_outer"; tag_interior_door = "dock_three_aft_inner"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) "dFT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/floor/plating,/area/hallway/secondary/entry/D4) "dFU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D4) "dFV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) @@ -10085,7 +10084,7 @@ "dLW" = (/obj/structure/flora/ausbushes/stalkybush,/turf/simulated/floor/grass,/area/crew_quarters/kitchen) "dLX" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/virologyaccess) "dLY" = (/obj/structure/flora/grass/brown,/turf/simulated/floor/grass,/area/crew_quarters/kitchen) -"dLZ" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "casino_dock_vent"},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Dock 3 End"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) +"dLZ" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "casino_dock_vent"},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Dock 3 End"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) "dMa" = (/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/structure/closet/crate,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "dMb" = (/obj/structure/closet/wardrobe/suit,/obj/item/clothing/suit/iasexy,/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge) "dMc" = (/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/circuitboard/autolathe,/obj/machinery/light/small{dir = 1},/obj/item/weapon/stock_parts/console_screen,/turf/simulated/floor,/area/storage/tech) @@ -10124,7 +10123,7 @@ "dMJ" = (/obj/machinery/light,/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/embedded_controller/radio/simple_docking_controller{pixel_x = 25; pixel_y = 5; pixel_z = -30; pixel_w = -31; req_one_access = list(5); id_tag = "medical_shuttle"; frequency = 1380; tag_door = "med_shuttle_hatch"},/turf/simulated/shuttle/floor{icon_state = "floor_white"},/area/shuttle/medical/station) "dMK" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/shuttle/floor{icon_state = "floor_white"},/area/shuttle/medical/station) "dML" = (/obj/machinery/light,/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/shuttle/floor{icon_state = "floor_white"},/area/shuttle/medical/station) -"dMM" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1379; id_tag = "casino_shuttle_dock_airlock"; pixel_w = 57; pixel_x = -28; pixel_y = 0; req_one_access = list(13); tag_airpump = "casino_dock_vent"; tag_chamber_sensor = "casino_dock_sensor"; tag_exterior_door = "dock_three_aft_outer"; tag_interior_door = "dock_three_aft_inner"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) +"dMM" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "casino_dock_vent"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "casino_dock_sensor"; pixel_x = 30; pixel_y = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) "dMN" = (/obj/structure/lattice,/obj/machinery/light{dir = 1},/turf/space,/area/mine/explored/upper_level) "dMO" = (/obj/structure/lattice,/obj/machinery/light,/turf/space,/area/mine/explored/upper_level) "dMP" = (/obj/machinery/door/airlock/glass_external/public{frequency = 1379; icon_state = "door_locked"; id_tag = "public_dock4_outer"; locked = 1; name = "Public External Airlock"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/escape/dock_escape_pod_hallway_starboard) @@ -10138,7 +10137,7 @@ "dMX" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/gear_painter,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "dMY" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "dMZ" = (/obj/structure/closet/wardrobe/black,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/turf/simulated/floor,/area/maintenance/engineering) -"dNa" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "casino_dock_vent"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "casino_dock_sensor"; pixel_x = 30; pixel_y = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) +"dNa" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "dock_three_aft_outer"; locked = 1; name = "Dock Three External Access"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3) "dNb" = (/turf/space,/area/shuttle/casino/station) "dNc" = (/obj/effect/mine/phoron{alpha = 50},/turf/simulated/floor/tiled/white/airless,/area/mine/explored/upper_level) "dNd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/random/mob/synx,/turf/simulated/floor/tiled,/area/quartermaster/qm) @@ -10204,6 +10203,7 @@ "dOl" = (/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/plating,/area/engineering/engine_room) "dOm" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/landmark{name = "carpspawn"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3) "dOn" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/landmark{name = "carpspawn"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D4) +"dOo" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "dock_three_aft_airlock"; name = "exterior access button"; pixel_x = 28; pixel_y = -6; req_access = list(13)},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "dock_three_aft_outer"; locked = 1; name = "Dock Three External Access"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10440,11 +10440,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdy aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdySdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaayaaedrodxxdrqaaedrodxxdrqaaedrodxxdrqaaedrodxxdrqaaedrodxxdrqaaeaayaaaaaeaaeaaaaaaaaaaaaaaaaaaaaadAydLjdLkdAyabGdABdACdADdACdABdwQdAEdAFdAGdwSdAHdAIdxMdAJdAKdALdAKdHwdxMdANdAOdAPdAidAQdARdASdLlaaeaaeaaeaaaaaaaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAUdAVdAWdAXdAYdAZdpidledlfaaaaaadkedkedkedkedkedkedkedkedkedkedkedkedkeaaaaaadlgdlhdpldBadkjdlkdlgaaaaaaaaadoAdoAdoAdoAdoAdoAdoAaaaaaaaaaaaaaaaaaaaaadlldlmdkndBbdOmdlpdllaaaaaaaaaaaaaaadwCdwCdwCdwCdwCdwCdwCdwCdwCaaaaaaaaaaaadlqdOndBddBeddOaafaafdwGdBfdBgdBhdwGdBidBjdBkdwGaafaafaafaafaafaafdBldBldLcdBldBlaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdySdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaazaaadrodBndrqaaadrodBndrqaaadrodBndrqaaadrodBndrqaaadrodBndrqaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGdBodBpdBqdlTdBodBsdBtdBudBvdwSdBwdBxdxMdBydBzdBAdBBdBCdxMdBDdBEdBFdAidBGdBHdASdLmaaeaaeaaeaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnzdlVdnAdqgdBJdBKdmSdBLdiYaaaaaadkedkedkedkedkedkedkedkedkedkedkedkedkeaaaaaadjedBMdmTdBNdkjdpndjeaaaaaaaaaaaadoAdoAdoAdoAdoAaaaaaaaaaaaaaaaaaaaaaaaadjldpodkndBOdnLdBPdjlaaaaaaaaaaaaaaaaaadwCdwCdwCdwCdwCdwCdwCaaaaaaaaaaaaaaadjqdBQdBRdBSddOaafaafdwGdBTdBUdBTdwGdBVdBWdBVdwGaafaafaafaafaafaafdBldBXdLedBZdBlaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdySdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaclaaaaaeaaaaaaaaaaaeaaeaaeaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGdACdCbdBqdBrdACdwQdCddCedwQdwSdwSdCfdAidCgdChdCidChdCjdAidwYdCkdwYdAidAidAidAidCldCmdCndCndCmdCoaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadladlbdlcdCpdmSdledjYaaaaaadkedkedkedkedkedkedkedkedkedkedkedkedkeaaaaaadkfdlhdmTdCqdljdlkdkfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkldlmdlndCrdnLdlpdklaaaaaaaaaaaaaaaaaadwCdwCdwCdwCdwCdwCdwCaaaaaaaaaaaaaaadkrdCsdCtdCuddOaafaafdwGdCvdCcdCvdwGdCxdCwdCxdwGaafaafaafaafaafaafdBldMhdLKdCBdBlaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdCCdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaclaclaclaclacwaazaayaaeaaeaaeaayaaeaaeaaeaaeaazaazaayaaeaaeaaeaazaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGdBodCDdBqdCydBodAidCFdCGdCHdMBdCJdCKdCLdCMdCNdCOdCPdCQdCRdCSdCTdCUdCVdCWdCWdAidCXdCndCYdCZdCndDadDbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlfdDcdDddDedDfdDgdlfaaaaaadkedkedkedkedkedkedkedkedkedkedkedkedkeaaaaaadlgdDhdDidDjdDkdDldlgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlldDmdDndFjdDpdDqdllaaaaaaaaaaaaaaadwCdwCdwCdwCdwCdwCdwCdwCdwCaaaaaaaaaaaadlqdDrdDsdDtddOaafaaidwGdCvdCEdCvdwGdCxdDudCxdwGaafaafaafaafaafaafdBldDwdLSdMpdBlaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGdACdDzdDzdDzdACdAidDAdDBdDCdDDdDEdDFdDGdDHdDIdDJdDIdDIdDIdDIdDIdDKdDLdOldCWdAidCldCmdDadCXdCmdCoaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpcdiYdpddpedpfdiZdiZdiZdiZdiZdiYdiYdDMdDNdDNdiYdiYaaaaaaaaaaaaaaaaaadkedkedkedkedkeaaaaaaaaaaaaaaaaaadjedjedDOdDOdDPdjedjeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadjldjldDQdDRdDRdjldjlaaaaaadwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdjqdjqdDSdDTdDUdjqaafaaidAudCvdDvdCvdAudCxdDVdCxdAuaaiaaiaafaafaafaafdDXdDYdDZdEadEbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidEcdBodEddEddEedBodAidDAdDBdEfdEgdEhdEidEjdEjdEkdEldEmdEndEodEpdEqdErdEsdEtdEudAidEvdCmdCYdCZdCmdEwaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaadjYdExdEydEzdjYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkfdEAdEBdECdkfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkldEDdEEdMMdklaaaaaaaaadwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdEGdEHdEIdEJdEKdkraaiaaiaaidCvdELdCvaaadCxdEMdCxaaiaaiaaiaaiaaiaaiabGabGdENdEOdENaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdySdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEPaaaaaadEPaaaaaaaaadEPaaaaaaaaaaaaaaadEPaaaaaaaaadEPaaaaaadEPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidtSdABdACdBodACdABdAidDAdDBdEQdERdESdDAdDAdDAdETdEUdEVdEWdEWdEXdEYdEZdFadFbdFcdFddFedCndDadCXdCndCYaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadladFfdDfdFgdlaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnEdFhdDidFidnEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnJdLZdDpdNadnJaaaaaaaaadwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdFldFmdFndFodFpdnNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaiaaaaaaaaaaaeaaeaaadENdFqdENaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdySdySdySdySdySdySdySdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEPdEPdEPdEPaaaaaaaaadEPdEPdEPdEPdEPdEPdEPaaaaaaaaadEPdEPdEPdEPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFrdtSdEcabGdEcdtSdAidFsdDBdFtdFudFvdDAdFwdFxdFydFzdFAdFBdFCdFDdFEdFFdFGdFHdFIdFJdFedCmdCYdCZdCmdEwaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFKdlXdFLdFMdlfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlgdFNdFOdqYdFPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFQdrddFRdFSdllaaaaaaaaadwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdridNedFTdrjdrjdFUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaadFVdFWdFVaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdCCdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaclaclaclaclacwaazaayaaeaaeaaeaayaaeaaeaaeaaeaazaazaayaaeaaeaaeaazaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGdBodCDdBqdCydBodAidCFdCGdCHdMBdCJdCKdCLdCMdCNdCOdCPdCQdCRdCSdCTdCUdCVdCWdCWdAidCXdCndCYdCZdCndDadDbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlfdDcdDddDedDfdDgdlfaaaaaadkedkedkedkedkedkedkedkedkedkedkedkedkeaaaaaadlgdDhdDidDjdDkdDldlgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlldDmdDndDRdDpdDqdllaaaaaaaaaaaaaaadwCdwCdwCdwCdwCdwCdwCdwCdwCaaaaaaaaaaaadlqdDrdDsdDtddOaafaaidwGdCvdCEdCvdwGdCxdDudCxdwGaafaafaafaafaafaafdBldDwdLSdMpdBlaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGdACdDzdDzdDzdACdAidDAdDBdDCdDDdDEdDFdDGdDHdDIdDJdDIdDIdDIdDIdDIdDKdDLdOldCWdAidCldCmdDadCXdCmdCoaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpcdiYdpddpedpfdiZdiZdiZdiZdiZdiYdiYdDMdDNdDNdiYdiYaaaaaaaaaaaaaaaaaadkedkedkedkedkeaaaaaaaaaaaaaaaaaadjedjedDOdDOdDPdjedjeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadjldjldDQdFRdFRdjldjlaaaaaadwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdjqdjqdDSdDTdDUdjqaafaaidAudCvdDvdCvdAudCxdDVdCxdAuaaiaaiaafaafaafaafdDXdDYdDZdEadEbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidEcdBodEddEddEedBodAidDAdDBdEfdEgdEhdEidEjdEjdEkdEldEmdEndEodEpdEqdErdEsdEtdEudAidEvdCmdCYdCZdCmdEwaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaadjYdExdEydEzdjYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkfdEAdEBdECdkfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkldEDdEEdFSdklaaaaaaaaadwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdEGdEHdEIdEJdEKdkraaiaaiaaidCvdELdCvaaadCxdEMdCxaaiaaiaaiaaiaaiaaiabGabGdENdEOdENaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdySdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEPaaaaaadEPaaaaaaaaadEPaaaaaaaaaaaaaaadEPaaaaaaaaadEPaaaaaadEPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidtSdABdACdBodACdABdAidDAdDBdEQdERdESdDAdDAdDAdETdEUdEVdEWdEWdEXdEYdEZdFadFbdFcdFddFedCndDadCXdCndCYaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadladFfdDfdFgdlaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnEdFhdDidFidnEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnJdLZdDpdMMdnJaaaaaaaaadwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdFldFmdFndFodFpdnNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaiaaaaaaaaaaaeaaeaaadENdFqdENaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdySdySdySdySdySdySdySdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEPdEPdEPdEPaaaaaaaaadEPdEPdEPdEPdEPdEPdEPaaaaaaaaadEPdEPdEPdEPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFrdtSdEcabGdEcdtSdAidFsdDBdFtdFudFvdDAdFwdFxdFydFzdFAdFBdFCdFDdFEdFFdFGdFHdFIdFJdFedCmdCYdCZdCmdEwaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFKdlXdFLdFMdlfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlgdFNdFOdqYdFPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFQdrddNadOodllaaaaaaaaadwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdridNedFTdrjdrjdFUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaadFVdFWdFVaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdySdySdySdySdySdySdySdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEPdEPdEPdEPaaaaaadEPdEPdEPdEPdEPdEPdEPdEPdEPaaaaaadEPdEPdEPdEPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidFXaaiaaidAidFYdEQdFZdGadGbdDAdGcdAidGddGedGfdAidGgdGhdGidGjdGkdGldGmdAidCldCmdDadCXdCmdCoaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGndGndGndGnaaaaaaaaaaaadGndGndGndGndGnaaaaaaaaaaaaaaaaaadGodGodGodGodGodGodGodGodGodGodGodGoaaaaaaaaaaaaaaaaaaaaaaaadNbdNbdNbdNbdNbdNbdNbdNbdNbdNbdNbdNbdNbdNbaaaaaadwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaeaaaaaaaaUdMqdGpaaVdGqaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdySdySdySdySdySdySdySdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEPdEPdEPdEPaaaaaadEPdEPdEPdEPdEPdEPdEPdEPdEPaaaaaadEPdEPdEPdEPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaaaaaidAidGrdDAdGsdGtdGtdDAdGudGvdGwdGxdGydGvdGzdGAdEYdEZdGBdGCdGDdAidCXdCndCYdCZdCndDaaclaaaaaaaaaaaaaaaaaaaaaaaadGndGndGndGndGndGndGndGndGndGnaaaaaaaaaaaaaaadGndGndGndGndGndGnaaaaaadGndGndGndGndGndGnaaaaaaaaaaaaaaadGodGodGodGodGodGodGodGodGodGodGodGodGodGodGoaaaaaaaaaaaaaaadNbdNbdNbdNbdNbdNbdNbdNbdNbdNbdNbdNbdNbdNbdNbaaaaaadwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaabudGEabuaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadySdySdySdySdySdySdySdySdySdySdySdySdySdySdySaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEPdEPdEPdEPdEPdEPdEPdEPdEPdEPdEPdEPdEPdEPdEPdEPdEPdEPdEPdEPdEPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaaaaaadAidDAdDAdFudGFdGFdDAdGudGGdGHdGIdGJdGGdGzdGudFEdGKdFGdGLdGMdAidCldCmdDadCXdCmdCoaclaaaaaaaaaaaaaaaaaaaaadGndGndGndGndGndGndGndGndGndGndGndGnaaaaaaaaadGndGndGndGndGndGndGndGndGndGndGndGndGndGndGnaaaaaaaaaaaadGodGodGodGodGodGodGodGodGodGodGodGodGodGodGodGodGoaaaaaaaaaaaadNbdNbdNbdNbdNbdNbdNbdNbdNbdNbdNbdNbdNbdNbdNbaaaaaadwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCdwCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaclacldAlaaeaaeaaeaaedGEaaeaaeaaeaaeaaeaazaclaclaaaaaaaaaaaaaaaaaaduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJduJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/northern_star/polaris-6.dmm b/maps/northern_star/polaris-6.dmm new file mode 100644 index 0000000000..035ae60e55 --- /dev/null +++ b/maps/northern_star/polaris-6.dmm @@ -0,0 +1,657 @@ +"aa" = (/turf/space,/area/space) +"ab" = (/turf/simulated/wall/golddiamond,/area/casino/casino_ship/wing_left) +"ac" = (/obj/structure/closet/jcloset,/obj/item/weapon/soap/deluxe,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"ad" = (/turf/simulated/wall/golddiamond,/area/casino/casino_ship) +"ae" = (/obj/structure/sink/kitchen{pixel_y = 24},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"af" = (/obj/structure/closet/crate/trashcart,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"ag" = (/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"ah" = (/obj/structure/table/steel,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"ai" = (/obj/structure/shuttle/engine/propulsion{dir = 8},/turf/space,/area/casino/casino_ship/wing_left) +"aj" = (/obj/structure/shuttle/engine/heater{dir = 8},/turf/simulated/wall/golddiamond,/area/casino/casino_ship/wing_left) +"ak" = (/obj/structure/janitorialcart,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"al" = (/obj/machinery/door/window/westleft{req_access = list(160)},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"am" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/blast/shutters{id = "CasinoEmergency2"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor,/area/casino/casino_ship) +"an" = (/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"ao" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/door/blast/shutters{id = "CasinoEmergency2"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor,/area/casino/casino_ship) +"ap" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/flora/ausbushes/reedbush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"aq" = (/obj/machinery/slot_machine,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"ar" = (/turf/simulated/floor/carpet/turcarpet,/area/casino/casino_ship) +"as" = (/obj/structure/wheel_of_fortune,/turf/simulated/floor/carpet/turcarpet,/area/casino/casino_ship) +"at" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/reedbush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"au" = (/turf/simulated/floor/carpet/gaycarpet,/area/casino/casino_ship) +"av" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"aw" = (/turf/simulated/floor/water,/area/casino/casino_ship) +"ax" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/blast/shutters{id = "CasinoEmergency1"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor,/area/casino/casino_ship) +"ay" = (/obj/structure/flora/ausbushes/ppflowers,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/casino/casino_ship) +"az" = (/obj/structure/flora/pottedplant/smalltree,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"aA" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/ywflowers,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/grass,/area/casino/casino_ship) +"aB" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/lavendergrass,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/grass,/area/casino/casino_ship) +"aC" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/pottedplant/decorative,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"aD" = (/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"aE" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"aF" = (/turf/simulated/shuttle/wall/hard_corner,/area/shuttle/casino/ship) +"aG" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"aH" = (/obj/structure/table/wooden_reinforced,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"aI" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"aJ" = (/obj/structure/mopbucket,/obj/item/weapon/mop,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"aK" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"aL" = (/obj/structure/table/wooden_reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"aM" = (/obj/structure/flora/ausbushes/ywflowers,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/casino/casino_ship) +"aN" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"aO" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/ywflowers,/obj/structure/window/reinforced,/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship) +"aP" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"aQ" = (/obj/machinery/door/airlock{name = "Custodial Closet"; req_access = list(26,160)},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"aR" = (/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"aS" = (/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/shuttle/floor/yellow,/area/shuttle/casino/ship) +"aT" = (/obj/structure/bed/chair/shuttle{icon_state = "shuttle_chair"; dir = 8},/turf/simulated/shuttle/floor/yellow,/area/shuttle/casino/ship) +"aU" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 4},/turf/space,/area/shuttle/casino/ship) +"aV" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"aW" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/grass,/area/casino/casino_ship) +"aX" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "casino_shuttle"; pixel_x = 32; tag_door = "casino_shuttle_hatch"},/turf/simulated/shuttle/floor/yellow,/area/shuttle/casino/ship) +"aY" = (/obj/machinery/media/jukebox/casinojukebox{volume = 1},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"aZ" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"ba" = (/obj/structure/flora/pottedplant/orientaltree,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"bb" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/fullgrass,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{id = "CasinoEmergency1"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor,/area/casino/casino_ship) +"bd" = (/obj/structure/casino_table/blackjack_l,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"be" = (/obj/structure/casino_table/blackjack_m{dir = 1},/obj/item/weapon/deck/cards,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"bf" = (/obj/structure/casino_table/blackjack_r,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"bg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/door/blast/shutters{id = "CasinoEmergency1"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor,/area/casino/casino_ship) +"bh" = (/obj/structure/table/marble,/obj/machinery/button/remote/blast_door{id = "Casinoboth"; name = "Both Shutters"; pixel_x = 26; pixel_y = -8; req_one_access = list(200)},/obj/machinery/button/remote/blast_door{id = "Casinoprizes"; name = "Prize Shutters"; pixel_x = 26; pixel_y = 8; req_one_access = list(200)},/obj/machinery/button/remote/blast_door{id = "CasinoEmergency2"; name = "Middle emergency shutters"; pixel_x = 0; pixel_y = 24; req_access = list(160)},/obj/item/weapon/paper_bin{pixel_y = 6},/obj/item/weapon/pen/blue,/obj/item/weapon/folder/red,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"bi" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"bj" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"bk" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/rack,/obj/item/weapon/storage/briefcase/inflatable,/obj/item/weapon/storage/briefcase/inflatable,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"bl" = (/obj/structure/table/rack,/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"bm" = (/obj/structure/bed/chair/comfy/beige{dir = 1},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"bn" = (/obj/structure/table/wooden_reinforced,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"bo" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"bp" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"bq" = (/obj/structure/table/glass,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"br" = (/obj/structure/table/marble,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/blast/shutters{dir = 4; id = "Casinoboth"; layer = 3.2; name = "Exchange booth shutters"},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"bs" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bt" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bu" = (/obj/structure/curtain/open/bed,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"bv" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bw" = (/obj/structure/bed/chair/comfy/beige{dir = 1},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"bx" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering center"; req_access = list(10,160); req_one_access = list()},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"by" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{id = "CasinoEmergency2"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor,/area/casino/casino_ship) +"bz" = (/obj/machinery/door/airlock/silver{name = "Casino crew toilet"; req_one_access = newlist()},/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/cockpit) +"bA" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bB" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/fernybush,/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bC" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/water,/area/casino/casino_ship) +"bD" = (/turf/simulated/shuttle/wall,/area/shuttle/casino/ship) +"bE" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/floor/yellow,/area/shuttle/casino/ship) +"bF" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "casino_shuttle_bay"; name = "shuttle bay controller"; pixel_x = -32; tag_door = "casino_shuttle_bay_airlock"},/turf/simulated/floor/carpet/gaycarpet,/area/casino/casino_ship) +"bG" = (/obj/machinery/recharge_station,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"bH" = (/obj/machinery/computer/shuttle_control{dir = 4; name = "Casino shuttle control console"; shuttle_tag = "Casino"},/turf/simulated/shuttle/floor/yellow,/area/shuttle/casino/ship) +"bI" = (/obj/structure/table/marble,/obj/machinery/door/window/westright{layer = 3.1},/obj/machinery/door/blast/shutters{dir = 4; id = "Casinoboth"; layer = 3.2; name = "Exchange booth shutters"},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"bJ" = (/obj/structure/bed/chair/shuttle{icon_state = "shuttle_chair"; dir = 4},/turf/simulated/shuttle/floor/yellow,/area/shuttle/casino/ship) +"bK" = (/obj/structure/table/gamblingtable,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"bL" = (/obj/structure/flora/pottedplant/smalltree,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"bM" = (/obj/structure/casino_table/roulette_chart,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"bN" = (/obj/structure/casino_table/roulette_table,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"bO" = (/turf/simulated/shuttle/floor/yellow,/area/shuttle/casino/ship) +"bP" = (/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bQ" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/flora/ausbushes/leafybush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bR" = (/obj/structure/flora/pottedplant/minitree,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"bS" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bT" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bU" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bV" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bW" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/leafybush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bX" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bY" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"bZ" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/flora/ausbushes/leafybush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"ca" = (/obj/structure/flora/tree/jungle_small,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cb" = (/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cc" = (/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cd" = (/obj/structure/flora/ausbushes/leafybush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"ce" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cf" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cg" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"ch" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/leafybush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"ci" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cj" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"ck" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cl" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"cm" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/sunnybush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cn" = (/obj/structure/flora/ausbushes/brflowers,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/grass,/area/casino/casino_ship) +"co" = (/obj/structure/flora/tree/palm,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cp" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/flora/tree/palm,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cq" = (/obj/structure/flora/ausbushes/sunnybush,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/grass,/area/casino/casino_ship) +"cr" = (/obj/structure/flora/ausbushes/ywflowers,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/grass,/area/casino/casino_ship) +"cs" = (/obj/structure/flora/ausbushes/ppflowers,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/grass,/area/casino/casino_ship) +"ct" = (/turf/simulated/floor/grass,/area/casino/casino_ship) +"cu" = (/obj/structure/table/marble,/obj/machinery/button/remote/blast_door{id = "CasinoEmergency2"; name = "Middle emergency shutters"; pixel_x = -26; pixel_y = 4; req_access = list(160)},/obj/machinery/button/remote/blast_door{id = "CasinoEmergency1"; name = "Rear emergency shutters"; pixel_x = -26; pixel_y = -4; req_access = list(160)},/obj/machinery/chemical_dispenser/deluxe/full,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"cv" = (/obj/structure/flora/ausbushes/grassybush,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cw" = (/obj/structure/flora/ausbushes/grassybush,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cx" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cy" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cz" = (/obj/structure/flora/ausbushes/ywflowers,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cA" = (/obj/structure/flora/ausbushes/ppflowers,/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cB" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/sunnybush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cC" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cD" = (/obj/structure/flora/ausbushes/reedbush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cE" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/water,/area/casino/casino_ship) +"cF" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/storage/fancy/cigar/havana,/obj/item/weapon/reagent_containers/food/drinks/bottle/snaps,/obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey,/obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing,/obj/item/weapon/reagent_containers/food/drinks/bottle/champagne,/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager,/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,/obj/item/weapon/reagent_containers/food/drinks/bottle/patron,/obj/item/weapon/reagent_containers/food/drinks/bottle/pwine,/obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew,/obj/item/weapon/reagent_containers/food/drinks/golden_cup,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"cG" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/sparsegrass,/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cH" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/ppflowers,/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cI" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/brflowers,/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cJ" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"cK" = (/obj/structure/table/marble,/obj/machinery/door/window/westleft{layer = 3.1},/obj/machinery/door/blast/shutters{dir = 4; id = "Casinoboth"; layer = 3.2; name = "Exchange booth shutters"},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"cL" = (/obj/structure/table/marble,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"cM" = (/obj/item/weapon/storage/secure/safe{pixel_x = 35},/obj/structure/bed/chair/office/dark{dir = 8},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"cN" = (/obj/machinery/door/airlock/silver{name = "Casino crew bathrooms"; req_one_access = newlist()},/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/cockpit) +"cO" = (/obj/structure/flora/ausbushes/grassybush,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship) +"cP" = (/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/drinks/shaker{pixel_x = 6},/obj/item/weapon/reagent_containers/glass/beaker/noreact{pixel_x = -6},/obj/item/weapon/reagent_containers/glass/rag,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"cQ" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/item/clothing/suit/armor/alien,/obj/item/weapon/storage/belt/utility/alien,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"cR" = (/obj/machinery/vending/deluxe_dinner,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"cS" = (/obj/structure/table/marble,/obj/machinery/door/blast/shutters{id = "Casinobar"; layer = 3.1; name = "Casino bar shutter"},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"cT" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/reagent_containers/glass/beaker/bluespace,/obj/item/weapon/reagent_containers/glass/beaker/noreact,/obj/item/weapon/surgical/scalpel/manager,/obj/item/weapon/weldingtool/experimental,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"cU" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/weapon/gun/energy/frontier,/obj/item/weapon/gun/energy/floragun,/obj/item/weapon/gun/energy/alien,/obj/item/weapon/gun/energy/temperature,/obj/item/weapon/gun/energy/particle/cannon,/obj/item/weapon/gun/energy/particle/advanced,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"cV" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/item/weapon/melee/chainofcommand,/obj/item/weapon/melee/fluffstuff/awoosword,/obj/item/weapon/scepter,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"cW" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"cX" = (/obj/structure/window/reinforced,/obj/structure/flora/pottedplant/decorative,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"cY" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"cZ" = (/obj/structure/table/wooden_reinforced,/obj/structure/window/reinforced,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"da" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"db" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"dc" = (/obj/machinery/door/airlock/silver{name = "Casino crew showers"},/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/cockpit) +"dd" = (/obj/structure/table/marble,/obj/machinery/door/blast/shutters{dir = 4; id = "Casinobar"; layer = 3.1; name = "Casino bar shutter"},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"de" = (/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "casino_shuttle_bay_airlock"; locked = 1; name = "Casino Shuttle Bay Airlock"},/turf/simulated/floor/carpet/gaycarpet,/area/casino/casino_ship) +"df" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/reedbush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"dg" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/grass,/area/casino/casino_ship) +"dh" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/sunnybush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"di" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/reedbush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"dj" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/ywflowers,/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship) +"dk" = (/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "casino_shuttle_hatch"; locked = 1; name = "Casino Shuttle Airlock"},/turf/simulated/shuttle/floor/yellow,/area/shuttle/casino/ship) +"dl" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"dm" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"dn" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"do" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"dp" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/flora/ausbushes/genericbush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"dq" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/lavendergrass,/turf/simulated/floor/grass,/area/casino/casino_ship) +"dr" = (/obj/structure/window/reinforced,/turf/simulated/floor/water,/area/casino/casino_ship) +"ds" = (/obj/machinery/recharge_station,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"dt" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"du" = (/turf/simulated/wall/golddiamond,/area/casino/casino_ship/dorms) +"dv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor,/area/casino/casino_ship/dorms) +"dw" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/genericbush,/turf/simulated/floor/grass,/area/casino/casino_ship) +"dx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor,/area/casino/casino_ship/dorms) +"dy" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor,/area/casino/casino_ship/dorms) +"dz" = (/turf/simulated/wall/golddiamond,/area/casino/casino_ship/cockpit) +"dA" = (/obj/machinery/button/remote/blast_door{id = "CasinoEmergency1"; name = "Rear emergency shutters"; pixel_x = -26; pixel_y = -4; req_access = list(160)},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"dB" = (/obj/structure/table/standard,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship/cockpit) +"dC" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/obj/item/weapon/book/manual/casino,/turf/simulated/shuttle/floor/yellow,/area/shuttle/casino/ship) +"dD" = (/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"dE" = (/obj/structure/bed/chair/comfy/purp{dir = 4},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"dF" = (/obj/structure/table/glass,/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"dG" = (/obj/structure/bed/chair/comfy/purp{dir = 8},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"dH" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"dI" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"dJ" = (/obj/structure/closet/secure_closet/engineering_personal,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"dK" = (/obj/structure/closet/secure_closet/engineering_welding,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"dL" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"dM" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"dN" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/hosdouble,/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"dO" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/rack,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/structure/window/reinforced,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"dP" = (/obj/structure/window/reinforced,/obj/structure/table/rack,/obj/item/clothing/suit/space/emergency,/obj/item/clothing/suit/space/emergency,/obj/item/clothing/suit/space/emergency,/obj/item/clothing/suit/space/emergency,/obj/item/clothing/suit/space/emergency,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"dQ" = (/obj/structure/window/reinforced,/obj/structure/table/rack,/obj/item/clothing/mask/breath/emergency,/obj/item/clothing/mask/breath/emergency,/obj/item/clothing/mask/breath/emergency,/obj/item/clothing/mask/breath/emergency,/obj/item/clothing/mask/breath/emergency,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"dR" = (/obj/structure/table/marble,/obj/item/device/encryptionkey/headset_service,/obj/item/device/encryptionkey/headset_service,/obj/item/device/encryptionkey/headset_service,/obj/item/device/encryptionkey/headset_service,/obj/item/device/encryptionkey/headset_service,/obj/item/device/encryptionkey/headset_service,/obj/item/device/encryptionkey/headset_service,/obj/item/device/encryptionkey/headset_service,/obj/item/device/encryptionkey/headset_service,/obj/item/device/encryptionkey/headset_service,/obj/item/device/encryptionkey/headset_service,/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship/cockpit) +"dS" = (/obj/structure/table/marble,/obj/machinery/button/remote/blast_door{id = "Casinoboth"; name = "Both Shutters"; pixel_x = 26; pixel_y = 8; req_one_access = list(200)},/obj/machinery/button/remote/blast_door{id = "Casinoprizes"; name = "Prize Shutters"; pixel_x = 26; pixel_y = -8; req_one_access = list(200)},/obj/machinery/button/remote/blast_door{id = "CasinoEmergency2"; name = "Middle emergency shutters"; pixel_x = 0; pixel_y = -24; req_access = list(160)},/obj/item/weapon/paper_bin{pixel_y = 6},/obj/item/weapon/pen/blue,/obj/item/weapon/folder/red,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/obj/item/weapon/spacecasinocash/c1000,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"dT" = (/obj/structure/window/reinforced,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"dU" = (/obj/machinery/door/airlock/silver{name = "Casino manager bathroom"; req_one_access = newlist()},/turf/simulated/floor/tiled,/area/casino/casino_ship/cockpit) +"dV" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/sizegun,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"dW" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"dX" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/toy/ammo/crossbow,/obj/item/toy/ammo/crossbow,/obj/item/toy/ammo/crossbow,/obj/item/toy/ammo/crossbow,/obj/item/toy/ammo/crossbow,/obj/item/clothing/under/sexybunny_black,/obj/item/clothing/under/sexybunny_white,/obj/item/clothing/head/collectable/rabbitears,/obj/item/clothing/head/collectable/rabbitears,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"dY" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/effect/landmark/costume/chicken,/obj/effect/landmark/costume/fakewizard,/obj/effect/landmark/costume/nyangirl,/obj/effect/landmark/costume/sexyclown,/obj/item/clothing/head/ian_hood,/obj/item/clothing/suit/storage/hooded/ian_costume,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"dZ" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"ea" = (/obj/machinery/vending/snack,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"eb" = (/obj/machinery/vending/cola,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"ec" = (/obj/machinery/vending/coffee,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"ed" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"ee" = (/obj/structure/bed/chair/comfy/purp{dir = 4},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"ef" = (/obj/structure/bed/chair/comfy/purp{dir = 8},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"eg" = (/obj/structure/window/reinforced,/obj/structure/table/rack,/obj/item/clothing/head/helmet/space/emergency,/obj/item/clothing/head/helmet/space/emergency,/obj/item/clothing/head/helmet/space/emergency,/obj/item/clothing/head/helmet/space/emergency,/obj/item/clothing/head/helmet/space/emergency,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"eh" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"ei" = (/obj/structure/closet,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship/cockpit) +"ej" = (/obj/structure/table/standard,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship/cockpit) +"ek" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship/cockpit) +"el" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = 0; pixel_y = 0},/obj/machinery/door/window/westleft{name = "shower door"},/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/cockpit) +"em" = (/obj/machinery/vending/tool,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"en" = (/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship/cockpit) +"eo" = (/obj/structure/table/reinforced,/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/machinery/cell_charger,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"ep" = (/obj/structure/table/reinforced,/obj/item/stack/material/glass{amount = 50; pixel_x = -2; pixel_y = 2},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/plastic{amount = 50},/obj/item/stack/material/wood{amount = 50},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"eq" = (/obj/machinery/autolathe,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"er" = (/obj/machinery/vending/engivend,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"es" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/dorms) +"et" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/dorms) +"eu" = (/obj/structure/table/glass,/obj/machinery/button/remote/airlock{id = "casinodorm1"; name = "door lock"; specialfunctions = 4; pixel_x = 24},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"ev" = (/obj/structure/table/glass,/obj/machinery/button/remote/airlock{id = "casinodorm2"; name = "door lock"; specialfunctions = 4; pixel_x = 24},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"ew" = (/obj/structure/table/glass,/obj/machinery/button/remote/airlock{id = "casinodorm3"; name = "door lock"; specialfunctions = 4; pixel_x = 24},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"ex" = (/obj/structure/table/glass,/obj/machinery/button/remote/airlock{id = "casinodorm4"; name = "door lock"; specialfunctions = 4; pixel_x = 24},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"ey" = (/obj/structure/table/glass,/obj/machinery/button/remote/airlock{id = "casinodorm5"; name = "door lock"; specialfunctions = 4; pixel_x = 24},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"ez" = (/obj/structure/bed/chair/comfy/purp,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship/cockpit) +"eA" = (/obj/structure/toilet,/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/cockpit) +"eB" = (/obj/structure/closet/secure_closet/paramedic,/turf/simulated/floor/tiled/white,/area/casino/casino_ship/wing_left) +"eC" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/tiled/white,/area/casino/casino_ship/wing_left) +"eD" = (/obj/machinery/vending/medical,/turf/simulated/floor/tiled/white,/area/casino/casino_ship/wing_left) +"eE" = (/obj/structure/table/glass,/obj/machinery/recharger,/turf/simulated/floor/tiled/white,/area/casino/casino_ship/wing_left) +"eF" = (/obj/item/device/defib_kit,/turf/simulated/floor/tiled/white,/area/casino/casino_ship/wing_left) +"eG" = (/obj/machinery/door/airlock/glass_medical{name = "Medbay"; req_access = list(5,160); req_one_access = list()},/turf/simulated/floor/tiled/white,/area/casino/casino_ship/wing_left) +"eH" = (/obj/machinery/door/airlock/multi_tile/glass{dir = 2; name = "Casino Airlock"},/turf/simulated/floor/carpet/gaycarpet,/area/casino/casino_ship) +"eI" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/window/reinforced{dir = 1},/obj/structure/curtain/open/shower/engineering,/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/dorms) +"eJ" = (/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/dorms) +"eK" = (/obj/machinery/door/airlock/multi_tile/metal{name = "Medical, Engineering, Janitor and EVA"; req_one_access = list(160)},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"eL" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"eM" = (/obj/structure/table/wooden_reinforced,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship/cockpit) +"eN" = (/obj/machinery/door/airlock/silver{name = "Lap dance room 1-2"},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"eO" = (/obj/structure/closet/secure_closet/medical_wall{name = "O- Blood Locker"; pixel_x = -32},/turf/simulated/floor/tiled/white,/area/casino/casino_ship/wing_left) +"eP" = (/turf/simulated/floor/tiled/white,/area/casino/casino_ship/wing_left) +"eQ" = (/obj/machinery/door/airlock/silver{id_tag = "casinodorm1"; name = "Dorm room 1"},/turf/simulated/floor/wood,/area/casino/casino_ship/dorms) +"eR" = (/obj/machinery/door/airlock/silver{id_tag = "casinodorm2"; name = "Dorm room 2"},/turf/simulated/floor/wood,/area/casino/casino_ship/dorms) +"eS" = (/obj/machinery/door/airlock/silver{id_tag = "casinodorm3"; name = "Dorm room 4"},/turf/simulated/floor/wood,/area/casino/casino_ship/dorms) +"eT" = (/obj/machinery/door/airlock/silver{id_tag = "casinodorm4"; name = "Dorm room 4"},/turf/simulated/floor/wood,/area/casino/casino_ship/dorms) +"eU" = (/obj/machinery/door/airlock/silver{id_tag = "casinodorm5"; name = "Dorm room 5"},/turf/simulated/floor/wood,/area/casino/casino_ship/dorms) +"eV" = (/obj/structure/bed/chair/comfy/purp{dir = 1},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship/cockpit) +"eW" = (/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/cockpit) +"eX" = (/obj/machinery/shower{pixel_y = 8},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/cockpit) +"eY" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/northleft{layer = 2.9; name = "EVA suit storage"; req_access = list(5)},/obj/item/device/suit_cooling_unit,/obj/item/weapon/rig/medical/equipped,/obj/item/weapon/tank/oxygen,/turf/simulated/floor/tiled/white,/area/casino/casino_ship/wing_left) +"eZ" = (/obj/structure/table/glass,/obj/machinery/cell_charger,/turf/simulated/floor/tiled/white,/area/casino/casino_ship/wing_left) +"fa" = (/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/o2{pixel_x = 8; pixel_y = 8},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/adv{pixel_x = -4; pixel_y = -4},/turf/simulated/floor/tiled/white,/area/casino/casino_ship/wing_left) +"fb" = (/obj/machinery/iv_drip,/turf/simulated/floor/tiled/white,/area/casino/casino_ship/wing_left) +"fc" = (/obj/machinery/sleep_console{dir = 4},/turf/simulated/floor/tiled/white,/area/casino/casino_ship/wing_left) +"fd" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/floor/tiled/white,/area/casino/casino_ship/wing_left) +"fe" = (/obj/structure/table/glass,/obj/item/weapon/soap,/obj/item/weapon/soap,/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/cockpit) +"ff" = (/obj/structure/flora/pottedplant/fern,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship/cockpit) +"fg" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/cockpit) +"fh" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/cockpit) +"fi" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/cockpit) +"fj" = (/obj/machinery/door/airlock/silver{name = "Casino crew breakroom"; req_one_access = list(160)},/turf/simulated/floor/tiled,/area/casino/casino_ship/cockpit) +"fk" = (/obj/structure/flora/pottedplant/minitree,/turf/simulated/floor/carpet/gaycarpet,/area/casino/casino_ship/cockpit) +"fl" = (/turf/simulated/floor/carpet/gaycarpet,/area/casino/casino_ship/cockpit) +"fm" = (/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) +"fn" = (/obj/structure/flora/pottedplant/crystal,/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) +"fo" = (/obj/structure/table/bench/marble,/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) +"fp" = (/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship/cockpit) +"fq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor,/area/casino/casino_ship/cockpit) +"fr" = (/obj/structure/flora/ausbushes/brflowers,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fs" = (/obj/structure/flora/ausbushes/ppflowers,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"ft" = (/obj/structure/flora/ausbushes/reedbush,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fu" = (/obj/structure/flora/ausbushes/brflowers,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fv" = (/obj/structure/flora/ausbushes/ywflowers,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fw" = (/obj/structure/flora/ausbushes/genericbush,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fx" = (/obj/structure/flora/ausbushes/ppflowers,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor,/area/casino/casino_ship/cockpit) +"fz" = (/obj/machinery/door/airlock/silver{name = "Bathroom"},/turf/simulated/floor/wood,/area/casino/casino_ship/dorms) +"fA" = (/obj/structure/flora/ausbushes/genericbush,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fB" = (/turf/simulated/floor/water,/area/casino/casino_ship/cockpit) +"fC" = (/obj/structure/flora/tree/jungle_small,/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fD" = (/obj/structure/flora/ausbushes/fernybush,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fE" = (/obj/structure/bed/chair/comfy/red{dir = 4},/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship/cockpit) +"fF" = (/obj/machinery/computer/shuttle_control{name = "Casino ship control console"},/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) +"fG" = (/obj/structure/flora/ausbushes/ywflowers,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fH" = (/obj/structure/flora/ausbushes/fernybush,/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fI" = (/obj/structure/flora/ausbushes/brflowers,/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fJ" = (/obj/structure/flora/ausbushes/ywflowers,/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fK" = (/obj/structure/flora/ausbushes/ppflowers,/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fL" = (/obj/structure/flora/ausbushes/reedbush,/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fM" = (/obj/structure/flora/ausbushes/brflowers,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/grass,/area/casino/casino_ship/cockpit) +"fN" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor,/area/casino/casino_ship/cockpit) +"fO" = (/turf/simulated/wall/golddiamond,/area/casino/casino_ship/wing_right) +"fP" = (/obj/structure/table/glass,/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) +"fQ" = (/obj/item/weapon/gun/energy/gun/fluff/dominator{emagged = 1},/obj/structure/table/marble,/obj/item/clothing/accessory/holster/armpit,/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship/cockpit) +"fR" = (/obj/structure/sink{pixel_x = 16; pixel_y = 24},/obj/structure/toilet{dir = 4},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"fS" = (/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"fT" = (/obj/machinery/door/airlock/security,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"fU" = (/obj/structure/sink{pixel_x = -16; pixel_y = 24},/obj/structure/toilet{dir = 8},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"fV" = (/obj/structure/table/reinforced,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"fW" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"fX" = (/obj/machinery/door/airlock/silver{name = "Bar"; req_access = list(25,160)},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"fY" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) +"fZ" = (/obj/structure/toilet{dir = 8},/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/cockpit) +"ga" = (/obj/structure/shuttle/engine/propulsion{dir = 8},/turf/space,/area/casino/casino_ship/wing_right) +"gb" = (/obj/structure/shuttle/engine/heater{dir = 8},/turf/simulated/wall/golddiamond,/area/casino/casino_ship/wing_right) +"gc" = (/obj/structure/bed,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"gd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor,/area/casino/casino_ship/wing_right) +"ge" = (/obj/machinery/door/airlock/silver{id_tag = "casinodorm6"; name = "Dorm room 6"},/turf/simulated/floor/wood,/area/casino/casino_ship/dorms) +"gf" = (/obj/machinery/door/airlock/silver{id_tag = "casinodorm7"; name = "Dorm room 7"},/turf/simulated/floor/wood,/area/casino/casino_ship/dorms) +"gg" = (/obj/machinery/door/airlock/silver{id_tag = "casinodorm8"; name = "Dorm room 8"},/turf/simulated/floor/wood,/area/casino/casino_ship/dorms) +"gh" = (/obj/machinery/door/airlock/silver{id_tag = "casinodorm9"; name = "Dorm room 9"},/turf/simulated/floor/wood,/area/casino/casino_ship/dorms) +"gi" = (/obj/machinery/door/airlock/silver{id_tag = "casinodorm10"; name = "Dorm room 10"},/turf/simulated/floor/wood,/area/casino/casino_ship/dorms) +"gj" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) +"gk" = (/obj/structure/bed/chair/comfy/purp{dir = 8},/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) +"gl" = (/obj/machinery/door/airlock/security{req_access = list(1,160); req_one_access = list()},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"gm" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower/engineering,/obj/structure/window/reinforced,/turf/simulated/floor/tiled/freezer,/area/casino/casino_ship/dorms) +"gn" = (/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship/cockpit) +"go" = (/obj/structure/flora/ausbushes/pointybush,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/casino/casino_ship) +"gp" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"gq" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"gr" = (/obj/structure/bed/chair/comfy/purp{dir = 1},/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) +"gs" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/casino/casino_ship) +"gt" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/ywflowers,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/grass,/area/casino/casino_ship) +"gu" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/ppflowers,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/grass,/area/casino/casino_ship) +"gv" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/fullgrass,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/casino/casino_ship) +"gw" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/ywflowers,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/casino/casino_ship) +"gx" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/water,/area/casino/casino_ship) +"gy" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/fernybush,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/casino/casino_ship) +"gz" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/reedbush,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/casino/casino_ship) +"gA" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/brflowers,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/casino/casino_ship) +"gB" = (/obj/structure/window/reinforced,/obj/structure/flora/ausbushes/ppflowers,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/grass,/area/casino/casino_ship) +"gC" = (/obj/structure/flora/pottedplant/decorative,/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) +"gD" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/laundry_basket,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"gE" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_y = 10},/obj/item/weapon/pen,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"gF" = (/obj/machinery/vending/coffee,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"gG" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"gH" = (/obj/structure/table/glass,/obj/machinery/button/remote/airlock{id = "casinodorm6"; name = "door lock"; specialfunctions = 4; pixel_x = 24},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"gI" = (/obj/structure/table/glass,/obj/machinery/button/remote/airlock{id = "casinodorm7"; name = "door lock"; specialfunctions = 4; pixel_x = 24},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"gJ" = (/obj/structure/table/glass,/obj/machinery/button/remote/airlock{id = "casinodorm8"; name = "door lock"; specialfunctions = 4; pixel_x = 24},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"gK" = (/obj/structure/table/glass,/obj/machinery/button/remote/airlock{id = "casinodorm9"; name = "door lock"; specialfunctions = 4; pixel_x = 24},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"gL" = (/obj/structure/table/glass,/obj/machinery/button/remote/airlock{id = "casinodorm10"; name = "door lock"; specialfunctions = 4; pixel_x = 24},/turf/simulated/floor/carpet/bcarpet,/area/casino/casino_ship/dorms) +"gM" = (/obj/item/weapon/book/manual/casino,/obj/structure/table/marble,/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship/cockpit) +"gN" = (/obj/structure/flora/pottedplant/flower,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship/cockpit) +"gO" = (/obj/structure/bed/double/padded,/obj/item/weapon/bedsheet/cedouble,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship/cockpit) +"gP" = (/obj/structure/table/glass,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship/cockpit) +"gQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor,/area/casino/casino_ship/cockpit) +"gR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor,/area/casino/casino_ship/wing_right) +"gS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor,/area/casino/casino_ship/wing_right) +"gT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/blast/shutters{dir = 8; id = "CasinoEmergency1"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor/plating,/area/casino/casino_ship) +"gU" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship/cockpit) +"gV" = (/obj/structure/flora/pottedplant/fern,/turf/simulated/floor/carpet/gaycarpet,/area/casino/casino_ship) +"gW" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/item/device/nif/authentic,/obj/item/device/nif/authentic,/obj/item/device/nif/authentic,/obj/item/device/nif/authentic,/obj/item/device/nif/authentic,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"gX" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/item/clothing/accessory/locket/star,/obj/item/clothing/accessory/chameleon,/obj/item/clothing/glasses/monocoole,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"gY" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/item/clothing/mask/chameleon,/obj/item/clothing/mask/demon,/obj/item/clothing/mask/dolphin,/obj/item/clothing/mask/fakemoustache,/obj/item/clothing/mask/goblin,/obj/item/clothing/mask/horsehead,/obj/item/clothing/mask/luchador,/obj/item/clothing/mask/pig,/obj/item/clothing/mask/shark,/obj/item/clothing/head/soft/purple/wah,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"gZ" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/effect/landmark/costume/commie,/obj/effect/landmark/costume/gladiator,/obj/effect/landmark/costume/pirate,/obj/effect/landmark/costume/sexymime,/obj/item/clothing/suit/storage/hooded/carp_costume,/obj/item/clothing/head/carp_hood,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"ha" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/effect/landmark/costume/cutewitch,/obj/effect/landmark/costume/imperium_monk,/obj/effect/landmark/costume/plaguedoctor,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"hb" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/toy/bosunwhistle,/obj/item/toy/crossbow,/obj/item/toy/cultsword,/obj/item/toy/eight_ball,/obj/item/toy/eight_ball/conch,/obj/item/toy/katana,/obj/item/toy/stickhorse,/obj/item/toy/waterflower,/obj/item/toy/sword,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"hc" = (/obj/machinery/door/airlock/silver{req_access = list(160)},/turf/simulated/shuttle/floor/yellow,/area/shuttle/casino/ship) +"hd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/blast/shutters{id = "Casinoprizes"; layer = 3.3; name = "Prize shutters"},/turf/simulated/floor,/area/casino/casino_ship) +"he" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{id = "Casinoprizes"; layer = 3.3; name = "Prize shutters"},/turf/simulated/floor,/area/casino/casino_ship) +"hf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/door/blast/shutters{id = "Casinoprizes"; layer = 3.3; name = "Prize shutters"},/turf/simulated/floor,/area/casino/casino_ship) +"hg" = (/obj/machinery/door/window/southright,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"hh" = (/obj/machinery/door/window/northleft,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"hi" = (/obj/structure/table/gamblingtable,/obj/structure/stripper_pole,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"hj" = (/obj/structure/casino_table/blackjack_l{dir = 1},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"hk" = (/obj/machinery/computer/card{icon_state = "computer"; dir = 4},/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship/cockpit) +"hl" = (/obj/structure/casino_table/blackjack_r{dir = 1},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"hm" = (/obj/structure/casino_table/blackjack_m,/obj/item/weapon/deck/cards,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"hn" = (/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"ho" = (/obj/structure/table/reinforced,/obj/item/device/taperecorder,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hp" = (/obj/structure/bed/chair/office/light{dir = 8},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/plating,/area/casino/casino_ship/wing_right) +"hr" = (/obj/structure/bed/chair/office/light{dir = 4},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hs" = (/obj/structure/table/standard,/obj/item/weapon/material/ashtray,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"ht" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hu" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hv" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/plating,/area/casino/casino_ship/wing_right) +"hx" = (/obj/machinery/recharger/wallcharger{pixel_x = 32},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hy" = (/obj/structure/flora/pottedplant/fern,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hz" = (/obj/machinery/door/airlock/silver{id_tag = "managerdoor"; name = "Casino manager office"; req_one_access = list(300)},/turf/simulated/floor/tiled,/area/casino/casino_ship/cockpit) +"hA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor,/area/casino/casino_ship/cockpit) +"hB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor,/area/casino/casino_ship/cockpit) +"hC" = (/obj/machinery/door/airlock/silver{name = "General storage"; req_access = list(160)},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"hD" = (/obj/machinery/door/airlock/silver{name = "Casino crew private area"; req_access = list(160)},/turf/simulated/floor/carpet/gaycarpet,/area/casino/casino_ship/cockpit) +"hE" = (/obj/machinery/suit_cycler/security,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hF" = (/obj/machinery/door/airlock/silver{name = "Casino cockpit"; req_one_access = list(300)},/turf/simulated/floor/tiled,/area/casino/casino_ship/cockpit) +"hG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/blast/shutters{dir = 8; id = "CasinoEmergency1"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor/plating,/area/casino/casino_ship) +"hH" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hI" = (/obj/structure/table/standard,/obj/item/weapon/material/ashtray,/obj/item/weapon/material/ashtray,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hJ" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donut,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hK" = (/obj/structure/table/standard,/obj/item/weapon/material/ashtray,/obj/machinery/recharger,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hL" = (/obj/machinery/vending/security,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hM" = (/obj/machinery/door/airlock/silver{name = "Lap dance room 3-4"},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"hN" = (/obj/structure/table/marble,/obj/machinery/button/remote/airlock{id = "managerdoor"; pixel_x = 8; pixel_y = -2},/turf/simulated/floor/carpet/oracarpet,/area/casino/casino_ship/cockpit) +"hO" = (/obj/structure/table/reinforced,/obj/machinery/recharger,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hQ" = (/obj/machinery/door/airlock/security{name = "Cell 1"; req_access = list(1,160); req_one_access = list()},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hR" = (/obj/machinery/button/remote/blast_door{id = "Casinobar"; name = "Bar Shutters"; pixel_x = -26; pixel_y = 0; req_access = list(25,160)},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"hS" = (/obj/machinery/door/airlock/security{name = "Cell 2"; req_access = list(1,160); req_one_access = list()},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hT" = (/obj/machinery/door/airlock/silver{name = "Casino manager sleeping quarters"; req_one_access = list(300)},/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) +"hU" = (/obj/machinery/door/airlock/security{name = "Holding cells"; req_access = list(1,160); req_one_access = list()},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hV" = (/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access = list(2,160); req_one_access = list()},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hW" = (/obj/machinery/door/airlock/security{name = "Evidence room"; req_access = list(1,160); req_one_access = list()},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hX" = (/obj/machinery/door/airlock/security{name = "Interrogation room"; req_access = list(1,160); req_one_access = list()},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hY" = (/obj/machinery/door/airlock/multi_tile/glass{dir = 2; name = "Security wing"},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"hZ" = (/obj/machinery/recharge_station,/turf/simulated/floor/carpet/gaycarpet,/area/casino/casino_ship) +"ib" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/brigdoor/southright{layer = 2.9; req_access = list(2,160)},/obj/item/clothing/gloves/arm_guard/combat,/obj/item/clothing/gloves/arm_guard/combat,/obj/item/clothing/head/helmet/combat,/obj/item/clothing/head/helmet/combat,/obj/item/clothing/shoes/leg_guard/combat,/obj/item/clothing/shoes/leg_guard/combat,/obj/item/clothing/suit/armor/combat,/obj/item/clothing/suit/armor/combat,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"ic" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/door/window/brigdoor/southleft{layer = 2.9; req_access = list(2,160)},/obj/item/clothing/gloves/arm_guard/combat,/obj/item/clothing/gloves/arm_guard/combat,/obj/item/clothing/head/helmet/combat,/obj/item/clothing/head/helmet/combat,/obj/item/clothing/shoes/leg_guard/combat,/obj/item/clothing/shoes/leg_guard/combat,/obj/item/clothing/suit/armor/combat,/obj/item/clothing/suit/armor/combat,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"id" = (/obj/machinery/door/airlock/security{name = "Combat Equipment Storage"; req_access = list(2,160); req_one_access = list()},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"ie" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/brigdoor/northright{req_access = list(2,160)},/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"if" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/door/window/brigdoor/northleft{req_access = list(2,160)},/obj/item/weapon/gun/energy/ionrifle,/obj/item/weapon/gun/energy/ionrifle,/obj/item/weapon/gun/energy/plasmastun,/obj/item/weapon/gun/energy/plasmastun,/obj/item/weapon/gun/energy/gun/burst,/obj/item/weapon/gun/energy/gun/burst,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"ig" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/brigdoor/northright{req_access = list(2,160)},/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/garand,/obj/item/weapon/gun/projectile/garand,/obj/item/weapon/gun/projectile/automatic/p90,/obj/item/weapon/gun/projectile/automatic/p90,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"ih" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/door/window/brigdoor/northleft{req_access = list(2,160)},/obj/item/weapon/storage/box/empshells,/obj/item/weapon/storage/box/shotgunshells/large,/obj/item/weapon/storage/box/shotgunshells/large,/obj/item/weapon/storage/box/shotgunammo/large,/obj/item/weapon/storage/box/shotgunammo/large,/obj/item/ammo_magazine/m762garand,/obj/item/ammo_magazine/m762garand,/obj/item/ammo_magazine/m762garand,/obj/item/ammo_magazine/m762garand,/obj/item/ammo_magazine/m762garand,/obj/item/ammo_magazine/m762garand,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"ii" = (/obj/machinery/door/airlock/silver{name = "Prize storage"; req_one_access = list(200)},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"ij" = (/obj/structure/table/marble,/obj/machinery/door/blast/shutters{dir = 2; id = "Casinobar"; layer = 3.1; name = "Casino bar shutter"},/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"ik" = (/obj/machinery/photocopier{toner = 90},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"il" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/blast/shutters{dir = 8; id = "CasinoEmergency1"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor/plating,/area/casino/casino_ship) +"im" = (/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "CasinoEmergency1"; name = "Rear emergency shutters"; pixel_x = -26; pixel_y = -4; req_access = list(160)},/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"in" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/blast/shutters{dir = 2; id = "CasinoEmergency1"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor,/area/casino/casino_ship) +"io" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{dir = 2; id = "CasinoEmergency1"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor,/area/casino/casino_ship) +"ip" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/door/blast/shutters{dir = 2; id = "CasinoEmergency1"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor,/area/casino/casino_ship) +"iq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/blast/shutters{dir = 2; id = "CasinoEmergency2"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor,/area/casino/casino_ship) +"ir" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{dir = 2; id = "CasinoEmergency2"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor,/area/casino/casino_ship) +"is" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/door/blast/shutters{dir = 2; id = "CasinoEmergency2"; layer = 3.5; name = "Casino emergency shutter"},/turf/simulated/floor,/area/casino/casino_ship) +"it" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/brigdoor/southright{layer = 2.9; req_access = list(2,160)},/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/security,/obj/item/clothing/suit/space/void/security,/obj/item/clothing/head/helmet/space/void/security,/obj/item/clothing/head/helmet/space/void/security,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"iu" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/door/window/brigdoor/southleft{layer = 2.9; req_access = list(2,160)},/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/security,/obj/item/clothing/suit/space/void/security,/obj/item/clothing/head/helmet/space/void/security,/obj/item/clothing/head/helmet/space/void/security,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"iv" = (/obj/machinery/recharge_station,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_right) +"iw" = (/obj/structure/table/reinforced,/obj/item/weapon/deck/cards{pixel_x = -8},/obj/item/weapon/deck/cards,/obj/item/weapon/deck/cards{pixel_x = 8},/obj/item/weapon/deck/cards{pixel_x = -8; pixel_y = 8},/obj/item/weapon/deck/cards{pixel_y = 8},/obj/item/weapon/deck/cards{pixel_x = 8; pixel_y = 8},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"ix" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/dicecup{pixel_x = -8},/obj/item/weapon/storage/dicecup,/obj/item/weapon/storage/dicecup{pixel_x = 8},/obj/item/weapon/storage/dicecup{pixel_x = -8; pixel_y = 8},/obj/item/weapon/storage/dicecup{pixel_y = 8},/obj/item/weapon/storage/dicecup{pixel_x = 8; pixel_y = 8},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"iy" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/pill_bottle/dice{pixel_x = -8; pixel_y = -8},/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/storage/pill_bottle/dice{pixel_x = 8; pixel_y = 8},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"iz" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/pill_bottle/dice_nerd{pixel_x = -8; pixel_y = -8},/obj/item/weapon/storage/pill_bottle/dice_nerd,/obj/item/weapon/storage/pill_bottle/dice_nerd{pixel_x = 8; pixel_y = 8},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"iA" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = -8},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 8},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"iB" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid{pixel_x = -8},/obj/item/weapon/storage/firstaid{pixel_x = 8},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"iC" = (/obj/structure/table/reinforced,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/material/ashtray/bronze,/obj/machinery/recharger,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"iD" = (/obj/machinery/washing_machine,/turf/simulated/floor/tiled,/area/casino/casino_ship/wing_left) +"iE" = (/obj/machinery/atm{pixel_y = 32},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"iF" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_y = 6},/obj/item/weapon/pen/blue,/obj/item/weapon/pen/blue{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/blue{pixel_x = 8; pixel_y = 8},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"iG" = (/obj/structure/table/reinforced,/obj/item/weapon/wrapping_paper{pixel_x = 4; pixel_y = -4},/obj/item/weapon/wrapping_paper,/obj/item/weapon/wrapping_paper{pixel_x = -4; pixel_y = 4},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"iH" = (/obj/machinery/atm{pixel_y = -32},/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"iI" = (/obj/structure/table/reinforced,/obj/item/weapon/packageWrap{pixel_x = 4; pixel_y = -4},/obj/item/weapon/packageWrap{pixel_x = -4; pixel_y = 4},/obj/item/weapon/packageWrap,/turf/simulated/floor/carpet/blucarpet,/area/casino/casino_ship) +"iJ" = (/obj/structure/closet/secure_closet{req_one_access = list(300)},/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) +"iL" = (/obj/machinery/vending/deluxe_boozeomat,/turf/simulated/floor/carpet/purcarpet,/area/casino/casino_ship) +"iM" = (/obj/structure/safe{req_one_access = list(300)},/obj/fiftyspawner/diamond,/obj/fiftyspawner/gold,/obj/fiftyspawner/gold,/obj/fiftyspawner/silver,/obj/fiftyspawner/silver,/obj/item/weapon/moneybag/vault,/obj/item/weapon/moneybag/vault,/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) +"iN" = (/obj/structure/table/glass,/obj/machinery/recharger,/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) +"iO" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/turf/simulated/floor/wood,/area/casino/casino_ship/cockpit) + +(1,1,1) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacaeafagahabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiajabakaDaDaDaIabaDbGabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiajabiDaJaDaDaDaQaDaDbkblcJdlababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadudvdxdxdxdydudvdxdxdxdydudvdxdxdxdydudvdxdxdxdydudvdxdxdxdydudzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiajabababababababaDaDalaDaDaDabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadamaodudDdDdEdFdGdudDdDdEdFdGdudDdDdEdFdGdudDdDdEdFdGdudDdDdEdFdGdudzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiajabaDaDaDaDaDabaDaDdHaDaDaDabdIdJdKdLdMabadaxbcbcbcbgadaxbcbcbcbgadadadambybybyaoadambybybyaoadadadambybyaoadambyaoadambybyaoadbUccdudNdDdDdDdDdudNdDdDdDdDdudNdDdDdDdDdudNdDdDdDdDdudNdDdDdDdDdudzdzdzdzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaDaDaDaDaDabaDaDdOdPdQegabaDaDaDaDehabazanananananazanananananazadazanananananiEanananananandZbaaqaqaqbaanarasaranbaaqaqaqbabScodudFdDdDdDdDdudFdDdDdDdDdudFdDdDdDdDdudFdDdDdDdDdudFdDdDdDdDdueieidBejekdzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiajabaDaDaDaDaDabdAaDaDaDaDaDbxaDaDaDaDemabanauauauauauauauauauauauauauauauauauauauauauauauauauauauanavavavananarararananavavavanbAawdududududDdFdududududDdFdududududDdFdududududDdFdududududDdFduenenenenendzdzdzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiajabababababababaDaDaDaDaDaDabeoepeqaDerabanauauauauauauauauauauauaueHauauauauauauauauauauauauauauanananananananananananananananapawduesetdudDeuduesetdudDevduesetdudDewduesetdudDexduesetdudDeyduezezenenezdzeAdzeAdzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiajabeBeCeDeEeFabeGababeKaDababababababababazauauauanayaMadadadadadadadcmaCaEaLaPaRaRaEaLaLaPaVauauanaqaqaqanananananananaqaqaqanbAcodueIeJfzdDeLdueIeJfzdDeLdueIeJfzdDeLdueIeJfzdDeLdueIeJfzdDeLdueMeMeneneMdzbzdzbzdzdzdzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiajabeOePePePePePePePabauauauauauauauauauauauauauauancncoadaRaZadaRaZadcpbiaRaRaRaRaRbjbnbnbobpauauanavavavanananananananavavavanatcedudududueQdududududueRdududududueSdududududueTdududududueUdudueMeMeneneVdzeWeWeWdzeXeWeXdzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababeYeZfafbePfcfdePabauauauauauauauauauauauauauauancqawadaRbqadaRbqadbTbnaRaRbiaRaRaRaRaRaRbpauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauaugVdzeVeVenenencNeWeWeWdceWeWeWfedzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababbFauadadadanaGaHaHaKanauauauancnawadbuadadbuadadaWbwaRbjbnaRaRaRaRaRaRbpauauauauauauauauauauauauauauauauauauaueHauauauauauauauauauauauauauauauauauauauauauauauauauauauauaudzffenenenffdzfgeWfhdzfieWfidzdzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddedeadaaadanaGaHaHaKanauauauancrctadaRaRaRaRaReNaRaRaRaRaRaRaRbKbKbKaRaRbsbtbvadanavavavanananavavavanadauaudZadbWcEcEcEbbdfbVcEcEcEbVbXaAhZauauaBaObBbCbCbCcGcHcIdjdpauaudzdzdzfjdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDbDbDbEbDbDbEbEbEbDdkdkaFbDgTananananananauauauanadadadadadadadadadbLclclclaRaRaRbKhibKaRaRbAbPbQananhjbehlanananhjbehlananauaubRadadadadhdhehehehfadadadadadadauaudmeaaneeaHaHefanaGaHdnauaudzfkflflflflflflflflflflfkdzfmfnfofodzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDbDbDbDbJaSaTbJaSaTbObOaXbDaUhGanaGaHaHaKanauauauanedecdsbRadcucRiLadcScScSddclaRaRbKbKbKaRaRbSawbTanananavanananananavanananauauananbrbhadcFdVgWcQcTadiCiwixiyadauaudoebaneeaHaHefananbmdtauaudzflflflflflflflflflflflfldzfmfpfpfofqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEaSaTbDbJaSaTbJaSaTbObObObDaUhGanaGaHaHaKanauauauanananananadhRaRaRaRaRaRaRddclaRaRaRaRaRaRaRbUawbPbtbVbtdfbVbWbXbtbVbXbVbYanauauauaucKcMadcVdThgdTcUadcWananizadauauanananananananananananauaudzflflflfrfsftfufvfwfxflfldzfmfpfpfofyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEbHbOhcbObObObObObObObObObDaUhGananananananauauauanananananfXaRaRaRaRcLcLaRddaRaRaRaRaRaRaRaRbZcacbcccdawawawbPcacbawawawbTanauauauaubraniianananananiiananananhCauaugodZanananananananangoauauhDflflflfAfBfBfCfBfBfDflflhFfmfpfEfFfyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEaSaTbDbJaSaTbJaSaTbObObObDaUhGancvcwcwcOanauauauanananananadcLaRaRaRaRaRaRddclaRaRaRaRaRaRaRbUawbPdgcgcedhcfcgcgchcfdicfcianauauauaubIcMadgXdWhhdWdXadiBananikadauauanananananananananananauaudzflflflfGfHfIfJfKfLfMflfldzfmfpfpfofyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDbDbDbDbJaSaTbJaSaTbOdCdCbDaUhGananananananauauauanebeadZbRadcLcPaYadijijijddclaRaRbKbKbKaRaRbAawbQanananavanananananavanananauauananbrdSadgYdYgZhahbadiAiGiIiFadauaugpedaneeaHaHefananaNgqauaudzflflflflflflflflflflflfldzfmfpfpfofNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDbDbDbEbDbDbEbEbEbDbDbDbDbDilanaGaHaHaKanauauauanadadadadadadadadadbLclclclaRaRaRbKhibKaRaRbSbPbTananbdhmbfanananbdhmbfananauaubRadadadadhdhehehehfadadadadadadauaugsecaneeaHaHefanaGaHdnauaudzfkflflflflflflflflflflfkdzfmfnfofodzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadanaGaHaHaKanauauauancnctadaRaRaRaRaRhMaRaRaRaRaRaRaRbKbKbKaRaRcjchckadanavavavanananavavavanadauaudZadcedrdrdrcgcfdqdrdrdrcgcegthZauaugugvgwgxgxgxgygzgAgBdwauaudzdzdzhzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOananananananauauauancsawadbuadadbuadadcxbiaRbjbnaRaRaRaRaRaRbpauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauauaudzfnfmfmfmfndziNfPfmfmfmfmdUeWeWeldzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOfOfOfRfShQfShSfSfUfOfVivfWfWfWfOanaGaHaHaKanauauauancsawadaRbqadaRbqadcybnaRaRbwaRaRaRaRaRaRbpauauauauauauauauauauauauauauauauauauaueHauauauauauauauauauauauauauauauauauauauauauauauauauauauaugVdzfmfpfpfpfmhTfmfmfmfmfmfYdzfgfZdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagbfOgcfSgdfSgdfSgcfOfVfSfSfSfSfOanaGaHaHaKanauauauancqcoadaRaZadaRaZadcpbwaRaRaRaRaRbjbnbnbobpauauananananananananananananananancCbtdudududugedududududugfdududududuggdududududughdududududugidudufmfpfpfpfmdzfmfmfmgjgkdzdzdzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagbfOfOfOfOhUfOfOfOfOfOhVfOfOfOfOfOfOfOfOfOazauauauanczcAadadadadadadadcBcXcYcZdaaRaRcYcZcZdadbauauananbMbNanananananananbMbNananbAcodugmeJfzdDeLdugmeJfzdDeLdugmeJfzdDeLdugmeJfzdDeLdugmeJfzdDeLdufmfpfpfpfmdzgngngngrgCdzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagbfOfVgDfOfSfSgEgdgFgGfSfSfSglfSfSfSfSfSfSanauauauauauauauauauauauauauauauauauauauauauauauauauauauanananananananananananananananapawduesetdudDgHduesetdudDgIduesetdudDgJduesetdudDgKduesetdudDgLdufmdRfQgMfmdzgNgOgPdzgQdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagbfOfVfShWfSfSfShXfSfSfSfSfSfOgRgSfSfSfShYanauauauauauauauauauauauaueHauauauauauauauauauauauauauauanavavavavanavavavanavavavavanbAawdududududDdFdududududDdFdududududDdFdududududDdFdududududDdFdufmhkgUhNfmdzdzdzgQdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOfOfOhnfSfOfShohphqfShrhshpfSfThrhtfSfShufOazanananananazanananananazadazanananananiHanananananandZbaaqaqaqaqbaaqaqaqbaaqaqaqaqbabUcodudFdDdDdDdDdudFdDdDdDdDdudFdDdDdDdDdudFdDdDdDdDdudFdDdDdDdDdufmfmiOfmfmdzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagbfOhnfSfOhvfVfShwfShrhshphxfOimgdhyfShufOadinioioioipadinioioioipadadadiqiriririsadiqiriririsadadadiqiririsadiqirisadiqiririsadbScDdudNdDdDdDdDdudNdDdDdDdDdudNdDdDdDdDdudNdDdDdDdDdudNdDdDdDdDduiJiMdzhAhBdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagbfOfOfOfOfOfOfOfOfSfSfSfShxfOfOfOfOfOfOfOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiqisdudDdDdEdFdGdudDdDdEdFdGdudDdDdEdFdGdudDdDdEdFdGdudDdDdEdFdGdudzdzdzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagbfOitiuhEibicfSfOfShHhIhJhKfOfOfOfOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadudvdxdxdxdydudvdxdxdxdydudvdxdxdxdydudvdxdxdxdydudvdxdxdxdydudzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagbfOfSfSfSfSfSfSidfShLfOfOfOfOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOfOfOieifhOigihfSfOfOfOfOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOfOfOfOfOfOfOfOfOfOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +"} diff --git a/sound/machines/roulette.ogg b/sound/machines/roulette.ogg new file mode 100644 index 0000000000..2a80d80299 Binary files /dev/null and b/sound/machines/roulette.ogg differ diff --git a/sound/machines/slotmachine.ogg b/sound/machines/slotmachine.ogg new file mode 100644 index 0000000000..366d985721 Binary files /dev/null and b/sound/machines/slotmachine.ogg differ diff --git a/sound/machines/slotmachine_pull.ogg b/sound/machines/slotmachine_pull.ogg new file mode 100644 index 0000000000..d97a815bf8 Binary files /dev/null and b/sound/machines/slotmachine_pull.ogg differ diff --git a/sound/rakshasa/Corrosion1.ogg b/sound/rakshasa/Corrosion1.ogg new file mode 100644 index 0000000000..912e535639 Binary files /dev/null and b/sound/rakshasa/Corrosion1.ogg differ diff --git a/sound/rakshasa/Corrosion2.ogg b/sound/rakshasa/Corrosion2.ogg new file mode 100644 index 0000000000..dfd24cc9d8 Binary files /dev/null and b/sound/rakshasa/Corrosion2.ogg differ diff --git a/sound/rakshasa/Corrosion3.ogg b/sound/rakshasa/Corrosion3.ogg new file mode 100644 index 0000000000..cef4bf5c2d Binary files /dev/null and b/sound/rakshasa/Corrosion3.ogg differ diff --git a/sound/rakshasa/Decay1.ogg b/sound/rakshasa/Decay1.ogg new file mode 100644 index 0000000000..e65a838e48 Binary files /dev/null and b/sound/rakshasa/Decay1.ogg differ diff --git a/sound/rakshasa/Decay2.ogg b/sound/rakshasa/Decay2.ogg new file mode 100644 index 0000000000..b1e0a10e2f Binary files /dev/null and b/sound/rakshasa/Decay2.ogg differ diff --git a/sound/rakshasa/Decay3.ogg b/sound/rakshasa/Decay3.ogg new file mode 100644 index 0000000000..cfe8b52925 Binary files /dev/null and b/sound/rakshasa/Decay3.ogg differ diff --git a/sound/rakshasa/Emerge0.ogg b/sound/rakshasa/Emerge0.ogg new file mode 100644 index 0000000000..bf665de908 Binary files /dev/null and b/sound/rakshasa/Emerge0.ogg differ diff --git a/sound/rakshasa/Laugh.ogg b/sound/rakshasa/Laugh.ogg new file mode 100644 index 0000000000..13b6bc8e5d Binary files /dev/null and b/sound/rakshasa/Laugh.ogg differ diff --git a/sound/rakshasa/No.ogg b/sound/rakshasa/No.ogg new file mode 100644 index 0000000000..1b835e46bc Binary files /dev/null and b/sound/rakshasa/No.ogg differ diff --git a/vorestation.dme b/vorestation.dme index ecc36faddd..da1fe9abab 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -660,6 +660,7 @@ #include "code\game\machinery\bomb_tester_vr.dm" #include "code\game\machinery\buttons.dm" #include "code\game\machinery\CableLayer.dm" +#include "code\game\machinery\casino.dm" #include "code\game\machinery\cell_charger.dm" #include "code\game\machinery\cloning.dm" #include "code\game\machinery\cryo.dm" @@ -1654,6 +1655,7 @@ #include "code\modules\economy\ATM.dm" #include "code\modules\economy\cash.dm" #include "code\modules\economy\cash_register.dm" +#include "code\modules\economy\casinocash.dm" #include "code\modules\economy\economy_misc.dm" #include "code\modules\economy\EFTPOS.dm" #include "code\modules\economy\Events.dm" @@ -1760,6 +1762,9 @@ #include "code\modules\gamemaster\actions\surprise_carp_attack.dm" #include "code\modules\gamemaster\actions\surprise_meteor.dm" #include "code\modules\gamemaster\actions\waste_disposal.dm" +#include "code\modules\games\cagse.dm" +#include "code\modules\games\cagse_black_cards.dm" +#include "code\modules\games\cagse_white_cards.dm" #include "code\modules\games\cah.dm" #include "code\modules\games\cah_black_cards.dm" #include "code\modules\games\cah_white_cards.dm" @@ -2218,6 +2223,7 @@ #include "code\modules\mob\living\simple_animal\animals\parrot.dm" #include "code\modules\mob\living\simple_animal\animals\penguin.dm" #include "code\modules\mob\living\simple_animal\animals\pike_vr.dm" +#include "code\modules\mob\living\simple_animal\animals\raccoon.dm" #include "code\modules\mob\living\simple_animal\animals\sculpture.dm" #include "code\modules\mob\living\simple_animal\animals\slime.dm" #include "code\modules\mob\living\simple_animal\animals\snake_vr.dm" @@ -2283,6 +2289,8 @@ #include "code\modules\mob\living\simple_animal\vore\shadekin\_defines.dm" #include "code\modules\mob\living\simple_animal\vore\shadekin\ability_objects.dm" #include "code\modules\mob\living\simple_animal\vore\shadekin\ability_procs.dm" +#include "code\modules\mob\living\simple_animal\vore\shadekin\rakshasa_abilities.dm" +#include "code\modules\mob\living\simple_animal\vore\shadekin\rakshasa_trap.dm" #include "code\modules\mob\living\simple_animal\vore\shadekin\shadekin.dm" #include "code\modules\mob\living\simple_animal\vore\shadekin\types.dm" #include "code\modules\mob\living\simple_animal\vore\shadekin\~defines.dm"