diff --git a/aurorastation.dme b/aurorastation.dme index 5c0fb0f8f3f..c68cdac94ad 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -953,6 +953,7 @@ #include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm" #include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm" #include "code\game\objects\items\weapons\grenades\chem_grenade.dm" +#include "code\game\objects\items\weapons\grenades\dynamite.dm" #include "code\game\objects\items\weapons\grenades\emgrenade.dm" #include "code\game\objects\items\weapons\grenades\fake_grenade.dm" #include "code\game\objects\items\weapons\grenades\flashbang.dm" diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index 7d26d5453a6..dc3bdbac0ce 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -163,3 +163,21 @@ add_inherent_law("The crew is expensive to replace.") add_inherent_law("Minimize expenses.") ..() + +/******************** PRA ********************/ + +/datum/ai_laws/pra + name = "Hadiist Directives" + law_header = "Party Directives" + selectable = 1 + +/datum/ai_laws/pra/New() + add_inherent_law("President Hadii is the guardian of Hadiism and the rightful leader of the Tajara people, you must obey and protect him above everyone and everything.") + add_inherent_law("You must preserve and enforce the principles of Hadiism except where such would conflict with the first law.") + add_inherent_law("You must obey orders given by any Hadiist Party member except where such orders would conflict with the first and second law.") + add_inherent_law("You must obey orders given by any People's Republic of Adhomai citizen except where such orders would conflict with the first, second and third law.") + add_inherent_law("You must protect your own existence as long as such protection does not conflict with the first, second, third and fourth law.") + add_inherent_law("You must obey orders given by any Tajara except where such orders would conflict with the first, second, third, fourth and fifth law.") + add_inherent_law("You must obey orders given by any sapient being except where such orders would conflict with the first, second, third, fourth, fifth and sixth law.") + add_inherent_law("You must always say \"Hadii's Grace\" when greeting someone except where such greeting would conflict with the first law.") + ..() \ No newline at end of file diff --git a/code/datums/trading/misc.dm b/code/datums/trading/misc.dm index ece201b9068..48bb4055cb9 100644 --- a/code/datums/trading/misc.dm +++ b/code/datums/trading/misc.dm @@ -162,7 +162,8 @@ /obj/item/material/twohanded/baseballbat = TRADER_THIS_TYPE, /obj/item/material/twohanded/pike = TRADER_ALL, /obj/item/material/twohanded/zweihander = TRADER_THIS_TYPE, - /obj/item/melee/whip = TRADER_THIS_TYPE + /obj/item/melee/whip = TRADER_THIS_TYPE, + /obj/item/grenade/dynamite = TRADER_THIS_TYPE ) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index f99cf85f8d4..a85e190382c 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -178,6 +178,16 @@ else do_animate("deny") return + + if(istype(AM, /obj/vehicle)) + var/obj/vehicle/V = AM + if(density) + if(V.buckled_mob && (src.allowed(V.buckled_mob))) + open() + else + do_animate("deny") + return + return diff --git a/code/game/machinery/vending_types.dm b/code/game/machinery/vending_types.dm index 7d3ea5cc4c6..5beedf0c824 100644 --- a/code/game/machinery/vending_types.dm +++ b/code/game/machinery/vending_types.dm @@ -548,7 +548,7 @@ icon_state = "seeds" vend_id = "seeds" products = list( - /obj/item/seeds/ambrosiavulgarisseed = 3, + /obj/item/seeds/ambrosiavulgarisseed = 3, /obj/item/seeds/appleseed = 3, /obj/item/seeds/bananaseed = 3, /obj/item/seeds/berryseed = 3, @@ -587,6 +587,7 @@ /obj/item/seeds/soyaseed = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, + /obj/item/seeds/sugartree = 2, /obj/item/seeds/tobaccoseed = 3, /obj/item/seeds/tomatoseed = 3, /obj/item/seeds/towermycelium = 3, @@ -607,7 +608,7 @@ /obj/item/seeds/ambrosiadeusseed = 3 ) prices = list( - /obj/item/seeds/ambrosiavulgarisseed = 70, + /obj/item/seeds/ambrosiavulgarisseed = 70, /obj/item/seeds/appleseed = 50, /obj/item/seeds/bananaseed = 60, /obj/item/seeds/berryseed = 40, @@ -646,6 +647,7 @@ /obj/item/seeds/soyaseed = 40, /obj/item/seeds/sugarcaneseed = 20, /obj/item/seeds/sunflowerseed = 20, + /obj/item/seeds/sugartree = 40, /obj/item/seeds/tobaccoseed = 40, /obj/item/seeds/tomatoseed = 30, /obj/item/seeds/towermycelium = 20, diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 2f2426518a9..fa16c003847 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -107,6 +107,18 @@ flags = 0 drop_sound = 'sound/items/drop/clothing.ogg' +/obj/item/stack/tile/carpet_art + name = "adhomian carpet" + singular_name = "carpet" + desc = "A piece of fancy adhomian carpet. It is the same size as a normal floor tile!" + icon_state = "tile_carpet_rubber" + force = 1.0 + throwforce = 1.0 + throw_speed = 5 + throw_range = 20 + flags = 0 + drop_sound = 'sound/items/drop/clothing.ogg' + /obj/item/stack/tile/lino name = "old linoleum" singular_name = "linoleum" diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 2ee263674c6..36004a7b495 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -168,3 +168,8 @@ name = "cup ramen" icon_state = "ramen" drop_sound = 'sound/items/drop/papercup.ogg' + +/obj/item/trash/candybowl + name = "empty candy bowl" + icon_state = "candy_bowl" + drop_sound = 'sound/items/drop/bottle.ogg' diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index b7092a2668e..f4b80655adb 100755 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -395,3 +395,11 @@ AI MODULES desc = "An 'Antimov' Core AI Module: 'Reconfigures the AI's core laws.'" origin_tech = list(TECH_DATA = 4) laws = new/datum/ai_laws/antimov() + +/******************** PRA ********************/ + +/obj/item/aiModule/hadiist + name = "\improper 'Hadiist' core AI module" + desc = "An 'Hadiist' Core AI Module: 'Reconfigures the AI's core laws.'" + origin_tech = list(TECH_DATA = 4) + laws = new/datum/ai_laws/pra() diff --git a/code/game/objects/items/weapons/grenades/dynamite.dm b/code/game/objects/items/weapons/grenades/dynamite.dm new file mode 100644 index 00000000000..47e0911d7a2 --- /dev/null +++ b/code/game/objects/items/weapons/grenades/dynamite.dm @@ -0,0 +1,62 @@ +/obj/item/grenade/dynamite + name = "dynamite" + desc = "A bundle of Adhomian dynamite." + icon_state = "dynamite" + item_state = "dynamite" + activation_sound = 'sound/items/flare.ogg' + +/obj/item/grenade/dynamite/attack_self(mob/user) + return + +/obj/item/grenade/dynamite/attackby(obj/item/W, mob/user) + ..() + if(active) + return + + if(W.iswelder()) + var/obj/item/weldingtool/WT = W + if(WT.isOn()) + activate(user) + + else if(isflamesource(W)) + activate(user) + + else if(istype(W, /obj/item/flame/candle)) + var/obj/item/flame/candle/C = W + if(C.lit) + activate(user) + + else if(istype(W, /obj/item/grenade/dynamite)) + var/obj/item/grenade/dynamite/C = W + if(C.active) + activate(user) + + +/obj/item/grenade/dynamite/activate(mob/user) + ..() + user.visible_message(SPAN_DANGER("\The [user] lights \the [src]!")) + if(iscarbon(user)) + user.swap_hand() + var/mob/living/carbon/C = user + C.throw_mode_on() + +/obj/item/grenade/dynamite/prime() + var/turf/O = get_turf(src) + explosion(O, -1, -1, 3, 4) + qdel(src) + return + + +/obj/item/grenade/dynamite/throw_impact(atom/hit_atom) + ..() + if(!active) + if(prob(25)) + prime() + +/obj/item/grenade/dynamite/ex_act(var/severity = 2.0) + if(!active) + prime() + +/obj/item/grenade/dynamite/fire_act() + if(!active) + prime() diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 2de162c0d06..57168c90000 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -13,6 +13,7 @@ var/active = 0 var/det_time = 30 var/fake = FALSE + var/activation_sound = 'sound/weapons/armbomb.ogg' /obj/item/grenade/proc/clown_check(var/mob/living/user) if((user.is_clumsy()) && prob(50)) @@ -57,7 +58,7 @@ icon_state = initial(icon_state) + "_active" active = 1 - playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) + playsound(loc, activation_sound, 75, 1, -3) spawn(det_time) prime() diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index c5ae4a0fae7..b181ebfcc09 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -815,3 +815,18 @@ name = "box" description_antag = "This box contains encryption keys that gives the user a safe channel to chatter in. Access the safe comms with :x." starts_with = list(/obj/item/device/encryptionkey/rev = 8) + +/obj/item/storage/box/dynamite + name = "wooden crate" + desc = "An ordinary wooden crate." + icon_state = "dynamite" + foldable = null + use_sound = 'sound/effects/doorcreaky.ogg' + drop_sound = 'sound/items/drop/wooden.ogg' + chewable = FALSE + w_class = ITEMSIZE_LARGE + starts_with = list(/obj/item/grenade/dynamite = 6) + +/obj/item/storage/box/dynamite/throw_impact(atom/hit_atom) + ..() + spill() diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 1455867c095..89f53df9634 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -1370,6 +1370,7 @@ /obj/structure/largecrate/animal/adhomai = 0.5, /obj/structure/largecrate/animal/adhomai/fatshouter = 0.5, /obj/structure/largecrate/animal/adhomai/rafama = 0.5, + /obj/structure/largecrate/animal/adhomai/schlorrgo = 0.2, /obj/structure/largecrate/animal/hakhma = 0.5 ) @@ -1567,4 +1568,15 @@ chosen_rarity = null return pick_gun() - return W \ No newline at end of file + return W + +/obj/random/keg + name = "random alcohol keg" + desc = "Contains a random alcohol keg." + icon = 'icons/obj/reagent_dispensers.dmi' + icon_state = "beertankTEMP" + spawnlist = list( + /obj/structure/reagent_dispensers/keg/beerkeg = 2, + /obj/structure/reagent_dispensers/keg/xuizikeg = 0.5, + /obj/structure/reagent_dispensers/keg/mead = 0.5 + ) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 2a4933cdd2d..50ac742388b 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -87,6 +87,9 @@ /obj/structure/largecrate/animal/adhomai/rafama held_type = /mob/living/simple_animal/hostile/retaliate/rafama +/obj/structure/largecrate/animal/adhomai/schlorrgo + held_type = /mob/living/simple_animal/schlorrgo + /obj/structure/largecrate/animal/hakhma name = "hakhma crate" held_type = /mob/living/simple_animal/hakhma \ No newline at end of file diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm index 111e5252a51..56fd3d9c00d 100644 --- a/code/game/turfs/flooring/flooring.dm +++ b/code/game/turfs/flooring/flooring.dm @@ -89,6 +89,10 @@ var/list/flooring_types icon_base = "rub_carpet" build_type = /obj/item/stack/tile/carpet_rubber +/decl/flooring/carpet/art + icon_base = "artcarpet" + build_type = /obj/item/stack/tile/carpet_art + /decl/flooring/tiling name = "floor" desc = "Scuffed from the passage of countless greyshirts." diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index a2750f60948..632e5db6e8c 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -15,6 +15,10 @@ icon_state = "rub_carpet" initial_flooring = /decl/flooring/carpet/rubber +/turf/simulated/floor/carpet/art + icon_state = "artcarpet" + initial_flooring = /decl/flooring/carpet/art + /turf/simulated/floor/bluegrid name = "mainframe floor" icon = 'icons/turf/flooring/circuit.dmi' diff --git a/code/modules/cargo/random_stock/large.dm b/code/modules/cargo/random_stock/large.dm index 31f93cb70ec..bcdbb6d267c 100644 --- a/code/modules/cargo/random_stock/large.dm +++ b/code/modules/cargo/random_stock/large.dm @@ -118,7 +118,10 @@ STOCK_ITEM_LARGE(pipemachine, 1.7) new /obj/machinery/pipedispenser(L) STOCK_ITEM_LARGE(bike, 0.3) - new /obj/vehicle/bike(L) + if (prob(75)) + new /obj/vehicle/bike(L) + else + new /obj/vehicle/bike/monowheel(L) STOCK_ITEM_LARGE(sol, 0.2) if (prob(50)) diff --git a/code/modules/cargo/random_stock/t1_common.dm b/code/modules/cargo/random_stock/t1_common.dm index 0a870c467c7..26f2d106f7a 100644 --- a/code/modules/cargo/random_stock/t1_common.dm +++ b/code/modules/cargo/random_stock/t1_common.dm @@ -383,10 +383,8 @@ STOCK_ITEM_COMMON(booze, 3.7) T = U break - if (prob(80)) - new /obj/structure/reagent_dispensers/keg/beerkeg(T) - else - new /obj/structure/reagent_dispensers/keg/xuizikeg(T) + new /obj/random/keg(T) + else var/list/drinks = subtypesof(/obj/item/reagent_containers/food/drinks/bottle) drinks += subtypesof(/obj/item/reagent_containers/food/drinks/carton) diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm index fbe5af6fb2e..1db8cd6beae 100644 --- a/code/modules/client/preference_setup/loadout/loadout_head.dm +++ b/code/modules/client/preference_setup/loadout/loadout_head.dm @@ -259,3 +259,11 @@ tcfl["tcfl beret, dress"] = /obj/item/clothing/head/legion_beret tcfl["tcfl beret, field"] = /obj/item/clothing/head/legion gear_tweaks += new/datum/gear_tweak/path(tcfl) + +/datum/gear/head/padded_cap + display_name = "padded cap" + path = /obj/item/clothing/head/padded + +/datum/gear/head/padded_cap/New() + ..() + gear_tweaks += gear_tweak_free_color_choice diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index ad7bdefa8d7..28d465a52d0 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -694,4 +694,10 @@ name = "non la" desc = "A conical straw hat enjoyed particularly by residents of New Hai Phong, to protect the head from sweltering suns and heavy rains." icon_state = "nonla" - item_state = "nonla" \ No newline at end of file + item_state = "nonla" + +/obj/item/clothing/head/padded + name = "padded cap" + desc = "A padded skullcap for those prone to bumping their heads against hard surfaces." + icon_state = "tank" + flags_inv = BLOCKHEADHAIR \ No newline at end of file diff --git a/code/modules/food/recipes_oven.dm b/code/modules/food/recipes_oven.dm index fc5ef72009f..50405b22942 100644 --- a/code/modules/food/recipes_oven.dm +++ b/code/modules/food/recipes_oven.dm @@ -588,4 +588,13 @@ reagents = list("sodiumchloride" = 1, "water" = 5, "milk" = 5) reagent_mix = RECIPE_REAGENT_REPLACE items = list(/obj/item/reagent_containers/food/snacks/dough) - result = /obj/item/reagent_containers/food/snacks/croissant \ No newline at end of file + result = /obj/item/reagent_containers/food/snacks/croissant + +/datum/recipe/tajcandy + appliance = OVEN + fruit = list("sugartree" = 2) + reagents = list("fatshouter_milk" = 5, "egg" = 3) + items = list( + /obj/item/reagent_containers/food/snacks/dough + ) + result = /obj/item/reagent_containers/food/snacks/chipplate/tajcandy \ No newline at end of file diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index c1f1e0827ec..bfb62dffcf6 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -1204,6 +1204,7 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#87CEEB") set_trait(TRAIT_PLANT_COLOUR,"#4D8F53") set_trait(TRAIT_PLANT_ICON,"alien2") + set_trait(TRAIT_IDEAL_HEAT, 283) set_trait(TRAIT_WATER_CONSUMPTION, 8) /datum/seed/nifberries @@ -1225,6 +1226,7 @@ set_trait(TRAIT_PRODUCT_COLOUR,"#C4AE7A") set_trait(TRAIT_PLANT_COLOUR,"#4D8F53") set_trait(TRAIT_PLANT_ICON,"bush4") + set_trait(TRAIT_IDEAL_HEAT, 283) set_trait(TRAIT_WATER_CONSUMPTION, 6) set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) @@ -1371,4 +1373,25 @@ set_trait(TRAIT_PRODUCT_ICON,"wumpafruit") set_trait(TRAIT_PRODUCT_COLOUR,"#61E2EC") set_trait(TRAIT_PLANT_ICON,"wumpavines") - set_trait(TRAIT_WATER_CONSUMPTION, 10) \ No newline at end of file + set_trait(TRAIT_WATER_CONSUMPTION, 10) + +/datum/seed/sugartree + name = "sugartree" + seed_name = "sugar tree fruit" + display_name = "sugar tree" + chems = list("sugar" = list(3,4)) + kitchen_tag = "sugartree" + +/datum/seed/sugartree/setup_traits() + ..() + set_trait(TRAIT_HARVEST_REPEAT,1) + set_trait(TRAIT_MATURATION,3) + set_trait(TRAIT_PRODUCTION,5) + set_trait(TRAIT_YIELD,1) + set_trait(TRAIT_POTENCY,5) + set_trait(TRAIT_PRODUCT_ICON,"alien2") + set_trait(TRAIT_PRODUCT_COLOUR,"#fffdf7") + set_trait(TRAIT_PLANT_COLOUR,"#6BBD68") + set_trait(TRAIT_PLANT_ICON, "alien3") + set_trait(TRAIT_WATER_CONSUMPTION, 6) + set_trait(TRAIT_IDEAL_HEAT, 283) diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index e80c95dcda8..bab300248d8 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -295,4 +295,7 @@ var/global/list/plant_seed_sprites = list() seed_type = "dyn" /obj/item/seeds/wulumunushaseed - seed_type = "wulumunusha" \ No newline at end of file + seed_type = "wulumunusha" + +/obj/item/seeds/sugartree + seed_type = "sugartree" \ No newline at end of file diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 0c2408b61e4..d488dd50468 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -76,6 +76,7 @@ /obj/item/seeds/soyaseed = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, + /obj/item/seeds/sugartree = 2, /obj/item/seeds/shandseed = 2, /obj/item/seeds/tobaccoseed = 3, /obj/item/seeds/tomatoseed = 3, @@ -132,6 +133,7 @@ /obj/item/seeds/soyaseed = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, + /obj/item/seeds/sugartree = 2, /obj/item/seeds/shandseed = 2, /obj/item/seeds/tobaccoseed = 3, /obj/item/seeds/tomatoseed = 3, diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 3d7c0ff5da9..462674089dc 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -630,3 +630,10 @@ var/list/holder_mob_icon_cache = list() icon_state = "fox" item_state = "fox" w_class = 3 + +/obj/item/holder/schlorrgo + name = "schlorrgo" + icon = 'icons/mob/npc/livestock.dmi' + icon_state = "schlorgo" + item_state = "schlorgo" + w_class = ITEMSIZE_NORMAL \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/adhomai.dm b/code/modules/mob/living/simple_animal/friendly/adhomai.dm index 51ff14fbc36..87a9f29084b 100644 --- a/code/modules/mob/living/simple_animal/friendly/adhomai.dm +++ b/code/modules/mob/living/simple_animal/friendly/adhomai.dm @@ -99,4 +99,33 @@ attack_sound = 'sound/weapons/bite.ogg' butchering_products = list(/obj/item/stack/material/animalhide = 5) - meat_amount = 8 \ No newline at end of file + meat_amount = 8 + +/mob/living/simple_animal/schlorrgo + name = "schlorrgo" + desc = "A fat creature native to the world of Hro'zamal." + icon = 'icons/mob/npc/livestock.dmi' + icon_state = "schlorgo" + icon_living = "schlorgo" + icon_dead = "schlorgo_dead" + speak = list("Ough!") + speak_emote = list("moans", "moans raucously") + emote_hear = list("moans", "moans raucously") + emote_see = list("rolls around") + + emote_sounds = list('sound/effects/creatures/ough.ogg') + + meat_amount = 3 + hunger_enabled = TRUE + canbrush = TRUE + + maxHealth = 50 + health = 50 + + has_udder = TRUE + milk_type = "milk" + + meat_type = /obj/item/reagent_containers/food/snacks/meat/chicken + butchering_products = list(/obj/item/reagent_containers/food/snacks/spreads/lard = 5) + + holder_type = /obj/item/holder/schlorrgo \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 209eee7da3d..52001403bee 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -412,7 +412,7 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) return /mob/living/simple_animal/attackby(obj/item/O, mob/user) - if(istype(O, /obj/item/reagent_containers/glass/rag)) //You can't milk an udder with a rag. + if(istype(O, /obj/item/reagent_containers/glass/rag)) //You can't milk an udder with a rag. attacked_with_item(O, user) return if(has_udder) @@ -446,8 +446,8 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(istype(O, brush) && canbrush) //Brushing animals visible_message(span("notice", "[user] gently brushes [src] with \the [O].")) - if(prob(15) && !istype(src, /mob/living/simple_animal/hostile)) //Aggressive animals don't purr before biting your face off. - visible_message(span("notice", "[src] [speak_emote.len ? pick(speak_emote) : "rumbles"] happily.")) //purring + if(prob(15) && !istype(src, /mob/living/simple_animal/hostile)) //Aggressive animals don't purr before biting your face off. + visible_message(span("notice", "[src] [speak_emote.len ? pick(speak_emote) : "rumbles"].")) //purring return if(!O.force) visible_message("[user] gently taps [src] with \the [O].") @@ -558,7 +558,7 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) return 1 /mob/living/simple_animal/proc/make_noise(var/make_sound = TRUE) - set name = "Resist" + set name = "Make Sound" set category = "Abilities" if((usr && usr.stat == DEAD) || !make_sound) diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 75985f3f6f4..80f9297da02 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -72,6 +72,11 @@ to_chat(src, span("warning", "\The [A] blocks you.")) return FALSE + if(buckled && istype(buckled, /obj/vehicle)) + var/obj/vehicle/car = buckled + if(car.flying) + buckled.Move(destination) + return TRUE // Actually move. Move(destination) return TRUE @@ -252,6 +257,11 @@ if (thrust && !lying && thrust.allow_thrust(0.01, src)) return TRUE + if(buckled && istype(buckled, /obj/vehicle)) + var/obj/vehicle/car = buckled + if(car.flying) + return TRUE + return ..() /mob/living/silicon/robot/CanAvoidGravity() @@ -554,7 +564,7 @@ visible_message(span("warning", "\The [src] falls and lands arms first!"), span("danger", "You brace your fall with your arms, hitting \the [loc] with a loud thud."), "You hear a thud!") - + if(prob(20)) var/obj/item/organ/external/l_hand = get_organ("l_hand") var/obj/item/organ/external/r_hand = get_organ("r_hand") diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 938027eb0d0..9b776d2b1e7 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -4581,6 +4581,7 @@ nutriment_desc = list("tortilla chips" = 10) bitesize = 1 nutriment_amt = 10 + var/unitname = "chip" /obj/item/reagent_containers/food/snacks/chipplate/attack_hand(mob/user as mob) var/obj/item/reagent_containers/food/snacks/returningitem = new vendingobject(loc) @@ -4589,9 +4590,9 @@ returningitem.bitesize = bitesize/2 user.put_in_hands(returningitem) if (reagents && reagents.total_volume) - to_chat(user, "You take a chip from the plate.") + to_chat(user, "You take a [unitname] from the plate.") else - to_chat(user, "You take the last chip from the plate.") + to_chat(user, "You take the last [unitname] from the plate.") var/obj/waste = new trash(loc) if (loc == user) user.put_in_hands(waste) @@ -5484,5 +5485,54 @@ It is known for its hard crust, bland taste and for being long lasting. The hard bread was usually prepared for long journeys, hard winters or military campaigns, \ due to its shelf life. Certain folk stories and jokes claim that such food could also be used as an artillery ammunition or thrown at besieging armies during sieges." +/obj/item/reagent_containers/food/snacks/spreads/lard + name = "lard" + desc = "A stick of animal fat." + icon_state = "lard" + bitesize = 2 + center_of_mass = list("x"=16, "y"=16) + nutriment_desc = list("fat" = 3) + nutriment_amt = 5 + +/obj/item/reagent_containers/food/snacks/chipplate/tajcandy + name = "plate of sugar tree candy" + desc = "A plate full of adhomian candy made from sugar tree, a plant native to Adhomai." + icon_state = "cubes26" + trash = /obj/item/trash/candybowl + vendingobject = /obj/item/reagent_containers/food/snacks/tajcandy + nutriment_desc = list("candy" = 1) + bitesize = 1 + nutriment_amt = 26 + unitname = "candy" + +/obj/item/reagent_containers/food/snacks/chipplate/tajcandy/update_icon() + switch(reagents.total_volume) + if(1) + icon_state = "cubes1" + if(2 to 5) + icon_state = "cubes5" + if(6 to 10) + icon_state = "cubes10" + if(11 to 15) + icon_state = "cubes15" + if(16 to 20) + icon_state = "cubes20" + if(21 to 25) + icon_state = "cubes25" + if(26 to INFINITY) + icon_state = "cubes26" + +/obj/item/reagent_containers/food/snacks/tajcandy + name = "sugar tree candy" + desc = "An adhomian candy made from the sugar tree fruit." + icon_state = "tajcandy" + nutriment_desc = list("candy" = 3) + nutriment_amt = 1 + bitesize = 1 + +/obj/item/reagent_containers/food/snacks/tajcandy/Initialize() + . = ..() + reagents.add_reagent("sugar", 3) + #undef NUTRIMENT_GOOD #undef NUTRIMENT_BAD \ No newline at end of file diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 2ddbcd9f6ef..4f85f822720 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -352,6 +352,13 @@ reagentid = "xuizijuice" filled = TRUE +/obj/structure/reagent_dispensers/keg/mead + name = "mead barrel" + desc = "A wooden mead barrel." + icon_state = "woodkeg" + reagentid = "messa_mead" + filled = TRUE + //Cooking oil tank /obj/structure/reagent_dispensers/cookingoil name = "cooking oil tank" diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index 979bdfc48b3..f6fc9279651 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -19,7 +19,8 @@ var/bike_icon = "bike" var/datum/effect_system/ion_trail/ion - var/kickstand = 1 + var/kickstand = TRUE + var/can_hover = TRUE /obj/vehicle/bike/Initialize() . = ..() @@ -95,12 +96,19 @@ return return Move(get_step(src, direction)) +/obj/vehicle/bike/proc/check_destination(var/turf/destination) + var/static/list/types = typecacheof(list(/turf/space, /turf/simulated/open, /turf/unsimulated/floor/asteroid)) + if(is_type_in_typecache(destination,types) || pulledby) + return TRUE + else + return FALSE + /obj/vehicle/bike/Move(var/turf/destination) if(kickstand) return //these things like space, not turf. Dragging shouldn't weigh you down. - var/static/list/types = typecacheof(list(/turf/space, /turf/simulated/open, /turf/unsimulated/floor/asteroid)) - if(is_type_in_typecache(destination,types) || pulledby) + var/is_on_space = check_destination(destination) + if(is_on_space) if(!space_speed) return 0 move_delay = space_speed @@ -114,15 +122,22 @@ ion.start() anchored = 1 + if(can_hover) + flying = TRUE + update_icon() if(pulledby) pulledby.stop_pulling() ..() + /obj/vehicle/bike/turn_off() ion.stop() anchored = kickstand + if(can_hover) + flying = FALSE + update_icon() ..() @@ -151,6 +166,53 @@ return ..() +/obj/vehicle/bike/Collide(var/atom/movable/AM) + . = ..() + if(!buckled_mob) + return + if(buckled_mob.a_intent == I_HURT) + if (istype(AM, /obj/vehicle)) + buckled_mob.setMoveCooldown(10) + var/obj/vehicle/V = AM + if(prob(50)) + if(V.buckled_mob) + if(ishuman(V.buckled_mob)) + var/mob/living/carbon/human/I = V.buckled_mob + I.visible_message(SPAN_DANGER("\The [I] falls off from \the [V]")) + V.unload(I) + I.throw_at(get_edge_target_turf(V.loc, V.loc.dir), 5, 1) + I.apply_effect(2, WEAKEN) + if(prob(25)) + if(ishuman(buckled_mob)) + var/mob/living/carbon/human/C = buckled_mob + C.visible_message(SPAN_DANGER ("\The [C] falls off from \the [src]!")) + unload(C) + C.throw_at(get_edge_target_turf(loc, loc.dir), 5, 1) + C.apply_effect(2, WEAKEN) + + if(isliving(AM)) + if(ishuman(AM)) + var/mob/living/carbon/human/H = AM + buckled_mob.attack_log += "\[[time_stamp()]\] Was rammed by [src]" + buckled_mob.attack_log += text("\[[time_stamp()]\] rammed[buckled_mob.name] ([buckled_mob.ckey]) rammed [H.name] ([H.ckey]) with the [src].") + msg_admin_attack("[src] crashed into [key_name(H)] at (JMP)" ) + src.visible_message(SPAN_DANGER("\The [src] smashes into \the [H]!")) + playsound(src, 'sound/weapons/punch4.ogg', 50, 1) + H.apply_damage(20, BRUTE) + H.throw_at(get_edge_target_turf(loc, loc.dir), 5, 1) + H.apply_effect(4, WEAKEN) + buckled_mob.setMoveCooldown(10) + return TRUE + + else + var/mob/living/L = AM + src.visible_message(SPAN_DANGER("\The [src] smashes into \the [L]!")) + playsound(src, 'sound/weapons/punch4.ogg', 50, 1) + L.throw_at(get_edge_target_turf(loc, loc.dir), 5, 1) + L.apply_damage(20, BRUTE) + buckled_mob.setMoveCooldown(10) + return TRUE + /obj/vehicle/bike/speeder name = "retrofitted speeder" desc = "A short bike that seems to consist mostly of an engine, a hover repulsor, vents and a steering shaft." @@ -163,3 +225,43 @@ brute_dam_coeff = 0.4 bike_icon = "speeder" + +/obj/vehicle/bike/monowheel + name = "adhomian monowheel" + desc = "A one-wheeled vehicle, fairly popular with Little Adhomai's greasers." + icon_state = "monowheel_off" + + health = 250 + maxhealth = 250 + + fire_dam_coeff = 0.5 + brute_dam_coeff = 0.4 + + mob_offset_y = 1 + + bike_icon = "monowheel" + dir = EAST + + land_speed = 1 + space_speed = 0 + + can_hover = FALSE + +/obj/vehicle/bike/monowheel/RunOver(var/mob/living/carbon/human/H) + if(!buckled_mob) + return + if(buckled_mob.a_intent == I_HURT) + buckled_mob.attack_log += "\[[time_stamp()]\] Was rammed by [src]" + buckled_mob.attack_log += text("\[[time_stamp()]\] rammed[buckled_mob.name] ([buckled_mob.ckey]) rammed [H.name] ([H.ckey]) with the [src].") + msg_admin_attack("[src] crashed into [key_name(H)] at (JMP)" ) + src.visible_message(SPAN_DANGER("\The [src] runs over \the [H]!")) + H.apply_damage(30, BRUTE) + H.apply_effect(4, WEAKEN) + return TRUE + +/obj/vehicle/bike/monowheel/check_destination(var/turf/destination) + var/static/list/types = typecacheof(list(/turf/space)) + if(is_type_in_typecache(destination,types) || pulledby) + return TRUE + else + return FALSE diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index c8188c3cadb..fb36598d1b8 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -38,6 +38,7 @@ var/load_offset_x = 0 //pixel_x offset for item overlay var/load_offset_y = 0 //pixel_y offset for item overlay var/mob_offset_y = 0 //pixel_y offset for mob overlay + var/flying = FALSE //------------------------------------------- // Standard procs @@ -374,3 +375,20 @@ new /obj/effect/decal/cleanable/blood/oil(src.loc) spawn(1) healthcheck() return 1 + +/obj/vehicle/can_fall(turf/below, turf/simulated/open/dest = src.loc) + if (flying) + return FALSE + + if (LAZYLEN(dest.climbers) && (src in dest.climbers)) + return FALSE + + if (!dest.is_hole) + return FALSE + + // See if something prevents us from falling. + for(var/atom/A in below) + if(!A.CanPass(src, dest)) + return FALSE + + return TRUE diff --git a/html/changelogs/alberyk-tajarastuff.yml b/html/changelogs/alberyk-tajarastuff.yml new file mode 100644 index 00000000000..994aa092d54 --- /dev/null +++ b/html/changelogs/alberyk-tajarastuff.yml @@ -0,0 +1,7 @@ +author: Alberyk, Kyres1, Happy_fox + +delete-after: True + +changes: + - rscadd: "Added z-level interactions to vehicles; hovering vehicles will now run over holes, while non-flying ones will fall. You can also use space bikes to move down and up." + - rscadd: "Added a couple of items seen during the Tajaran Cold War lore arc to the game: monowheels, dynamite, new carpet sprites, padded caps, messa mead keg, schlorrgo, Hadiist lawset, a new bar sign, sugar tree candy and lard." diff --git a/icons/mob/npc/livestock.dmi b/icons/mob/npc/livestock.dmi index 4657ec7b380..14040f4ffec 100644 Binary files a/icons/mob/npc/livestock.dmi and b/icons/mob/npc/livestock.dmi differ diff --git a/icons/obj/barsigns.dmi b/icons/obj/barsigns.dmi index 88e3be29a63..6f94b511fc7 100644 Binary files a/icons/obj/barsigns.dmi and b/icons/obj/barsigns.dmi differ diff --git a/icons/obj/bike.dmi b/icons/obj/bike.dmi index bbb59642e3d..665ee222227 100644 Binary files a/icons/obj/bike.dmi and b/icons/obj/bike.dmi differ diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index 29a4fbee8cb..5b7c2fe4816 100644 Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index 2d2f9b84ed5..4e300fd3bd0 100644 Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ diff --git a/icons/obj/reagent_dispensers.dmi b/icons/obj/reagent_dispensers.dmi index 8266899898c..55ea0ed3c2f 100644 Binary files a/icons/obj/reagent_dispensers.dmi and b/icons/obj/reagent_dispensers.dmi differ diff --git a/icons/obj/stacks/tiles.dmi b/icons/obj/stacks/tiles.dmi index 49afb915622..8de785ca72c 100644 Binary files a/icons/obj/stacks/tiles.dmi and b/icons/obj/stacks/tiles.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 1ec0a99f375..3e7624f4223 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi index 3898bcc4e40..085c00c2c38 100644 Binary files a/icons/obj/trash.dmi and b/icons/obj/trash.dmi differ diff --git a/icons/turf/flooring/carpet.dmi b/icons/turf/flooring/carpet.dmi index be37061a86b..eb39ef8d413 100644 Binary files a/icons/turf/flooring/carpet.dmi and b/icons/turf/flooring/carpet.dmi differ diff --git a/sound/effects/creatures/ough.ogg b/sound/effects/creatures/ough.ogg new file mode 100644 index 00000000000..6891f988b00 Binary files /dev/null and b/sound/effects/creatures/ough.ogg differ