1
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: update python to be in sync

+55 -47
+55 -47
visualizer.py
··· 22 22 # --- Physics constants (match VHDL exactly) --- 23 23 GRAVITY = 1 24 24 IMPULSE = 3 25 + SLAM_FORCE = 8 25 26 AIR_CONTROL = 2 26 27 JUMP_FORCE = 13 27 28 MAX_VEL_X = 32 ··· 132 133 133 134 # Holding W while bouncing: boost each ground contact 134 135 if keys_held['w'] and jump_pressed and on_ground: 135 - vy = (vy - 4) & MASK 136 + vy = (vy - JUMP_FORCE) & MASK 136 137 137 138 # S: slam (air only) 138 139 if keys_held['s'] and not on_ground: 139 - vy = (vy + IMPULSE) & MASK 140 + vy = (vy + SLAM_FORCE) & MASK 140 141 141 142 # A/D 142 143 if keys_held['a']: ··· 174 175 175 176 # Clamp Y 176 177 svy = to_signed(vy) 177 - if svy > 63: svy = 63 178 - elif svy < -64: svy = -64 178 + if svy > 80: svy = 80 179 + elif svy < -100: svy = -100 179 180 vy = to_unsigned(svy) 180 181 181 182 # Update position ··· 236 237 svx += (-svx) >> BOUNCE_SHIFT 237 238 vx = to_unsigned(svx) 238 239 239 - # --- Obstacle collisions --- 240 + # --- Obstacle collisions (entry-face detection using prev position) --- 241 + prev_top = char_y - SIZE 242 + prev_bot = char_y + SIZE 243 + prev_left = char_x - SIZE 244 + prev_right = char_x + SIZE 245 + 240 246 for (ol, ot, orr, ob) in OBSTACLES: 241 247 c_left = px - SIZE 242 248 c_right = px + SIZE ··· 244 250 c_bot = py + SIZE 245 251 246 252 if c_right >= ol and c_left <= orr and c_bot >= ot and c_top <= ob: 247 - # Compute overlap from velocity direction 248 - svx_now = to_signed(vx) 249 - svy_now = to_signed(vy) 250 - 251 - if svx_now >= 0: 252 - overlap_x = c_right - ol 253 - else: 254 - overlap_x = orr - c_left 255 - 256 - if svy_now >= 0: 257 - overlap_y = c_bot - ot 258 - else: 259 - overlap_y = ob - c_top 260 - 261 - if overlap_y <= overlap_x: 262 - # Vertical resolution 263 - if svy_now >= 0: # moving down 264 - py = ot - SIZE 265 - grounded = True 266 - else: # moving up 267 - py = ob + SIZE 253 + if prev_bot <= ot: 254 + # Entered from top 255 + py = ot - SIZE; grounded = True 268 256 bounced = True 269 - bounce_speed = abs(svy_now) 257 + bounce_speed = abs(to_signed(vy)) 270 258 vy = negate(vy) 271 259 svy = to_signed(vy) 272 - # Energy loss on magnitude 273 260 if abs(svy) > 1: 274 - svy_abs = abs(svy) 275 - loss = svy_abs >> BOUNCE_SHIFT 276 - if svy > 0: 277 - svy -= loss 278 - else: 279 - svy += loss 280 - if abs(svy) < 2: 281 - svy = 0 261 + loss = abs(svy) >> BOUNCE_SHIFT 262 + svy = svy - loss if svy > 0 else svy + loss 263 + if abs(svy) < 2: svy = 0 282 264 vy = to_unsigned(svy) 283 - else: 284 - # Horizontal resolution 285 - if svx_now >= 0: 286 - px = ol - SIZE 287 - else: 288 - px = orr + SIZE 265 + elif prev_top >= ob: 266 + # Entered from bottom 267 + py = ob + SIZE 268 + bounced = True 269 + vy = negate(vy) 270 + svy = to_signed(vy) 271 + if svy > 1: 272 + svy -= svy >> BOUNCE_SHIFT 273 + vy = to_unsigned(svy) 274 + elif prev_right <= ol: 275 + # Entered from left 276 + px = ol - SIZE 277 + bounced = True; bounce_wall = True 278 + bounce_speed = abs(to_signed(vx)) 279 + vx = negate(vx) 280 + svx = to_signed(vx) 281 + if svx > 1: svx -= svx >> BOUNCE_SHIFT 282 + elif svx < -1: svx += (-svx) >> BOUNCE_SHIFT 283 + vx = to_unsigned(svx) 284 + elif prev_left >= orr: 285 + # Entered from right 286 + px = orr + SIZE 289 287 bounced = True; bounce_wall = True 290 - bounce_speed = abs(svx_now) 288 + bounce_speed = abs(to_signed(vx)) 291 289 vx = negate(vx) 292 290 svx = to_signed(vx) 293 - if svx > 1: 294 - svx -= svx >> BOUNCE_SHIFT 295 - elif svx < -1: 296 - svx += (-svx) >> BOUNCE_SHIFT 291 + if svx > 1: svx -= svx >> BOUNCE_SHIFT 292 + elif svx < -1: svx += (-svx) >> BOUNCE_SHIFT 297 293 vx = to_unsigned(svx) 294 + else: 295 + # Corner/inside fallback 296 + svy_now = to_signed(vy) 297 + if svy_now >= 0: py = ot - SIZE; grounded = True 298 + else: py = ob + SIZE 299 + bounced = True 300 + vy = negate(vy) 301 + svy = to_signed(vy) 302 + if abs(svy) > 1: 303 + loss = abs(svy) >> BOUNCE_SHIFT 304 + svy = svy - loss if svy > 0 else svy + loss 305 + vy = to_unsigned(svy) 298 306 299 307 # Commit 300 308 char_x = px