To solve this optimization problem, we need to define the decision variables, objective function, and constraints.

Let's denote:
- $x$ as the number of regular games to stock,
- $y$ as the number of collector's edition games to stock.

The profit per regular game is $20, and per collector's edition game is $30. The store wants to maximize its total profit, which can be represented by the objective function:
\[ \text{Maximize:} \quad 20x + 30y \]

There are constraints based on the given information:
1. Each regular game costs $30, and each collector's edition game costs $50. The store wants to spend at most $4000.
\[ 30x + 50y \leq 4000 \]
2. The store can sell at most 100 video games of either type per month. This gives us two constraints:
\[ x \leq 100 \]
\[ y \leq 100 \]
3. Non-negativity constraints, since the number of games cannot be negative:
\[ x \geq 0 \]
\[ y \geq 0 \]

Given these conditions, we can now write the Gurobi code in Python to solve this linear programming problem:

```python
from gurobipy import *

# Create a new model
m = Model("Video_Game_Store")

# Define the decision variables
x = m.addVar(lb=0, vtype=GRB.INTEGER, name="regular_games")
y = m.addVar(lb=0, vtype=GRB.INTEGER, name="collectors_edition_games")

# Set the objective function
m.setObjective(20*x + 30*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(30*x + 50*y <= 4000, "budget_constraint")
m.addConstr(x <= 100, "regular_game_limit")
m.addConstr(y <= 100, "collectors_edition_limit")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Stock {x.x} regular games and {y.x} collector's edition games.")
    print(f"Maximum profit: ${20*x.x + 30*y.x}")
else:
    print("No optimal solution found.")
```