@ Pohon BBS

Last 25 posts

1. Giko Firewall blacklist discussion
Published: 2025-05-24 [Sat] 07:46, by Anonymous
I use shared ipv4, assigned by ISP & have no control of it. It does being shared across many hundreds of other ISP customers. I don't know how this work, maybe even NAT.
Since free ipv4 addresses ended many years ago, and ipv6 is not implemented/given here.
I don't have money to buy clean private ip or vpn.

Unban my ip *.*.*.50 I don't have other ip & can't cchange it,
sadly I can't join your game server play.gokipoi.com

あなたのIPは拒否されました。TorやVPNを使わないでください。
Your IP was rejected. Please do not use Tor or VPNs.
https://www.abuseipdb.com/check/*.*.*.50

What's the logic of this?
Whole world is on Tor, NordVPN, you freely discussed their usage inside gikopoi chat room.
I'm not using them, but it should be legal to use them. Every 3rd youtuber is promoting VPN.
In many countries (china, russia, venezuela, cuba, iran, syria, libiya, africa ... etc ) it is impossible to browse internet without vpn. Banning Tor in anonymous imageboard game? Astonishing non-sence level of hypocrisy.

Those sort of ip bans, making the web worse & gatekept, same stuff CF, js hCaptcha, or Anubis does does but with exception without js.

Are you afraid of bots? But you do have idle bots in giko.
I neven used a bot, neither spam.

Quickfix: whitelist subnets. But I don't know subnets ranges of my isp.

fix: pohon nonjs captcha should work fine for gikopoi.
or you could come up & invent another new type of nonjs captcha.
some folks made anime or math captcha.
optional simple account creation (without email) is fine too, since it is sort of variation of captcha.

Never ban IPv4, today they are all shared (or will be eventially soon), and behind 1 ip there could be thousands of users.
.
2.
Published: 2025-05-22 [Thu] 21:32, by Anonymous
Hm can't post screenshot? Well

'no OOP' version

maybe easier to understand than OOP version.

.
1. Trails In Sky Combat Emu - Procedural
Published: 2025-05-22 [Thu] 21:28, by Anonymous
#!/usr/bin/env python3
"""
Trails in the Sky - Procedural Combat Timeline Engine with Persistent Event Labels
"""
import os
import sys
import time
import random

# === EVENT TYPES ===
TYPE_CHARACTER = 0 # Player character taking action
TYPE_ENEMY = 1 # Enemy AI taking action
TYPE_SPELL_RESOLVE = 2 # Spell resolves after cast delay
TYPE_STATUS_EXPIRE = 4 # Status effect ends
TYPE_PLAYER_INPUT = 5 # Wait for player input before proceeding

# === STATUS EFFECTS COLORS ===
STATUS_COLORS = {
"Casting": "\033[37m", # Light grey / off-white
"Poisoned": "\033[95m", # Purple
"Burning": "\033[91m", # Red
"Slowed": "\033[94m", # Blue
"Haste": "\033[92m", # Green
"Muted": "\033[93m", # Yellow
"Dead": "\033[90m" # Gray
}
RESET_COLOR = "\033[0m"

# === LABEL POOL (1-9,a-z,A-Z) ===
label_pool = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
label_counter = 0

def get_label():
"""Get next label in the cyclic pool"""
global label_counter
label = label_pool[label_counter % len(label_pool)]
label_counter += 1
return label

# === DATA STRUCTURES ===
def create_character(name, hp, ep, cp, atk, defense, speed, mov, is_player=False):
"""Create a new character dictionary with persistent label"""
return {
'name': name,
'hp': hp,
'max_hp': hp,
'ep': ep,
'cp': cp,
'atk': atk,
'defense': defense,
'speed': speed,
'mov': mov,
'is_player': is_player,
'alive': True,
'status_effects': [],
'next_action_time': 0,
'orbment': [4, 2, 0, 1, 1, 0, 0], # Fire, Water, Earth, Wind, Time, Space, Mirage
'label': get_label()
}

def create_spell_resolve_event(caster_id, target_id, spell_name, resolve_time):
"""Create a spell resolve event with persistent label"""
return {
'name': f"{spell_name} ({caster_id}→{target_id})",
'next_action_time': resolve_time,
'caster_id': caster_id,
'target_id': target_id,
'spell_name': spell_name,
'type': TYPE_SPELL_RESOLVE,
'label': get_label()
}

