diff --git a/.gitignore b/.gitignore index 296523d8..4a0a8098 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,9 @@ steam/ subprojects/*/ build_dbg/ modules/ +sdk/ +artifacts/ +discord_social_sdk/ +discord_partner_sdk/ +steam_api64.dll +subprojects/.wraplock diff --git a/AGENTS.md b/AGENTS.md index 0cc33649..a1e66e18 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -23,6 +23,7 @@ - **Comments**: Focus on "why", keep lines to ~100 columns ### Cell Language Style (JavaScript-like) +- **Language**: Cell resembles JavaScript but has key differences - equality operators (`==`, `!=`) perform strict comparisons (equivalent to `===`, `!==` in JavaScript, no type coercion) - **Indentation**: 2 spaces - **Declarations**: `def` for constants, `var` for block-scoped variables (like `let`) - **Equality**: Use `==` only (strict equality, no coercion) diff --git a/Makefile b/Makefile index d54c387e..22b97c04 100755 --- a/Makefile +++ b/Makefile @@ -1,7 +1,6 @@ debug: FORCE meson setup build_dbg -Dbuildtype=debugoptimized meson install --only-changed -C build_dbg - cp build_dbg/cell . && chmod +x cell fast: FORCE meson setup build_fast diff --git a/prosperon/camera.cm b/prosperon/camera.cm index a18f0ad7..6e6f2a17 100644 --- a/prosperon/camera.cm +++ b/prosperon/camera.cm @@ -83,14 +83,11 @@ function mode_rect(src,dst,mode = "stretch") return out; } -// If camera viewport is defined, will draw to the screen -// If target is defined, will render to a target, too cam.make = function() { var c = Object.create(basecam) c.transform = new transform c.transform.unit() - c.zoom = 1 c.size = [640,360] c.mode = 'keep' c.viewport = {x:0,y:0,width:1,height:1} diff --git a/prosperon/prosperon.cm b/prosperon/prosperon.cm index f60a8df9..727002db 100644 --- a/prosperon/prosperon.cm +++ b/prosperon/prosperon.cm @@ -26,10 +26,18 @@ function make_camera_pblob(camera) { def cw = camera.surface ? camera.surface.width : win_size.width; def ch = camera.surface ? camera.surface.height : win_size.height; - def zoom = camera.zoom || ch - - def world_h = zoom; - def world_w = zoom * cw / ch; + var world_w, world_h; + + if (camera.width && camera.aspect_ratio) { + // Use direct world dimensions if specified + world_w = camera.width; + world_h = camera.width / camera.aspect_ratio; + } else { + // Fallback to zoom-based calculation + def zoom = camera.zoom || ch; + world_h = zoom; + world_w = zoom * cw / ch; + } def l = camera.pos[0] - camera.anchor[0] * world_w; def b = camera.pos[1] - camera.anchor[1] * world_h; diff --git a/tests/steam.ce b/tests/steam.ce new file mode 100644 index 00000000..b5deb3da --- /dev/null +++ b/tests/steam.ce @@ -0,0 +1,115 @@ +var steam = use('steam') + +// Test Steam functionality +if (steam && steam.user) { + var isLoggedOn = steam.user.logged_on() + log.console("Steam user logged on:", isLoggedOn) + if (isLoggedOn) { + var userName = steam.friends.name() + var steamId = steam.user.steam_id() + var appId = steam.app.id() + log.console("Steam user name: '" + userName + "'") + log.console("Steam user ID: '" + steamId.toString() + "'") + log.console("Steam app ID: " + appId.toString()) + + // Request user stats for achievements + steam.stats.request() + + // Display online friends + log.console("\n=== ONLINE FRIENDS ===") + var friendCount = steam.friends.count(1) // EFriendFlagImmediate = 1 + if (friendCount > 0) { + for (var i = 0; i < friendCount; i++) { + var friend = steam.friends.get_friend(i, 1) + if (friend) { + var friendName = steam.friends.get_friend_persona_name(friend) + var friendState = steam.friends.get_friend_persona_state(friend) + // Only show online friends (state > 0) + if (friendState > 0) { + var stateNames = ["Offline", "Online", "Busy", "Away", "Snooze", "Looking to Trade", "Looking to Play"] + var stateName = stateNames[friendState] || "Unknown" + log.console(" " + friendName + " - " + stateName) + + // Check if friend is playing a game + var gameInfo = steam.friends.get_friend_game_played(friend) + if (gameInfo && gameInfo.game_id) { + var gameName = steam.friends.get_friend_rich_presence(friend, "steam_display") + if (gameName) { + log.console(" Playing: " + gameName) + } else { + log.console(" Playing game ID: " + gameInfo.game_id) + } + } + } + } + } + } else { + log.console(" No friends found or friends list not loaded yet") + } + + // Display achievement information + log.console("\n=== ACHIEVEMENTS ===") + var achievementCount = steam.achievement.count() + if (achievementCount > 0) { + log.console("Total achievements: " + achievementCount) + + for (var i = 0; i < achievementCount; i++) { + var achName = steam.achievement.name(i) + if (achName) { + var achieved = steam.achievement.get(achName) + var displayName = steam.achievement.get_display_attribute(achName, "name") + var description = steam.achievement.get_display_attribute(achName, "desc") + + if (achieved) { + var unlockInfo = steam.achievement.get_and_unlock_time(achName) + if (unlockInfo) { + var unlockDate = new Date(unlockInfo.unlock_time * 1000) + log.console(" ✓ " + (displayName || achName) + " - Unlocked " + unlockDate.toLocaleDateString()) + } else { + log.console(" ✓ " + (displayName || achName) + " - Unlocked") + } + } else { + // Check for progress on this achievement + var progressInt = steam.achievement.get_progress_limits_int(achName) + var progressFloat = steam.achievement.get_progress_limits_float(achName) + + var progressText = "" + if (progressInt && progressInt.max_progress > 0) { + progressText = " (Progress: " + progressInt.min_progress + "/" + progressInt.max_progress + ")" + } else if (progressFloat && progressFloat.max_progress > 0) { + progressText = " (Progress: " + progressFloat.min_progress.toFixed(1) + "/" + progressFloat.max_progress.toFixed(1) + ")" + } + + log.console(" ✗ " + (displayName || achName) + progressText) + if (description) { + log.console(" " + description) + } + } + } + } + + // Show global achievement stats if available + steam.stats.request_global_achievement_percentages() + + // Get most achieved achievement info + var mostAchieved = steam.achievement.get_most_achieved_info() + if (mostAchieved) { + log.console("\nMost achieved: " + mostAchieved.name + " (" + mostAchieved.percent.toFixed(1) + "% of players)") + } + } else { + log.console("No achievements found for this game") + } + + // Display user phone/security status + log.console("\n=== ACCOUNT SECURITY ===") + log.console("Phone verified: " + steam.user.is_phone_verified()) + log.console("Two-factor enabled: " + steam.user.is_two_factor_enabled()) + log.console("Behind NAT: " + steam.user.is_behind_nat()) + + // Display user level and badge info if available + var userLevel = steam.user.level() + if (userLevel > 0) { + log.console("Steam level: " + userLevel) + } + } +} \ No newline at end of file