278 lines
10 KiB
Plaintext
278 lines
10 KiB
Plaintext
// Map configuration
|
||
int MAP_SIZE = 35;
|
||
const int BASE_END = 4; // 0-4
|
||
const int GRASS_END = 19; // 5-19
|
||
const int GRAVEL_START = 20; // 20-34
|
||
const int GRAVEL_END = 34; // 20-34
|
||
|
||
// Expansion configuration
|
||
const int EXPANSION_SIZE = 30;
|
||
const int EXPANSION_CHANCE = 30; // 30% chance per hour before noon
|
||
int expanded_area_start = -1; // -1 means not expanded yet
|
||
int expanded_area_end = -1;
|
||
|
||
// Movement configuration
|
||
int movetime = 400; // Time between steps/movements
|
||
const int BASE_WALK_SPEED = 400;
|
||
const int MOCCASINS_WALK_SPEED = 360;
|
||
int walk_speed = BASE_WALK_SPEED;
|
||
int jump_speed = 170;
|
||
const int MAX_ITEM_STACK = 9;
|
||
const int POUCH_STACK_BONUS = 2;
|
||
const int BASE_STORAGE_MAX = 50;
|
||
const int BLESSING_HEAL_AMOUNT = 3;
|
||
const int BLESSING_BARRICADE_REPAIR = 20;
|
||
const int BLESSING_SPEED_DURATION = 300000;
|
||
const int BLESSING_RESIDENT_DURATION = 300000;
|
||
const int BLESSING_TRIGGER_CHANCE = 10;
|
||
const int BLESSING_WALK_SPEED = 320;
|
||
const int FISH_WEIGHT_MIN = 1;
|
||
const int FISH_WEIGHT_MAX = 30;
|
||
// Player sex constants
|
||
const int SEX_MALE = 0;
|
||
const int SEX_FEMALE = 1;
|
||
|
||
// Weapon damage
|
||
const int SPEAR_DAMAGE = 3;
|
||
const int AXE_DAMAGE = 4;
|
||
const int SLING_DAMAGE_MIN = 5;
|
||
const int SLING_DAMAGE_MAX = 8;
|
||
const int SLING_RANGE = 8;
|
||
|
||
// Bow settings
|
||
const int BOW_DAMAGE_MIN = 0;
|
||
const int BOW_DAMAGE_MAX = 10;
|
||
const int BOW_RANGE = 12;
|
||
const int BOW_DRAW_TIME_MS = 1000;
|
||
const int ARROW_FLIES_DURATION_MS = 230;
|
||
const int BOW_MISS_EXTRA_TILES = 3;
|
||
const int ARROWS_PER_CRAFT = 12;
|
||
const int ARROW_CAPACITY_PER_QUIVER = 12;
|
||
|
||
// Zombie settings
|
||
const int ZOMBIE_HEALTH = 12;
|
||
const int ZOMBIE_MAX_COUNT = 5;
|
||
const int ZOMBIE_MAX_COUNT_CAP = 12;
|
||
const int ZOMBIE_MOVE_INTERVAL = 1000;
|
||
const int ZOMBIE_ATTACK_INTERVAL = 1600;
|
||
const int ZOMBIE_DAMAGE_MIN = 4;
|
||
const int ZOMBIE_DAMAGE_MAX = 6;
|
||
const int ZOMBIE_GROAN_MIN_DELAY = 2000;
|
||
const int ZOMBIE_GROAN_MAX_DELAY = 3000;
|
||
const int ZOMBIE_FOOTSTEP_MAX_DISTANCE = 5;
|
||
const float ZOMBIE_SOUND_VOLUME_STEP = 3.0;
|
||
const int ZOMBIE_ATTACK_MAX_HEIGHT = 6;
|
||
|
||
// Undead resident settings (stronger than zombies)
|
||
const int UNDEAD_RESIDENT_HEALTH = 16;
|
||
const int UNDEAD_RESIDENT_DAMAGE_MIN = 5;
|
||
const int UNDEAD_RESIDENT_DAMAGE_MAX = 7;
|
||
|
||
// Wight settings (undead elite)
|
||
const int WIGHT_HEALTH = 40;
|
||
const int WIGHT_DAMAGE_MIN = 6;
|
||
const int WIGHT_DAMAGE_MAX = 8;
|
||
const int WIGHT_SPAWN_CHANCE_START = 5;
|
||
const int WIGHT_SPAWN_CHANCE_STEP = 5;
|
||
|
||
// Vampyr settings (undead abductor)
|
||
const int VAMPYR_HEALTH = 40;
|
||
const int VAMPYR_SPAWN_CHANCE_START = 5;
|
||
const int VAMPYR_SPAWN_CHANCE_STEP = 5;
|
||
const int VAMPYR_CAPTURE_CHANCE = 50;
|
||
const int VAMPYR_CAPTURE_INTERVAL = 1000;
|
||
|
||
// Boar settings
|
||
const int BOAR_HEALTH = 4;
|
||
const int BOAR_MAX_COUNT = 1;
|
||
const int BOAR_MOVE_INTERVAL_MIN = 800;
|
||
const int BOAR_MOVE_INTERVAL_MAX = 1500;
|
||
const int BOAR_ATTACK_INTERVAL = 1500;
|
||
const int BOAR_DAMAGE_MIN = 1;
|
||
const int BOAR_DAMAGE_MAX = 3;
|
||
const int BOAR_SOUND_MIN_DELAY = 3000;
|
||
const int BOAR_SOUND_MAX_DELAY = 6000;
|
||
const int BOAR_FOOTSTEP_MAX_DISTANCE = 5;
|
||
const float BOAR_SOUND_VOLUME_STEP = 3.0;
|
||
const int BOAR_SIGHT_RANGE = 4;
|
||
const int BOAR_CHARGE_SPEED = 500; // ms per tile when charging
|
||
const int BOAR_SPAWN_CHANCE_PER_HOUR = 30;
|
||
|
||
// Barricade configuration
|
||
const int BARRICADE_BASE_HEALTH = 40;
|
||
const int BARRICADE_MAX_HEALTH = 500;
|
||
const int BARRICADE_STICK_COST = 3;
|
||
const int BARRICADE_STICK_HEALTH = 10;
|
||
const int BARRICADE_VINE_COST = 5;
|
||
const int BARRICADE_VINE_HEALTH = 15;
|
||
const int BARRICADE_LOG_COST = 1;
|
||
const int BARRICADE_LOG_HEALTH = 30;
|
||
const int BARRICADE_STONE_COST = 5;
|
||
const int BARRICADE_STONE_HEALTH = 20;
|
||
|
||
// Building costs
|
||
const int STORAGE_LOG_COST = 6;
|
||
const int STORAGE_STONE_COST = 9;
|
||
const int STORAGE_VINE_COST = 8;
|
||
const int PASTURE_LOG_COST = 8;
|
||
const int PASTURE_VINE_COST = 20;
|
||
const int STABLE_LOG_COST = 10;
|
||
const int STABLE_STONE_COST = 15;
|
||
const int STABLE_VINE_COST = 10;
|
||
const int ALTAR_STONE_COST = 9;
|
||
const int ALTAR_STICK_COST = 3;
|
||
const int INCENSE_STICK_COST = 6;
|
||
const int INCENSE_VINE_COST = 2;
|
||
const int INCENSE_REED_COST = 1;
|
||
const int INCENSE_HOURS_PER_STICK = 4;
|
||
const double INCENSE_FAVOR_PER_HOUR = 0.3;
|
||
|
||
// Bandit settings
|
||
const int BANDIT_HEALTH = 4;
|
||
const int BANDIT_MAX_COUNT = 3;
|
||
const int BANDIT_MOVE_INTERVAL_MIN = 600;
|
||
const int BANDIT_MOVE_INTERVAL_MAX = 800;
|
||
const int BANDIT_ATTACK_INTERVAL = 1200;
|
||
const int BANDIT_DAMAGE_MIN = 1;
|
||
const int BANDIT_DAMAGE_MAX = 2;
|
||
const int BANDIT_ALERT_MIN_DELAY = 3000;
|
||
const int BANDIT_ALERT_MAX_DELAY = 5000;
|
||
const int BANDIT_FOOTSTEP_MAX_DISTANCE = 7;
|
||
const float BANDIT_SOUND_VOLUME_STEP = 3.0;
|
||
const int BANDIT_ATTACK_MAX_HEIGHT = 6;
|
||
const int INVASION_DURATION_HOURS = 1;
|
||
const int BANDIT_DETECTION_RADIUS = 5;
|
||
const int BANDIT_WANDER_DIRECTION_CHANGE_MIN = 3000;
|
||
const int BANDIT_WANDER_DIRECTION_CHANGE_MAX = 8000;
|
||
const int INVADER_SOUND_VARIANTS_MAX = 5;
|
||
|
||
// Audio ranges and volume falloff
|
||
// Formula: final_volume = start_volume - (volume_step × distance)
|
||
// Using 30 dB fade over range for gradual but noticeable falloff
|
||
const int AUDIO_TILE_SCALE = 10;
|
||
const float AUDIO_PAN_STEP = 2.0;
|
||
const float AUDIO_VOLUME_STEP = 3.0;
|
||
const int SNARE_SOUND_RANGE = 2;
|
||
const float SNARE_SOUND_VOLUME_STEP = 4.0; // More audible for locating snares
|
||
const float SNARE_SOUND_PAN_STEP = 4.0; // Stronger pan for direction
|
||
const int SNARE_COLLECT_RANGE = 1;
|
||
|
||
const int FIRE_SOUND_RANGE = 3;
|
||
const float FIRE_SOUND_VOLUME_STEP = 5.0; // 15 dB over 3 tiles (FIRE_SOUND_RANGE)
|
||
|
||
const int FIREPIT_SOUND_RANGE = 5;
|
||
const float FIREPIT_SOUND_VOLUME_STEP = 6.0; // 30 dB over 5 tiles
|
||
|
||
const int STREAM_SOUND_RANGE = 7;
|
||
const float STREAM_SOUND_VOLUME_STEP = 4.3; // 30 dB over 7 tiles
|
||
|
||
const float TREE_SOUND_VOLUME_STEP = 4.0; // Similar to snares for good audibility
|
||
const int TREE_SOUND_RANGE = 4;
|
||
const int TREE_MIN_DISTANCE = 10;
|
||
const int TREE_MAX_PER_AREA = 2;
|
||
|
||
const float RESIDENT_DEFENSE_VOLUME_STEP = 3.0; // Default volume for resident counter-attacks
|
||
const float PLAYER_WEAPON_SOUND_VOLUME_STEP = 3.0;
|
||
const int FLYING_CREATURE_FADE_OUT_DURATION = 1500; // ms
|
||
const float FLYING_CREATURE_FADE_OUT_MIN_VOLUME = -40.0; // dB
|
||
|
||
// Mountain configuration
|
||
const int MOUNTAIN_SIZE = 60;
|
||
const int MOUNTAIN_MIN_ELEVATION = 0;
|
||
const int MOUNTAIN_MAX_ELEVATION = 40;
|
||
const int MOUNTAIN_STEEP_THRESHOLD = 7;
|
||
const int MOUNTAIN_MAX_SLOPE = 20;
|
||
const int ROPE_CLIMB_SPEED = 1000;
|
||
const int MOUNTAIN_STREAM_SOUND_RANGE = 7;
|
||
const float MOUNTAIN_STREAM_VOLUME_STEP = 4.3; // 30 dB over 7 tiles
|
||
const int QUEST_MAX_ACTIVE = 4;
|
||
const int QUEST_CHANCE_PER_FAVOR = 10;
|
||
const int QUEST_MIN_CHANCE = 5;
|
||
const double QUEST_FAVOR_PER_POINT = 0.05;
|
||
const int QUEST_STONE_SCORE = 6;
|
||
const int QUEST_LOG_SCORE = 10;
|
||
const int QUEST_SKIN_SCORE = 14;
|
||
|
||
// Resident settings
|
||
const int MAX_RESIDENTS = 4; // Max residents per base (+ player = 5 total)
|
||
const int RESIDENT_WEAPON_BREAK_CHANCE = 10;
|
||
const int RESIDENT_SPEAR_DAMAGE = 2;
|
||
const int RESIDENT_SLING_DAMAGE_MIN = 3;
|
||
const int RESIDENT_SLING_DAMAGE_MAX = 5;
|
||
const int RESIDENT_SNARE_ESCAPE_CHANCE = 5; // 5% chance game escapes when resident retrieves
|
||
const int RESIDENT_SNARE_CHECK_CHANCE = 15; // 15% chance per hour to check snares
|
||
const int RESIDENT_FISHING_CHANCE = 6; // 6% chance per resident per hour to catch a fish
|
||
const int RESIDENT_SMOKE_FISH_CHANCE = 10; // 10% chance per hour to smoke a stored fish
|
||
const int RESIDENT_TOOL_BREAK_CHANCE = 2; // 2% chance tools break during resident use (fishing poles, knives, baskets)
|
||
|
||
// Goose settings
|
||
const int GOOSE_HEALTH = 1;
|
||
const int GOOSE_MOVE_INTERVAL_MIN = 800; // Faster movement
|
||
const int GOOSE_MOVE_INTERVAL_MAX = 2000;
|
||
const int GOOSE_FLYING_HEIGHT_MIN = 10;
|
||
const int GOOSE_FLYING_HEIGHT_MAX = 30;
|
||
const float GOOSE_SOUND_VOLUME_STEP = 3.0;
|
||
const int GOOSE_FLIGHT_SOUND_DELAY_MIN = 2000; // Honk more often
|
||
const int GOOSE_FLIGHT_SOUND_DELAY_MAX = 5000;
|
||
const int GOOSE_FALL_SPEED = 100; // ms per foot
|
||
const int GOOSE_FLY_AWAY_CHANCE = 0; // Chance out of 1000 per tick to fly away
|
||
const int GOOSE_MAX_DIST_FROM_WATER = 4; // How far they can wander from water
|
||
const int GOOSE_MAX_COUNT = 3;
|
||
const int GOOSE_HOURLY_SPAWN_CHANCE = 35; // Percent chance per hour to spawn a goose
|
||
const int GOOSE_SIGHT_RANGE = 0;
|
||
|
||
// Weather settings
|
||
const int WEATHER_FADE_DURATION = 8000; // 8 seconds for smooth audio transitions
|
||
const float WEATHER_MIN_VOLUME = -30.0;
|
||
const float WEATHER_MAX_VOLUME = 0.0;
|
||
const float RAIN_VOLUME_LIGHT = -18.0;
|
||
const float RAIN_VOLUME_MODERATE = -10.0;
|
||
const float RAIN_VOLUME_HEAVY = -3.0;
|
||
const int WIND_GUST_MIN_DELAY = 30000; // Min 30 seconds between gusts
|
||
const int WIND_GUST_MAX_DELAY = 60000; // Max 60 seconds between gusts
|
||
const int THUNDER_MIN_INTERVAL = 8000; // Min 8 seconds between thunder
|
||
const int THUNDER_MAX_INTERVAL = 35000; // Max 35 seconds between thunder
|
||
const int THUNDER_MOVEMENT_SPEED = 250; // ms per tile movement (faster roll across sky)
|
||
const float THUNDER_SOUND_VOLUME_STEP = 0.5; // Gentler volume falloff
|
||
const int THUNDER_SPAWN_DISTANCE_MIN = 0; // Min distance from player
|
||
const int THUNDER_SPAWN_DISTANCE_MAX = 20; // Max distance from player
|
||
const int CHANCE_CLEAR_TO_WINDY = 15;
|
||
const int CHANCE_CLEAR_TO_RAINY = 6;
|
||
const int CHANCE_CLEAR_TO_STORMY = 5;
|
||
const int CHANCE_WINDY_STAY = 55;
|
||
const int CHANCE_WINDY_TO_CLEAR = 25;
|
||
const int CHANCE_WINDY_TO_STORMY = 12;
|
||
const int CHANCE_RAINY_STAY = 40;
|
||
const int CHANCE_RAINY_TO_STORMY = 35;
|
||
const int CHANCE_STORMY_STAY = 40;
|
||
const int CHANCE_STORMY_TO_RAINY = 35;
|
||
|
||
// Weather States
|
||
const int WEATHER_CLEAR = 0;
|
||
const int WEATHER_WINDY = 1;
|
||
const int WEATHER_RAINY = 2;
|
||
const int WEATHER_STORMY = 3;
|
||
|
||
// Weather Intensity levels (0 = none, 1-3 = low/medium/high)
|
||
const int INTENSITY_NONE = 0;
|
||
const int INTENSITY_LOW = 1;
|
||
const int INTENSITY_MEDIUM = 2;
|
||
const int INTENSITY_HIGH = 3;
|
||
|
||
const string RAIN_SOUND = "sounds/nature/rain.ogg";
|
||
|
||
// Environment / Fall Damage
|
||
const int SAFE_FALL_HEIGHT = 10;
|
||
const int FALL_DAMAGE_MIN = 0;
|
||
const int FALL_DAMAGE_MAX = 4;
|
||
|
||
// Base Automation
|
||
const int RESIDENT_SLING_COOLDOWN = 4000; // 4 seconds between shots
|
||
const int RESIDENT_COLLECTION_CHANCE = 10; // 10% chance per basket per hour
|
||
const int RESIDENT_FORAGING_CHANCE = 50; // 50% chance per resident per attempt (daily)
|
||
|
||
// Utility functions
|
||
int abs(int value) {
|
||
return value < 0 ? -value : value;
|
||
}
|