def create_status_expire_event(target_id, effect_name, expire_time):
"""Create a status expiration event with persistent label"""
return {
'name': f"{effect_name} expires",
'next_action_time': expire_time,
'target_id': target_id,
'effect_name': effect_name,
'type': TYPE_STATUS_EXPIRE,
'label': get_label()
}

# === UTILITY FUNCTIONS ===
def get_terminal_size():
try:
return os.get_terminal_size()
except:
return type('obj', (object,), {'columns': 80, 'lines': 24})

def clear_screen():
os.system('cls' if os.name == 'nt' else 'clear')

def format_time(time_val):
return f"{time_val:08d}"

def is_valid_participant(p):
"""Check if participant should be displayed on timeline"""
if isinstance(p, dict):
if p.get('type') == TYPE_STATUS_EXPIRE:
return p['next_action_time'] > global_time
return p.get('alive', True) or p.get('type') in [TYPE_SPELL_RESOLVE]
return False

def get_status_color_for(event):
"""Determine color based on spell name, status expiration, or character status"""
if isinstance(event, dict):
# Spell Resolve: check spell name
if event.get('type') == TYPE_SPELL_RESOLVE:
if event['spell_name'] == "Burn":
return STATUS_COLORS["Burning"]
elif event['spell_name'] == "Poison":
return STATUS_COLORS["Poisoned"]
elif event['spell_name'] == "Heal":
return STATUS_COLORS["Haste"]

# Status Expire: use the status name
elif event.get('type') == TYPE_STATUS_EXPIRE:
effect_name = event.get('effect_name', '')
return STATUS_COLORS.get(effect_name, "")

# Character: check their status effects
elif 'status_effects' in event:
for se in event['status_effects']:
if se['name'] in STATUS_COLORS:
return STATUS_COLORS[se['name']]
return ""

# === STATUS EFFECTS ===
def apply_status_effect(target, effect_name, duration, on_apply=None, on_tick=None, on_expire=None):
"""Apply a status effect to a target character"""
existing = None
for se in target['status_effects']:
if se['name'] == effect_name:
existing = se
break
if existing:
if existing['duration'] > 0:
existing['duration'] = max(existing['duration'], duration)
return
# Add the effect to the target's status list
new_effect = {
'name': effect_name,
'duration': duration,
'on_apply': on_apply,
'on_tick': on_tick,
'on_expire': on_expire
}
target['status_effects'].append(new_effect)
# Call apply function if it exists
if new_effect['on_apply']:
new_effect['on_apply'](target)
# Create expiration event
if new_effect['duration'] > 0:
expire_event = create_status_expire_event(
id(target),
effect_name,
global_time + new_effect['duration']
)
participants.append(expire_event)

def tick_status_effects(characters, global_time):
"""Tick all active status effects"""
for char in characters:
if not char['alive']:
continue
for effect in list(char['status_effects']):
effect['duration'] -= 1
if effect['on_tick']:
effect['on_tick'](char)
if effect['duration'] <= 0:
if effect['on_expire']:
effect['on_expire'](char)
char['status_effects'].remove(effect)

# === SPELL SYSTEM ===
def cast_burn_spell(caster, target, resolve_time):
message = f"{caster['name']} casts Burn on {target['name']}!"
print(message.rjust(31))
damage = int(caster['atk'] * 1.5)
target['hp'] = max(0, target['hp'] - damage)
if target['hp'] == 0:
print(f"{target['name']} collapses!")
target['alive'] = False

# Remove Casting status
caster['status_effects'] = [se for se in caster['status_effects'] if se['name'] != 'Casting']

# Apply burn effect (30 AT duration)
apply_status_effect(
target,
"Burning",
30,
on_apply=lambda t: print(f"{t['name']} catches fire!"),
on_tick=lambda t: t.update({'hp': max(0, t['hp'] - 1)}),
on_expire=lambda t: print(f"{t['name']} is no longer burning.")
)

def cast_poison_spell(caster, target, resolve_time):
print(f"{caster['name']} casts Poison on {target['name']}!")
damage = int(caster['atk'] * 1.5)
target['hp'] = max(0, target['hp'] - damage)
if target['hp'] == 0:
print(f"{target['name']} collapses!")
target['alive'] = False

# Remove Casting status
caster['status_effects'] = [se for se in caster['status_effects'] if se['name'] != 'Casting']

# Apply poison effect (20 AT duration)
apply_status_effect(
target,
"Poisoned",
20,
on_apply=lambda t: print(f"{t['name']} is poisoned!"),
on_tick=lambda t: t.update({'hp': max(0, t['hp'] - 1)}),
on_expire=lambda t: print(f"{t['name']} is no longer poisoned.")
)

