diff options
| author | KonAki <konaki@anokonaki.org> | 2026-10-16 07:08:55 +0800 |
|---|---|---|
| committer | KonAki <konaki@anokonaki.org> | 2026-10-16 07:08:55 +0800 |
| commit | 1c1c2aa89920ffcf4d80a29c12a9999188adbaac (patch) | |
| tree | fcfac42e390af8b284924fa79615dddb008241a0 /kon/konrmfield.c | |
| parent | 85c684cefcb133ce5025f991077b2d9f9bc9ec64 (diff) | |
add random fights to rmfield
Diffstat (limited to 'kon/konrmfield.c')
| -rw-r--r-- | kon/konrmfield.c | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/kon/konrmfield.c b/kon/konrmfield.c index 92401de..f4c741d 100644 --- a/kon/konrmfield.c +++ b/kon/konrmfield.c @@ -51,6 +51,9 @@ static int roll(kon_rmField_t *field, int n) return n > 0 ? (int)(field->seed % (uint32_t)n) : 0; } +static void makeEncounterCount(kon_rmField_t *field); +static int canEncounter(const kon_rmField_t *field); + static int dirX(int dir) { return dir == 6 ? 1 : dir == 4 ? -1 : 0; @@ -466,6 +469,7 @@ int kon_rmFieldInit(kon_rmField_t *field, const kon_rmMap_t *map, const kon_rmTi chars[KON_RM_PLAYER].active = 1; chars[KON_RM_PLAYER].trigger = 0; kon_rmFieldRefresh(field); + makeEncounterCount(field); return 0; } @@ -565,7 +569,11 @@ void kon_rmFieldUpdate(kon_rmField_t *field) if (e->active && e->trigger == 3 && !field->busy) start(field, i); } - if (wasMoving && !moving(p) && !field->busy) startAt(field, p->x, p->y, 0x06, 0); + if (wasMoving && !moving(p) && !field->busy && startAt(field, p->x, p->y, 0x06, 0) == 0 && canEncounter(field)) { + int progress = kon_rmHasFlag(field->map, field->tileset, p->x, p->y, KON_RM_FLAG_BUSH) ? 4 : 2; + + field->encounterCount -= field->encounterHalf ? progress / 2 : progress; + } } /*** the player ***/ @@ -602,6 +610,58 @@ int kon_rmFieldAction(kon_rmField_t *field) return n > 0; } +/*** fights ***/ + +static void makeEncounterCount(kon_rmField_t *field) +{ + int n = field->map->encounterStep; + + if (n < 0) n = 0; + if (n > 100000) n = 100000; + field->encounterCount = (roll(field, n) + roll(field, n) + 1) * 2; +} + +static int canEncounter(const kon_rmField_t *field) +{ + return !field->encounterNone && !field->chars[KON_RM_PLAYER].routeForced; +} + +int kon_rmFieldEncounter(kon_rmField_t *field) +{ + const kon_rmMap_t *map; + long long sum = 0, value; + int i, region; + + if (!field || !field->chars || field->busy || field->encounterCount > 0) return 0; + map = field->map; + makeEncounterCount(field); + if (!canEncounter(field) || !map->encounters) return 0; + region = kon_rmRegion(map, field->chars[KON_RM_PLAYER].x, field->chars[KON_RM_PLAYER].y); + for (i = 0; i < map->encounterCount; i++) { + const kon_rmEncounter_t *e = &map->encounters[i]; + int k, inRegion = e->regionCount <= 0; + + for (k = 0; k < e->regionCount && e->regions; k++) { + if (e->regions[k] == region) inRegion = 1; + } + if (inRegion && e->weight > 0) sum += e->weight; + } + if (sum <= 0) return 0; + value = roll(field, sum > 2147483647 ? 2147483647 : (int)sum); + for (i = 0; i < map->encounterCount; i++) { + const kon_rmEncounter_t *e = &map->encounters[i]; + int k, inRegion = e->regionCount <= 0; + + for (k = 0; k < e->regionCount && e->regions; k++) { + if (e->regions[k] == region) inRegion = 1; + } + if (!inRegion || e->weight <= 0) continue; + value -= e->weight; + if (value < 0) return e->troopId > 0 ? e->troopId : 0; + } + return 0; +} + /*** events that start ***/ int kon_rmFieldNextStart(kon_rmField_t *field, int *eventId, int *pageIndex) |
