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