summaryrefslogtreecommitdiff
path: root/kon/konrmfield.c
diff options
context:
space:
mode:
authorKonAki <konaki@anokonaki.org>2026-10-16 07:08:55 +0800
committerKonAki <konaki@anokonaki.org>2026-10-16 07:08:55 +0800
commit1c1c2aa89920ffcf4d80a29c12a9999188adbaac (patch)
treefcfac42e390af8b284924fa79615dddb008241a0 /kon/konrmfield.c
parent85c684cefcb133ce5025f991077b2d9f9bc9ec64 (diff)
add random fights to rmfield
Diffstat (limited to 'kon/konrmfield.c')
-rw-r--r--kon/konrmfield.c62
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)