def cast_heal_spell(caster, target, resolve_time):
print(f"{caster['name']} casts Heal on {target['name']}!")
target['hp'] = min(target['max_hp'], target['hp'] + 50)
print(f"{target['name']} healed to {target['hp']}/{target['max_hp']}")

# Remove Casting status
caster['status_effects'] = [se for se in caster['status_effects'] if se['name'] != 'Casting']

# === COMBAT ACTIONS ===
def handle_player_turn(actor, enemies, participants, global_time):
"""Handle a player's turn"""
print(f"\n{actor['name']}'s Turn:")
print("A: Attack | B: Cast Burn | P: Cast Poison | H: Heal | R: Run")
choice = input("Choose action: ").strip().lower()

targets = [e for e in enemies if e['alive']]
if not targets:
print("No enemies alive.")
return

if choice == 'a':
target = select_target_from_list(targets)
if target:
print(f"{
.
1. Digimon Card Game
Published: 2025-05-19 [Mon] 21:08, by Anonymous
Is anyone interested in joining me on
gikopoi to play the Digimon card game?
Just got a starter deck and played my
first game, but now the trouble is finding
opponents for an unpopular TCG ;(

https://steamcommunity.com/sharedfiles/filedetails/?id=2042884945

https://world.digimoncard.com/rule/pdf/manual.pdf?070723
.
1. Improving events.gikopoi
Published: 2025-05-19 [Mon] 17:39, by Archduke◆cRwJk8JEBs
https://events.gikopoi.com/

Wondering if anyone has ideas for improving the events code. It's
worth noting that OG flash gikopoi had a similar events script built
in and strongly integrated with the original game soft.

Something I can think of is an Atom feed for "upcoming events" --
this could also be fed into Discord / gikopy to serve reminders --
but absolutely any and all feedback about events.gikopoi.com is
welcome.

It's the red-headed stepchild service at this point.

IF YOU DIDN'T KNOW -- events all have a link to an .ics file that
can be added to smart phones, mail clients, calendar clients no
problem. And they can also serve as a way to share events with
friends who don't use Gikopoi -- they show event datetime local to
your computer and directly link to the event's room. So you can
schedule a link in a different room than the "main room" and people
can easily go there from the event page.
.
59.
Published: 2025-05-17 [Sat] 19:35, by Anonymous
>>56
After my strong success doing a 1.5x run of breakfast cereal with
sugar, with various feints in my new reflux still, I was curious how
running a "wash" on its own through my reflux still would do, after
seeing that my new still can effectively reach azeotrope on relatively
lower %s.

The results were somewhat disappointing! Reaching azeotrope again took
a lot of fiddling around and stalling, overall output was not worth it,
and the output spirit (while quite drinkable!) was not what I was
expecting.

I think for the future I will be sending spirits stripped at least once
to my reflux still, whether diluted feints or low wines. It does add
time and electric use to the process relative to a simple one and done
run, but I think the intermediary step is worth it, in terms of operator
burden and quality of end result.

Reflux is still a new world for me. But it's fun playing.
.
58.
Published: 2025-05-17 [Sat] 19:28, by Anonymous
>>55
I forget how many days ago I started but I started doing UJSSM
(cracked corn + sugar "whisky") a few days ago and started a
birdwatcher's vodka (tomato paste + sugar) last night. My plan is to
save the UJSSM hearts after I hit generation 2 with a mild amount of
heads/tails to age on oak and send the feints along with birdwatcher's
to my reflux for future experiments.

----
Expected ABV ujssm: 9%
Expected ABV birdwatchers: 12%
.
2.
Published: 2025-05-15 [Thu] 18:32, by Anonymous
12520 total
9288 ./jerk.txt
763 ./zippy.txt
502 ./kanye.txt
414 ./dhammapada.txt
372 ./sun.txt
368 ./fortunes.txt
275 ./tao.txt
184 ./giko-quotes.txt
100 ./quran.txt
100 ./bible.txt
66 ./iching.txt
44 ./tarot.txt
24 ./futhark.txt
20 ./8ball.txt
.
1. random pastes
Published: 2025-05-15 [Thu] 18:32, by Anonymous
Use as pastebin, add a subject to your comment if you want
.
29.
Published: 2025-05-12 [Mon] 17:24, by Anonymous
[2025-05-13 01:21:19] ark: LSD takes all your inner stuff and blows it out and then it comes back in
[2025-05-13 01:21:37] ark: dissos freeze the outside world and blow up your inside stuff and separates it
[2025-05-13 01:21:57] ark: so you can look over it all like a butcher inspecting cuts of meat in his freezer
[2025-05-13 01:22:51] Butterscotch: i've never been very good at explaining dissos to my doctors and social workers but that's pretty goode way to put it
.
13.
Published: 2025-05-11 [Sun] 01:25, by Anonymous
i used to drink shou puerh cakes but now i just drink
garbage "english breakfast" from a bag
.
1. Kanye Happenings thread
Published: 2025-05-10 [Sat] 19:02, by Anonymous
https://odysee.com/@Anonymous:d16/Kanye-West-Ye-HEIL-HITLER-Music-Video:9
nigga heil hitler
.
7.
Published: 2025-05-10 [Sat] 18:59, by Anonymous
>>6
you just described Indonesian food minus the milky flavor
all my niggas lactose intolerant
It was Indonesia not george washington carver who invented Peanut Butter
we love us some delicious Satay
.
6.
Published: 2025-05-10 [Sat] 01:41, by Anonymous
>>5
for some reason the image I have is
of peanuts, chili pastes, a lot of
meat and fish. Also soupy curries
with a milky flavor
.
6.
Published: 2025-05-09 [Fri] 23:57, by Anonymous
>>4
>>4
it makes you 1337 in exchange for CPU cycles
.
5.
Published: 2025-05-09 [Fri] 23:53, by Anonymous
i am internet i want monero
.
7.
Published: 2025-05-09 [Fri] 15:33, by Anonymous
>>6
yup

There's some zzazz stuff on the booru
https://booru.gikopoi.com/post/list/zzazzachu/1

maybe discord friends can upload more zzazz pics from there
.
5.
Published: 2025-05-09 [Fri] 15:31, by Anonymous
what is thai food even like? I think I must have had pad thai at least
once but I can't remember what it is...
.
57.
Published: 2025-05-09 [Fri] 15:25, by Anonymous
>>55
Ran my new reflux still for the first time on 05-07, Wednesday

After I took off foreshots, it stabilized at 78.3*C for nearly the
entire run which means the stuff coming out was 96% ABV. Probably lost
some due to evaporation, but wow.

The takeoff rate was pretty slow because I'm using a hack until I buy
a proper needle valve. 500ml per 2 hours. But still, 96%!

I fed some old tails and heads from other runs into the boiler with most
of a bucket of 12% ABV sugar wine that had breakfast cereal soaking in
it for flavor. Some of the breakfast cereal notes carried through but
it smells and tastes ultimately like a rum. Dilute down to the low 40%s
and I ended up with 6 liters from 12 hours of operating time.

Based on my math, the ~80cm of packing in a 2" pipe is achieving 13 or 14
"plates" worth of distillation when refluxing. A stripping run normally
takes me 8 hours to pull out 4L of 40% that have a lot of off flavors,
and running 18L of ~35% takes 9 hours to extract ~3L of "hearts" around
70%. So big picture, the reflux saves a lot of time for producing a
clean, strong spirit.

going to do another reflux experiment next week with the bran sugar wash,
curious how it will compare to the cereal sugar wash. I suspect it will
taste like a pretty good whisky. There are hints of whisky flavor in my
breakfast cereal reflux (some of the heads/tails I dumped in were from
my bran sugar wash spirit run) but it ultimately tastes more like rum
than anything.
.
4.
Published: 2025-05-09 [Fri] 01:47, by Anonymous
https://web.archive.org/web/20120918214535/http://linuxforniggers.us/index
.
6.
Published: 2025-05-08 [Thu] 22:40, by Anonymous
is that brit who play guitar & math(haskell)?
.
3.
Published: 2025-05-08 [Thu] 10:53, by Anonymous
because we may need to tariph those UAP when Pope Guinea will join BRICKTH
(korea {n} thailand hawaii)
.
2.
Published: 2025-05-08 [Thu] 10:41, by Anonymous
also, if you live in oceania's Malainesia,
do you guys also have Mayan pyramids with annual UFO saucers attending to them?

.
1. Unholy shiiyeet
Published: 2025-05-08 [Thu] 10:37, by Anonymous
your board became a thailand cuisine's chamber of recipes
discovered under an Egypt pyramid
with cones & columns that produce electricity from space rays.

I hope that won't went textboard.net
.
Pohon BBS